@openziti/ziti-console-lib 0.12.1 → 0.12.2

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 (68) hide show
  1. package/assets/styles/global.scss +16 -1
  2. package/esm2022/lib/features/config-editor/config-editor.component.mjs +1 -1
  3. package/esm2022/lib/features/data-table/cells/table-cell-name/table-cell-name.component.mjs +3 -3
  4. package/esm2022/lib/features/data-table/data-table.component.mjs +36 -3
  5. package/esm2022/lib/features/json-view/json-view.component.mjs +6 -3
  6. package/esm2022/lib/features/no-items/no-items.component.mjs +3 -3
  7. package/esm2022/lib/features/projectable-forms/api-session/api-session-form.component.mjs +1 -1
  8. package/esm2022/lib/features/projectable-forms/auth-policy/auth-policy-form.component.mjs +1 -1
  9. package/esm2022/lib/features/projectable-forms/certificate-authority/certificate-authority-form.component.mjs +1 -1
  10. package/esm2022/lib/features/projectable-forms/config-type/config-type-form.component.mjs +1 -1
  11. package/esm2022/lib/features/projectable-forms/configuration/configuration-form.component.mjs +3 -3
  12. package/esm2022/lib/features/projectable-forms/edge-router/edge-router-form.component.mjs +1 -1
  13. package/esm2022/lib/features/projectable-forms/edge-router-policy/edge-router-policy-form.component.mjs +1 -1
  14. package/esm2022/lib/features/projectable-forms/identity/identity-form.component.mjs +3 -3
  15. package/esm2022/lib/features/projectable-forms/jwt-signer/jwt-signer-form.component.mjs +120 -30
  16. package/esm2022/lib/features/projectable-forms/posture-check/posture-check-form.component.mjs +1 -1
  17. package/esm2022/lib/features/projectable-forms/projectable-form.class.mjs +3 -2
  18. package/esm2022/lib/features/projectable-forms/service/service-form.component.mjs +1 -1
  19. package/esm2022/lib/features/projectable-forms/service-edge-router-policy/service-edge-router-policy-form.component.mjs +1 -1
  20. package/esm2022/lib/features/projectable-forms/service-policy/service-policy-form.component.mjs +1 -1
  21. package/esm2022/lib/features/projectable-forms/session/session-form.component.mjs +1 -1
  22. package/esm2022/lib/features/projectable-forms/terminator/terminator-form.component.mjs +1 -1
  23. package/esm2022/lib/features/projectable-forms/transit-router/transit-router-form.component.mjs +1 -1
  24. package/esm2022/lib/models/api-session.mjs +1 -1
  25. package/esm2022/lib/pages/api-sessions/api-sessions-page.component.mjs +3 -3
  26. package/esm2022/lib/pages/api-sessions/api-sessions-page.service.mjs +55 -17
  27. package/esm2022/lib/pages/callback/callback.component.mjs +156 -0
  28. package/esm2022/lib/pages/jwt-signers/jwt-signers-page.component.mjs +3 -3
  29. package/esm2022/lib/pages/sessions/sessions-page.component.mjs +3 -3
  30. package/esm2022/lib/pages/sessions/sessions-page.service.mjs +47 -18
  31. package/esm2022/lib/pages/terminators/terminators-page.component.mjs +3 -3
  32. package/esm2022/lib/pages/terminators/terminators-page.service.mjs +43 -3
  33. package/esm2022/lib/services/auth.service.mjs +7 -6
  34. package/esm2022/lib/services/login-service.class.mjs +15 -1
  35. package/esm2022/lib/services/validation.service.mjs +13 -2
  36. package/esm2022/lib/version.mjs +2 -2
  37. package/esm2022/lib/ziti-console-lib.module.mjs +9 -4
  38. package/esm2022/public-api.mjs +3 -1
  39. package/fesm2022/openziti-ziti-console-lib.mjs +497 -94
  40. package/fesm2022/openziti-ziti-console-lib.mjs.map +1 -1
  41. package/lib/features/data-table/data-table.component.d.ts.map +1 -1
  42. package/lib/features/json-view/json-view.component.d.ts +2 -1
  43. package/lib/features/json-view/json-view.component.d.ts.map +1 -1
  44. package/lib/features/projectable-forms/identity/identity-form.component.d.ts +1 -1
  45. package/lib/features/projectable-forms/identity/identity-form.component.d.ts.map +1 -1
  46. package/lib/features/projectable-forms/jwt-signer/jwt-signer-form.component.d.ts +14 -3
  47. package/lib/features/projectable-forms/jwt-signer/jwt-signer-form.component.d.ts.map +1 -1
  48. package/lib/features/projectable-forms/projectable-form.class.d.ts +1 -0
  49. package/lib/features/projectable-forms/projectable-form.class.d.ts.map +1 -1
  50. package/lib/models/api-session.d.ts +3 -2
  51. package/lib/models/api-session.d.ts.map +1 -1
  52. package/lib/pages/api-sessions/api-sessions-page.service.d.ts +1 -0
  53. package/lib/pages/api-sessions/api-sessions-page.service.d.ts.map +1 -1
  54. package/lib/pages/callback/callback.component.d.ts +22 -0
  55. package/lib/pages/callback/callback.component.d.ts.map +1 -0
  56. package/lib/pages/sessions/sessions-page.service.d.ts.map +1 -1
  57. package/lib/pages/terminators/terminators-page.service.d.ts.map +1 -1
  58. package/lib/services/auth.service.d.ts +1 -1
  59. package/lib/services/auth.service.d.ts.map +1 -1
  60. package/lib/services/login-service.class.d.ts +2 -0
  61. package/lib/services/login-service.class.d.ts.map +1 -1
  62. package/lib/services/validation.service.d.ts +4 -0
  63. package/lib/services/validation.service.d.ts.map +1 -1
  64. package/lib/ziti-console-lib.module.d.ts +19 -18
  65. package/lib/ziti-console-lib.module.d.ts.map +1 -1
  66. package/package.json +1 -1
  67. package/public-api.d.ts +2 -0
  68. package/public-api.d.ts.map +1 -1
@@ -653,6 +653,17 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
653
653
  }], ctorParameters: function () { return [{ type: i1$1.HttpBackend }, { type: GrowlerService }]; } });
654
654
 
655
655
  class ValidationService {
656
+ validateIdentity(identity) {
657
+ const errors = {};
658
+ if (isEmpty(identity.name)) {
659
+ errors['name'] = true;
660
+ }
661
+ if (isEmpty(identity.authPolicyId)) {
662
+ errors['authPolicyId'] = true;
663
+ }
664
+ const isValid = isEmpty(errors);
665
+ return { isValid, errors };
666
+ }
656
667
  getPortRanges(allowedPortRanges) {
657
668
  if (!allowedPortRanges) {
658
669
  return undefined;
@@ -889,6 +900,7 @@ let LoginServiceClass = class LoginServiceClass {
889
900
  this.certBasedAttempted = false;
890
901
  this.serviceUrl = '';
891
902
  this.loginInProgress = false;
903
+ this.callbackRoute = '/callback';
892
904
  }
893
905
  getHttpOptions() {
894
906
  const options = {
@@ -900,6 +912,18 @@ let LoginServiceClass = class LoginServiceClass {
900
912
  };
901
913
  return options;
902
914
  }
915
+ decodeJwt(token) {
916
+ if (isEmpty(token)) {
917
+ return {};
918
+ }
919
+ const parts = token.split('.');
920
+ if (parts.length !== 3) {
921
+ throw new Error('Invalid JWT token');
922
+ }
923
+ const payload = parts[1];
924
+ const decoded = atob(payload.replace(/-/g, '+').replace(/_/g, '/'));
925
+ return JSON.parse(decoded);
926
+ }
903
927
  };
904
928
  LoginServiceClass = __decorate([
905
929
  __param(1, Inject(SETTINGS_SERVICE))
@@ -3514,11 +3538,11 @@ class TableCellNameComponent {
3514
3538
  if (!result?.confirmed) {
3515
3539
  return;
3516
3540
  }
3517
- this.router.navigateByUrl(`${this.cellParams.pathRoot}/${this.item.id}`);
3541
+ this.router.navigateByUrl(`${this.cellParams.pathRoot}/${get(this.item, this.cellParams.itemProp, this.item.id)}`);
3518
3542
  });
3519
3543
  return;
3520
3544
  }
3521
- this.router.navigateByUrl(`${this.cellParams.pathRoot}/${this.item.id}`);
3545
+ this.router.navigateByUrl(`${this.cellParams.pathRoot}/${get(this.item, this.cellParams.itemProp, this.item.id)}`);
3522
3546
  }
3523
3547
  get cellText() {
3524
3548
  let val = get(this.item, this.cellParams?.colDef?.field);
@@ -7011,11 +7035,11 @@ class NoItemsComponent {
7011
7035
  this.clickEmit.emit();
7012
7036
  }
7013
7037
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NoItemsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
7014
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: NoItemsComponent, selector: "lib-no-items", inputs: { image: "image", typeName: "typeName", isEmpty: "isEmpty", hasAdd: "hasAdd", hiddenResults: "hiddenResults", isLoading: "isLoading" }, outputs: { clickEmit: "clickEmit", refresh: "refresh" }, usesOnChanges: true, ngImport: i0, template: "<div [hidden]=\"!isEmpty\" class=\"noarea\" id=\"NoArea\">\n <div (click)=\"iconClick()\">\n <div [ngStyle]=\"background\" class=\"icon\"></div>\n <div class=\"title\">\n This network currently has no {{ typeName }} to display.<br/><span [hidden]=\"!hasAdd\"\n >Tap on the <span class=\"addExample\"></span> to add one.</span\n >\n </div>\n </div>\n</div>\n", styles: [":host{display:flex;flex-direction:column;height:calc(100% - 12.5rem);width:100%;align-items:center;justify-content:center;position:relative}.addExample{display:inline-block;width:2.1875rem;height:2.1875rem;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 72 72%3B' version%3D'1.1' viewBox%3D'0 0 72 72' 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 %23E6ECED%3B stroke%3A %23658292%3B stroke-width%3A 3.5%3B stroke-linecap%3A round%3B stroke-linejoin%3A round%3B stroke-miterlimit%3A 10%3B %7D .st1 %7B fill%3A none%3B stroke%3A %23658292%3B stroke-width%3A 3.5%3B stroke-linecap%3A round%3B stroke-linejoin%3A round%3B stroke-miterlimit%3A 10%3B %7D%3C%2Fstyle%3E %3Ccircle class%3D'st0' cx%3D'35.5' cy%3D'35.5' r%3D'30.6'%2F%3E %3Cg%3E%09%3Cline class%3D'st1' x1%3D'22.2' x2%3D'48.9' y1%3D'35.1' y2%3D'35.1'%2F%3E%3C%2Fg%3E %3Cline class%3D'st1' x1%3D'35.6' x2%3D'35.6' y1%3D'48.4' y2%3D'21.8'%2F%3E%3C%2Fsvg%3E\");background-size:contain;background-repeat:no-repeat;margin-bottom:-.5rem}.addExample:hover{filter:brightness(90%);transition:.3s}.addExample:active{filter:brightness(80%);transform:scale(.97);transition:.3s}.noarea .icon{width:100%;height:15.625rem;background-position:center center;background-size:contain;position:relative;float:left;z-index:unset;left:unset;cursor:pointer;transition:.3s}@media only screen and (max-width: 715px){.addExample{width:1rem;height:1rem}}@media only screen and (max-width: 1500px){.noarea{transform:scale(.75)}}@media only screen and (max-width: 1250px){.noarea{transform:scale(.6)}}.hidden-results{margin-top:1.25rem}.hidden-results span{font-size:1.375rem;cursor:default}.hidden-results span a{cursor:pointer}.no-items-loader-container{position:absolute;width:100%;height:100%;left:0;top:0;background:#ffffff40;z-index:99999}::ng-deep .no-items-loader-container #Loading{position:absolute;width:100%;height:100%;z-index:9999;background:#fff3}.title{font-family:Open Sans;filter:unset;text-align:center;font-size:1.5rem;color:var(--tableText);text-transform:unset}\n"], dependencies: [{ kind: "directive", type: i1$4.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }] }); }
7038
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: NoItemsComponent, selector: "lib-no-items", inputs: { image: "image", typeName: "typeName", isEmpty: "isEmpty", hasAdd: "hasAdd", hiddenResults: "hiddenResults", isLoading: "isLoading" }, outputs: { clickEmit: "clickEmit", refresh: "refresh" }, usesOnChanges: true, ngImport: i0, template: "<div [hidden]=\"!isEmpty\" class=\"noarea\" id=\"NoArea\">\n <div (click)=\"iconClick()\">\n <div [ngStyle]=\"background\" class=\"icon\"></div>\n <div class=\"title\">\n This network currently has no {{ typeName }} to display.<br/>\n <span [hidden]=\"!hasAdd\"\n >Tap on the <span class=\"addExample\"></span> to add one.</span\n >\n </div>\n </div>\n</div>\n", styles: [":host{display:flex;flex-direction:column;height:calc(100% - 12.5rem);width:100%;align-items:center;justify-content:center;position:relative}.addExample{display:inline-block;width:2.1875rem;height:2.1875rem;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 72 72%3B' version%3D'1.1' viewBox%3D'0 0 72 72' 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 %23E6ECED%3B stroke%3A %23658292%3B stroke-width%3A 3.5%3B stroke-linecap%3A round%3B stroke-linejoin%3A round%3B stroke-miterlimit%3A 10%3B %7D .st1 %7B fill%3A none%3B stroke%3A %23658292%3B stroke-width%3A 3.5%3B stroke-linecap%3A round%3B stroke-linejoin%3A round%3B stroke-miterlimit%3A 10%3B %7D%3C%2Fstyle%3E %3Ccircle class%3D'st0' cx%3D'35.5' cy%3D'35.5' r%3D'30.6'%2F%3E %3Cg%3E%09%3Cline class%3D'st1' x1%3D'22.2' x2%3D'48.9' y1%3D'35.1' y2%3D'35.1'%2F%3E%3C%2Fg%3E %3Cline class%3D'st1' x1%3D'35.6' x2%3D'35.6' y1%3D'48.4' y2%3D'21.8'%2F%3E%3C%2Fsvg%3E\");background-size:contain;background-repeat:no-repeat;margin-bottom:-.5rem}.addExample:hover{filter:brightness(90%);transition:.3s}.addExample:active{filter:brightness(80%);transform:scale(.97);transition:.3s}.noarea .icon{width:100%;height:15.625rem;background-position:center center;background-size:contain;position:relative;float:left;z-index:unset;left:unset;cursor:pointer;transition:.3s}@media only screen and (max-width: 715px){.addExample{width:1rem;height:1rem}}@media only screen and (max-width: 1500px){.noarea{transform:scale(.75)}}@media only screen and (max-width: 1250px){.noarea{transform:scale(.6)}}.hidden-results{margin-top:1.25rem}.hidden-results span{font-size:1.375rem;cursor:default}.hidden-results span a{cursor:pointer}.no-items-loader-container{position:absolute;width:100%;height:100%;left:0;top:0;background:#ffffff40;z-index:99999}::ng-deep .no-items-loader-container #Loading{position:absolute;width:100%;height:100%;z-index:9999;background:#fff3}.title{font-family:Open Sans;filter:unset;text-align:center;font-size:1.5rem;color:var(--tableText);text-transform:unset}\n"], dependencies: [{ kind: "directive", type: i1$4.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }] }); }
7015
7039
  }
7016
7040
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NoItemsComponent, decorators: [{
7017
7041
  type: Component,
7018
- args: [{ selector: 'lib-no-items', template: "<div [hidden]=\"!isEmpty\" class=\"noarea\" id=\"NoArea\">\n <div (click)=\"iconClick()\">\n <div [ngStyle]=\"background\" class=\"icon\"></div>\n <div class=\"title\">\n This network currently has no {{ typeName }} to display.<br/><span [hidden]=\"!hasAdd\"\n >Tap on the <span class=\"addExample\"></span> to add one.</span\n >\n </div>\n </div>\n</div>\n", styles: [":host{display:flex;flex-direction:column;height:calc(100% - 12.5rem);width:100%;align-items:center;justify-content:center;position:relative}.addExample{display:inline-block;width:2.1875rem;height:2.1875rem;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 72 72%3B' version%3D'1.1' viewBox%3D'0 0 72 72' 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 %23E6ECED%3B stroke%3A %23658292%3B stroke-width%3A 3.5%3B stroke-linecap%3A round%3B stroke-linejoin%3A round%3B stroke-miterlimit%3A 10%3B %7D .st1 %7B fill%3A none%3B stroke%3A %23658292%3B stroke-width%3A 3.5%3B stroke-linecap%3A round%3B stroke-linejoin%3A round%3B stroke-miterlimit%3A 10%3B %7D%3C%2Fstyle%3E %3Ccircle class%3D'st0' cx%3D'35.5' cy%3D'35.5' r%3D'30.6'%2F%3E %3Cg%3E%09%3Cline class%3D'st1' x1%3D'22.2' x2%3D'48.9' y1%3D'35.1' y2%3D'35.1'%2F%3E%3C%2Fg%3E %3Cline class%3D'st1' x1%3D'35.6' x2%3D'35.6' y1%3D'48.4' y2%3D'21.8'%2F%3E%3C%2Fsvg%3E\");background-size:contain;background-repeat:no-repeat;margin-bottom:-.5rem}.addExample:hover{filter:brightness(90%);transition:.3s}.addExample:active{filter:brightness(80%);transform:scale(.97);transition:.3s}.noarea .icon{width:100%;height:15.625rem;background-position:center center;background-size:contain;position:relative;float:left;z-index:unset;left:unset;cursor:pointer;transition:.3s}@media only screen and (max-width: 715px){.addExample{width:1rem;height:1rem}}@media only screen and (max-width: 1500px){.noarea{transform:scale(.75)}}@media only screen and (max-width: 1250px){.noarea{transform:scale(.6)}}.hidden-results{margin-top:1.25rem}.hidden-results span{font-size:1.375rem;cursor:default}.hidden-results span a{cursor:pointer}.no-items-loader-container{position:absolute;width:100%;height:100%;left:0;top:0;background:#ffffff40;z-index:99999}::ng-deep .no-items-loader-container #Loading{position:absolute;width:100%;height:100%;z-index:9999;background:#fff3}.title{font-family:Open Sans;filter:unset;text-align:center;font-size:1.5rem;color:var(--tableText);text-transform:unset}\n"] }]
7042
+ args: [{ selector: 'lib-no-items', template: "<div [hidden]=\"!isEmpty\" class=\"noarea\" id=\"NoArea\">\n <div (click)=\"iconClick()\">\n <div [ngStyle]=\"background\" class=\"icon\"></div>\n <div class=\"title\">\n This network currently has no {{ typeName }} to display.<br/>\n <span [hidden]=\"!hasAdd\"\n >Tap on the <span class=\"addExample\"></span> to add one.</span\n >\n </div>\n </div>\n</div>\n", styles: [":host{display:flex;flex-direction:column;height:calc(100% - 12.5rem);width:100%;align-items:center;justify-content:center;position:relative}.addExample{display:inline-block;width:2.1875rem;height:2.1875rem;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 72 72%3B' version%3D'1.1' viewBox%3D'0 0 72 72' 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 %23E6ECED%3B stroke%3A %23658292%3B stroke-width%3A 3.5%3B stroke-linecap%3A round%3B stroke-linejoin%3A round%3B stroke-miterlimit%3A 10%3B %7D .st1 %7B fill%3A none%3B stroke%3A %23658292%3B stroke-width%3A 3.5%3B stroke-linecap%3A round%3B stroke-linejoin%3A round%3B stroke-miterlimit%3A 10%3B %7D%3C%2Fstyle%3E %3Ccircle class%3D'st0' cx%3D'35.5' cy%3D'35.5' r%3D'30.6'%2F%3E %3Cg%3E%09%3Cline class%3D'st1' x1%3D'22.2' x2%3D'48.9' y1%3D'35.1' y2%3D'35.1'%2F%3E%3C%2Fg%3E %3Cline class%3D'st1' x1%3D'35.6' x2%3D'35.6' y1%3D'48.4' y2%3D'21.8'%2F%3E%3C%2Fsvg%3E\");background-size:contain;background-repeat:no-repeat;margin-bottom:-.5rem}.addExample:hover{filter:brightness(90%);transition:.3s}.addExample:active{filter:brightness(80%);transform:scale(.97);transition:.3s}.noarea .icon{width:100%;height:15.625rem;background-position:center center;background-size:contain;position:relative;float:left;z-index:unset;left:unset;cursor:pointer;transition:.3s}@media only screen and (max-width: 715px){.addExample{width:1rem;height:1rem}}@media only screen and (max-width: 1500px){.noarea{transform:scale(.75)}}@media only screen and (max-width: 1250px){.noarea{transform:scale(.6)}}.hidden-results{margin-top:1.25rem}.hidden-results span{font-size:1.375rem;cursor:default}.hidden-results span a{cursor:pointer}.no-items-loader-container{position:absolute;width:100%;height:100%;left:0;top:0;background:#ffffff40;z-index:99999}::ng-deep .no-items-loader-container #Loading{position:absolute;width:100%;height:100%;z-index:9999;background:#fff3}.title{font-family:Open Sans;filter:unset;text-align:center;font-size:1.5rem;color:var(--tableText);text-transform:unset}\n"] }]
7019
7043
  }], ctorParameters: function () { return []; }, propDecorators: { image: [{
7020
7044
  type: Input
7021
7045
  }], typeName: [{
@@ -7936,9 +7960,24 @@ class DataTableComponent {
7936
7960
  }
7937
7961
  updateEntityTypeLabel() {
7938
7962
  switch (this.svc.tableId) {
7963
+ case 'api-sessions':
7964
+ this.entityTypeLabel = 'API Sessions';
7965
+ break;
7966
+ case 'auth-policies':
7967
+ this.entityTypeLabel = 'Auth Policies';
7968
+ break;
7969
+ case 'certificate-authorities':
7970
+ this.entityTypeLabel = 'Certificate Authorities';
7971
+ break;
7972
+ case 'ext-jwt-signers':
7973
+ this.entityTypeLabel = 'External JWT Signers';
7974
+ break;
7939
7975
  case 'identities':
7940
7976
  this.entityTypeLabel = 'Identities';
7941
7977
  break;
7978
+ case 'posture-checks':
7979
+ this.entityTypeLabel = 'Posture Checks';
7980
+ break;
7942
7981
  case 'edge-routers':
7943
7982
  this.entityTypeLabel = 'Edge Routers';
7944
7983
  break;
@@ -7948,6 +7987,9 @@ class DataTableComponent {
7948
7987
  case 'configurations':
7949
7988
  this.entityTypeLabel = 'Configs';
7950
7989
  break;
7990
+ case 'config-types':
7991
+ this.entityTypeLabel = 'Config Types';
7992
+ break;
7951
7993
  case 'service-policies':
7952
7994
  this.entityTypeLabel = 'Service Policies';
7953
7995
  break;
@@ -7957,6 +7999,15 @@ class DataTableComponent {
7957
7999
  case 'service-edge-router-policies':
7958
8000
  this.entityTypeLabel = 'Service Edge Router Policies';
7959
8001
  break;
8002
+ case 'sessions':
8003
+ this.entityTypeLabel = 'Sessions';
8004
+ break;
8005
+ case 'terminators':
8006
+ this.entityTypeLabel = 'Terminators';
8007
+ break;
8008
+ case 'transit-routers':
8009
+ this.entityTypeLabel = 'Transit Routers';
8010
+ break;
7960
8011
  }
7961
8012
  }
7962
8013
  setColumnVisibilityColumn(column, visible) {
@@ -8001,6 +8052,12 @@ class DataTableComponent {
8001
8052
  else if ((this.options.noSelect && this.options.noMenu)) {
8002
8053
  // Don't add any additional columns
8003
8054
  }
8055
+ else if ((this.options.noSelect && !this.options.noMenu)) {
8056
+ this.mergedColumnDefinitions.push(this.menuColumnDefinition);
8057
+ }
8058
+ else if (!this.options.noSelect && this.options.noMenu) {
8059
+ this.mergedColumnDefinitions.push(this.selectColumnDefinition);
8060
+ }
8004
8061
  else if (this._view !== 'upload') {
8005
8062
  this.mergedColumnDefinitions.splice(0, 0, this.selectColumnDefinition);
8006
8063
  this.mergedColumnDefinitions.push(this.menuColumnDefinition);
@@ -8089,11 +8146,11 @@ class DataTableComponent {
8089
8146
  }
8090
8147
  ;
8091
8148
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DataTableComponent, deps: [{ token: DataTableService }, { token: DataTableFilterService }], target: i0.ɵɵFactoryTarget.Component }); }
8092
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: DataTableComponent, selector: "lib-data-table", inputs: { rowData: "rowData", expandRowData: "expandRowData", collapseRowData: "collapseRowData", rowValidation: "rowValidation", isTimeSearchAvailable: "isTimeSearchAvailable", isLoading: "isLoading", tableId: "tableId", options: "options", validateService: "validateService", rowsToggled: "rowsToggled", tableRefreshCount: "tableRefreshCount", view: "view", serverSideDataSource: "serverSideDataSource", allowDownload: "allowDownload", startCount: "startCount", endCount: "endCount", totalCount: "totalCount", emptyMsg: "emptyMsg", filterApplied: "filterApplied", menuItems: "menuItems", headerActions: "headerActions", noItemsClass: "noItemsClass", entityTypeName: "entityTypeName", showNoItemsAdd: "showNoItemsAdd", currentPage: "currentPage", noItemsImage: "noItemsImage", rowHeight: "rowHeight", filterName: "filterName", filterColumn: "filterColumn", columnDefinitions: "columnDefinitions", refreshCount: "refreshCount" }, outputs: { actionRequested: "actionRequested", gridReady: "gridReady", dragStart: "dragStart", dragLeave: "dragLeave", pageChanged: "pageChanged" }, viewQueries: [{ propertyName: "calendar", first: true, predicate: ["calendar"], descendants: true }, { propertyName: "contextMenu", first: true, predicate: ["contextMenu"], descendants: true }, { propertyName: "tableContainer", first: true, predicate: ["tableContainer"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div #tableContainer class=\"data-table-container\" *ngIf=\"showTable;else nodata\">\n <lib-table-filter-bar\n [startCount]=\"startCount\"\n [endCount]=\"endCount\"\n [totalCount]=\"totalCount\"\n [currentPage]=\"currentPage\"\n [filterName]=\"filterName\"\n [filterColumn]=\"filterColumn\"\n ></lib-table-filter-bar>\n <lib-table-hidden-columns-bar\n *ngIf=\"gridRendered && showFilterBar\"\n [hiddenColumns]=\"hiddenColumns\"\n (columnVisibilityChanged)=\"columnVisibilityChanged($event)\"\n ></lib-table-hidden-columns-bar>\n <div (resize)=\"resizeGridColumnsDebounced($event)\" class=\"ziti-ag-grid\" id=\"ItemTable\">\n <ag-grid-angular\n #nfAgGrid\n [columnDefs]=\"mergedColumnDefinitions\"\n [components]=\"frameworkComponents\"\n [getDataPath]=\"svc.getDataPath\"\n [getRowId]=\"svc.getRowNodeId\"\n [gridOptions]=\"gridOptions\"\n [modules]=\"gridModules\"\n [rowData]=\"rowData\"\n [tooltipHideDelay]=\"20000\"\n [tooltipShowDelay]=\"0\"\n (gridReady)=\"onGridReady($event)\"\n class=\"ziti-ag-grid-table ag-theme-alpine rows\"\n id=\"ItemGrid\"\n >\n </ag-grid-angular>\n </div>\n <div\n [ngClass]=\"{ open: openHeaderMenu }\"\n [ngStyle]=\"{ left: menuLeft + 'px', top: menuTop + 'px' }\"\n class=\"tMenu action-menu header-menu\"\n id=\"HeaderActionMenu\"\n >\n <div (click)=\"resetTableColumns()\" class=\"tActionRow\" id=\"ResetTableButton\">Restore Default Table</div>\n <div\n *ngFor=\"let headerAction of headerActions\"\n (click)=\"actionRequested.emit({ action: headerAction.action })\"\n class=\"tActionRow\"\n id=\"ResetTableButton\"\n >\n {{headerAction.name || headerAction.label}}\n </div>\n </div>\n <div\n [ngClass]=\"{ open: openMenu }\"\n [ngStyle]=\"{ left: menuLeft + 'px', top: menuTop + 'px' }\"\n class=\"tMenu action-menu item-menu\"\n id=\"RowActionMenu\"\n #contextMenu\n >\n <div\n *ngFor=\"let menuItem of menuItems\"\n (click)=\"actionRequested.emit({ action: menuItem.action, item: selectedItem })\"\n [ngClass]=\"{'menu-item-hidden': hideMenuItem(menuItem, selectedItem) }\"\n class=\"tActionRow\"\n id=\"TableActionButton_{{menuItem.action}}\"\n >\n {{menuItem.name || menuItem.label}}\n </div>\n </div>\n <div\n (clickOutside)=\"closeHeaderFilter($event)\"\n [ngClass]=\"{ open: showFilterOptions }\"\n [ngStyle]=\"{ left: menuLeft + 'px', top: menuTop + 'px' }\"\n class=\"tMenu action-menu header-menu\"\n id=\"HeaderFilterOptions\"\n >\n <div (click)=\"applyFilter($event, filter)\" *ngFor=\"let filter of filterOptions\" class=\"tActionRow\" [ngClass]=\"{'has-icon': filter.icon}\" [id]=\"filter.columnId\">\n <span *ngIf=\"filter.bubbleClass\" [ngClass]=\"filter.bubbleClass\" class=\"bubble\">\n <svg *ngIf=\"filter.showLoader\" class=\"circular\" viewBox=\"25 25 50 50\">\n <circle\n class=\"path\"\n cx=\"50\"\n cy=\"50\"\n fill=\"none\"\n r=\"20\"\n stroke-miterlimit=\"10\"\n stroke-width=\"3\"\n ></circle>\n </svg>\n </span>\n <span *ngIf=\"filter.icon\" class=\"os-icon {{filter.icon}}\"></span>\n {{ filter.label }}\n </div>\n </div>\n</div>\n\n<div *ngIf=\"showDateTimePicker\" class=\"date-time-container data-table-date-time\" [ngStyle]=\"{ left: menuLeft + 'px', top: menuTop + 'px' }\" (clickOutside)=\"closeDateTime($event)\">\n <p-calendar\n [(ngModel)]=\"dateValue\"\n (onSelect)=\"setDateRangeFilter('custom')\"\n dateFormat=\"mm/dd/yy\"\n selectionMode=\"range\"\n placeholder=\"Select Time Range\"\n #calendar\n >\n <ng-template pTemplate=\"header\">\n <div class=\"filter-button-container\">\n <div\n class=\"toggleButton\"\n [ngClass]=\"{selected: selectedRange === 'hour'}\"\n (click)=\"setDateRangeFilter('hour')\"\n >\n Last Hour\n </div>\n <div\n class=\"toggleButton\"\n (click)=\"setDateRangeFilter('day')\"\n [ngClass]=\"{selected: selectedRange === 'day'}\"\n >\n Last Day\n </div>\n <div\n class=\"toggleButton\"\n (click)=\"setDateRangeFilter('week')\"\n [ngClass]=\"{selected: selectedRange === 'week'}\"\n >\n Last Week\n </div>\n <div\n class=\"toggleButton\"\n (click)=\"setDateRangeFilter('month')\"\n [ngClass]=\"{selected: selectedRange === 'month'}\"\n >\n Last Month\n </div>\n </div>\n </ng-template>\n </p-calendar>\n</div>\n\n<div *ngIf=\"showTagSelector\" class=\"tag-selector-container data-table-tag-selector\" [ngStyle]=\"{ left: menuLeft + 'px', top: menuTop + 'px' }\" (clickOutside)=\"closeTagSelector($event)\">\n <div class=\"buttonBall icon-close\" (click)=\"closeTagSelector($event)\"></div>\n <div class=\"tag-selector-label\">\n <span>Select an Attribute:</span>\n </div>\n <lib-tag-selector\n [focusOnInit]=\"true\"\n [availableRoleAttributes]=\"roleAttributes\"\n [availableNamedAttributes]=\"namedAttributes\"\n [(selectedRoleAttributes)]=\"selectedRoleAttributes\"\n [(selectedNamedAttributes)]=\"selectedNamedAttributes\"\n (selectedNamedAttributesChange)=\"tagSelectionChanged($event, false)\"\n (selectedRoleAttributesChange)=\"tagSelectionChanged($event, true)\"\n ></lib-tag-selector>\n</div>\n<ng-template #nodata>\n <lib-no-items\n (clickEmit)=\"openCreate()\"\n [image]=\"noItemsImage\"\n [isEmpty]=\"!rowData || rowData.length === 0\"\n [typeName]=\"this.entityTypeLabel\"\n ></lib-no-items>\n</ng-template>", styles: [".data-table-container{display:flex;position:relative;height:calc(100% - 5.625rem);width:100%;flex-direction:column}.data-table-container .ziti-ag-grid{position:relative;width:100%;height:100%;display:flex;clear:both;align-items:center;justify-content:center}.data-table-container .ziti-ag-grid .ziti-ag-grid-table{height:100%;width:100%}.data-table-container .tMenu.action-menu.header-menu,.data-table-container .tMenu.action-menu.item-menu{position:fixed;height:unset;width:12.5rem;transition-property:opacity}.data-table-container .tMenu.action-menu.header-menu .tActionRow,.data-table-container .tMenu.action-menu.item-menu .tActionRow{display:flex;color:var(--offWhite_ALWAYS)}.data-table-container .tMenu.action-menu.header-menu .tActionRow.menu-item-hidden,.data-table-container .tMenu.action-menu.item-menu .tActionRow.menu-item-hidden{display:none}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper{border:none}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-body-vertical-scroll-viewport{background-color:var(--formBackground)}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row{border:none;background-color:var(--formBackground);color:var(--text)}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.row-invalid{background-color:var(--invalid)!important}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.row-invalid.row-copied{background-color:var(--copiedRow)!important}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.row-copied{background-color:var(--copiedRow)!important}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.ag-row-selected{background-color:var(--formBackground)}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.ag-row-selected.ag-row-hover{background-color:#2196f31a}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.ag-row-odd{background:var(--white)}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.ag-row-odd.ag-row-selected{background-color:var(--shaded)}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.ag-row-odd.ag-row-selected.ag-row-hover{background-color:#2196f31a}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.ag-row-odd.ag-row-hover{background-color:#2196f31a}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.ag-row-hover{background-color:#2196f31a}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row .dots{right:1.5625rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.row-role-item .tCol{font-size:.8125rem;height:2.1875rem;line-height:2.1875rem;font-weight:600}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-cell{border:none}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-cell.ag-cell-value.ziti-table-cell-error{outline:.125rem var(--red) solid;outline-offset:-.1875rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-cell.ag-cell-value.ag-cell-inline-editing{width:100%;height:100%;padding-left:0}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-header-cell:focus:after{border:none}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-pinned-left-header{border:none}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-pinned-left-header .ag-icon-pin{margin-top:.9375rem;transform:rotate(-45deg)}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-pinned-left-header .ag-header-cell-text{cursor:default}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-pinned-left-header .ag-header-col-pin-button:hover .ag-icon-pin{animation-name:unpinColumn;animation-duration:.5s;animation-delay:.1s;animation-iteration-count:1;animation-fill-mode:forwards}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-header-col-pin-button:hover .ag-icon-pin{animation-name:pinColumn;animation-duration:.6s;animation-delay:.1s;animation-iteration-count:1;animation-fill-mode:forwards}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row-level-1 app-table-cell-resource-status app-resource-status{margin-left:2.5rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row-level-1 app-table-cell-resource-status app-resource-status .bubble{height:.6875rem;width:.6875rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row-level-1 app-table-cell-resource-status app-resource-status .bubble .circular{margin-left:2.5rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-icon-eye-slash{margin-top:.75rem;margin-right:.3125rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-icon-pin{margin-top:.75rem}@keyframes pinColumn{0%{transform:rotate(0);margin-top:.75rem}15%{transform:rotate(-10deg);margin-top:.75rem}30%{transform:rotate(-20deg);margin-top:.75rem}45%{transform:rotate(-30deg);margin-top:.8125rem}60%{transform:rotate(-40deg);margin-top:.875rem}75%{transform:rotate(-45deg);margin-top:.9375rem}to{transform:rotate(-45deg);margin-top:1rem}}@keyframes unpinColumn{0%{transform:rotate(-45deg);margin-top:.9375rem}15%{transform:rotate(-45deg);margin-top:.875rem}30%{transform:rotate(-45deg);margin-top:.8125rem}45%{transform:rotate(-40deg);margin-top:.75rem}60%{transform:rotate(-30deg);margin-top:.6875rem}75%{transform:rotate(-20deg);margin-top:.625rem}90%{transform:rotate(-10deg);margin-top:.5625rem}to{transform:rotate(0);margin-top:.5rem}}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-pinned-right-header{border:none}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .selectHeader{background-image:none}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .menuHeader{background-image:none}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-pinned-right-header .ag-header-row:after{height:0}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-horizontal-left-spacer{border:none}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-horizontal-right-spacer{border:none}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-header-cell-resize{margin-top:.125rem;border-left-color:#d4d9e2;border-right-color:#d4d9e2;border-left-width:.0625rem;border-right-width:.0625rem;border-left-style:solid;border-right-style:solid;width:.1875rem;height:.875rem;position:absolute;right:.125rem;top:1.1875rem;cursor:col-resize}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-header-cell-resize:after{display:none}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-header-cell-text{height:3rem;cursor:move;color:var(--text);line-height:3.4375rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-icon-menu{margin-top:.25rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-menu{margin-left:-2.8125rem;z-index:99999999}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-header-cell{padding-right:.3125rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-input-field-input{height:100%;margin-right:0;width:100%;box-shadow:0 0 .3125rem 0 var(--primary);border:solid .125rem var(--primary);overflow:visible}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-checkbox-input-wrapper .ag-input-field-input{border:none}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-header-viewport{box-sizing:border-box;border-bottom:.25rem solid var(--primary);background-color:var(--formBackground);padding-left:.25rem;line-height:3.4375rem;position:sticky!important;top:0;z-index:10;transition:all .15s linear;opacity:.97}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-cell-label-container{cursor:default}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-cell-label-container.nf-can-sort{cursor:pointer}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-header{background-color:var(--navigation);border-bottom:solid .0625rem;border-bottom-color:var(--navigation)}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-header-icon{color:var(--icon)}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-icon-pin{font-weight:800;margin-right:.3125rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-icon-menu{font-weight:800}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-icon-eye-slash{font-weight:800;color:var(--icon)}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-header-cell-resize{border-left-color:var(--stroke);border-right-color:var(--stroke);border-left-width:var(--inputBorderWidth);border-right-width:var(--inputBorderWidth);border-left-style:solid;border-right-style:solid;width:.3125rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-header-cell-resize:hover{border-left-color:var(--icon);border-right-color:var(--icon)}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-header-viewport,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-floating-top-viewport,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-body-viewport,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-center-cols-viewport,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-floating-bottom-viewport,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-body-horizontal-scroll-viewport,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-virtual-list-viewport{background-color:var(--navigation)}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-theme-alpine .ag-row{background-color:var(--navigation)}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .tSelect{left:1.25rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-pinned-left-shadow{box-shadow:.5rem 0 .3125rem -.25rem #dddd;z-index:40}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-pinned-right-shadow{box-shadow:-.5rem 0 .3125rem -.25rem #dddd;z-index:40}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-pinned-left-header .ag-header-row-column{border-bottom-style:solid;border-bottom-width:.25rem;border-bottom-color:var(--stroke)}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-pinned-right-header .ag-header-row-column{border-bottom-style:solid;border-bottom-width:.25rem;border-bottom-color:var(--stroke)}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-pinned-right-header .dots{right:.25rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-cell{-webkit-user-select:text;user-select:text}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-body-viewport .ag-cell{padding-left:1.25rem;text-align:left;line-height:3.0625rem!important}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-pinned-left-cols-container .ag-row{border-left:.25rem solid transparent}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-pinned-left-cols-container .ag-row-hover{border-left:.25rem solid var(--primary)}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-pinned-left-cols-container .tSelect{margin-left:-.25rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-cell-label-container .ag-header-col-hide-button,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-cell-label-container .ag-header-col-pin-button,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-cell-label-container .ag-header-col-filter-button{margin-top:.3125rem;opacity:0;transition:opacity .2s;height:2.5rem;cursor:pointer}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-cell-label-container .ag-header-col-hide-button.nf-ag-col-pinned,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-cell-label-container .ag-header-col-pin-button.nf-ag-col-pinned,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-cell-label-container .ag-header-col-filter-button.nf-ag-col-pinned{opacity:1}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-cell-label-container .ag-header-col-hide-button:hover .ag-icon-eye-slash,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-cell-label-container .ag-header-col-hide-button:hover .ag-icon-pin,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-cell-label-container .ag-header-col-hide-button:hover .ag-icon-filter,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-cell-label-container .ag-header-col-pin-button:hover .ag-icon-eye-slash,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-cell-label-container .ag-header-col-pin-button:hover .ag-icon-pin,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-cell-label-container .ag-header-col-pin-button:hover .ag-icon-filter,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-cell-label-container .ag-header-col-filter-button:hover .ag-icon-eye-slash,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-cell-label-container .ag-header-col-filter-button:hover .ag-icon-pin,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-cell-label-container .ag-header-col-filter-button:hover .ag-icon-filter{color:var(--ag-alpine-active-color, var(--primary))}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-cell-label-container .ag-header-col-hide-button .ag-icon-filter,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-cell-label-container .ag-header-col-pin-button .ag-icon-filter,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-cell-label-container .ag-header-col-filter-button .ag-icon-filter{font-weight:700;margin-top:.8125rem;margin-right:0rem;margin-left:-.0625rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-cell-label-container .ag-header-col-hide-button,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-cell-label-container .ag-header-col-pin-button{position:absolute;margin-top:.625rem!important}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-cell-label-container .ag-header-col-hide-button{margin-right:1.3125rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-cell-label-container:hover .ag-header-col-hide-button,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-cell-label-container:hover .ag-header-col-pin-button,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-cell-label-container:hover .ag-header-col-filter-button{position:relative;display:block;opacity:1}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-cell-label-container:hover .ag-header-col-hide-button{margin-right:0rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .tSelectHeader{top:.75rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-header-cell{padding-left:0rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-sort-descending-icon{margin-top:.9375rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .nf-ag-main-col .ag-cell-label-container{margin-left:-.5rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .nf-ag-main-col .ag-cell-label-container .ag-header-cell-text{padding-left:.1875rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ziti-ag-grid .ag-root-wrapper .ag-row.row-child{background-color:#fff;border-bottom:solid var(--stroke) .0625rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper app-table-column-default{width:100%}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper app-table-cell-registration{width:100%}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper app-table-cell-registration .tcol{width:100%}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.ag-row-even.row-child.row-child-odd,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.ag-row-odd.row-child.row-child-odd{background-color:var(--table)}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.ag-row-even.row-child.row-child-odd.row-role-item,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.ag-row-odd.row-child.row-child-odd.row-role-item{background-color:var(--shaded);border:none}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.ag-row-even.row-child.row-child-odd.row-role-item.ag-row-hover,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.ag-row-odd.row-child.row-child-odd.row-role-item.ag-row-hover{background-color:#2196f31a}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.ag-row-even.row-child.row-child-odd.row-child-second,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.ag-row-odd.row-child.row-child-odd.row-child-second{background-color:var(--shaded)}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.ag-row-even.row-child.row-child-odd.row-child-second.row-child-header,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.ag-row-odd.row-child.row-child-odd.row-child-second.row-child-header{background-color:var(--shaded)}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.ag-row-even.row-child.row-child-odd.row-child-warn,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.ag-row-odd.row-child.row-child-odd.row-child-warn{background-color:var(--copiedRow)}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.ag-row-even.row-child.row-child-odd.row-child-header,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.ag-row-odd.row-child.row-child-odd.row-child-header{background-color:var(--shaded)}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.ag-row-even.row-child.row-child-even,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.ag-row-odd.row-child.row-child-even{background-color:var(--shaded)}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.ag-row-even.row-child.row-child-even.row-role-item,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.ag-row-odd.row-child.row-child-even.row-role-item{background-color:var(--table);border:none}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.ag-row-even.row-child.row-child-even.row-role-item.ag-row-hover,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.ag-row-odd.row-child.row-child-even.row-role-item.ag-row-hover{background-color:#2196f31a}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.ag-row-even.row-child.row-child-even.row-child-second,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.ag-row-odd.row-child.row-child-even.row-child-second{background-color:var(--table)}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.ag-row-even.row-child.row-child-even.row-child-second.row-child-header,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.ag-row-odd.row-child.row-child-even.row-child-second.row-child-header{background-color:var(--table)}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.ag-row-even.row-child.row-child-even.row-child-warn,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.ag-row-odd.row-child.row-child-even.row-child-warn{background-color:var(--copiedRow)}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.ag-row-even.row-child.row-child-even.row-child-header,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.ag-row-odd.row-child.row-child-even.row-child-header{background-color:var(--table)}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .row-child{border-top:solid var(--stroke) .0625rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .row-child.row-child-second{border-top:transparent}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .row-child.row-child-second .ag-cell{font-size:.6875rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .row-child .bubble{width:.5rem;height:.5625rem;margin-left:.3125rem;margin-bottom:.0625rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .row-child .ag-cell{font-size:.8125rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .row-child app-resource-status{margin-left:1.4375rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .row-child app-resource-status .circular{height:.75rem;margin-left:1.125rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .row-child app-resource-status>span{font-size:.8125rem;margin-left:.25rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .row-child.row-child-second app-resource-status{margin-left:1.625rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .row-child.row-child-second app-resource-status .circular{margin-left:1.625rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .row-child.row-child-second app-resource-status>span{font-size:.8125rem;margin-left:.25rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .row-child-second .step-header-container .step-content{position:relative;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;flex-grow:1;flex-shrink:0;padding-right:.3125rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .row-child-second .step-header-container .step-label{padding-left:3.4375rem;margin-left:1.25rem;width:calc(20% + 1.25rem)}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .row-child-second .step-header-container .step-label.step-content{padding-left:0}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .row-child-second .step-header-container .started-label{width:calc(20% + 1.25rem);overflow:hidden;flex-grow:1;flex-shrink:0}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .row-child-second .step-header-container .finished-label{width:calc(20% + 1.25rem);overflow:hidden;flex-grow:1;flex-shrink:0}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .row-child-second .step-header-container .duration-label{width:calc(20% + 1.25rem);overflow:hidden;flex-grow:1;flex-shrink:0}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .row-child-second .step-header-container .state-label{width:calc(20% + 1.25rem);overflow:hidden;flex-grow:1;flex-shrink:0}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .process-info-container app-resource-status .circular{margin-left:.8125rem;margin-top:-.0625rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper app-table-cell-resource-status{width:100%;text-overflow:ellipsis;white-space:nowrap;overflow:hidden;margin-left:-.625rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper app-table-cell-resource-status .bubble{margin-left:.125rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper app-table-cell-resource-status .bubble .circular{left:0;top:1rem}.data-table-container ::ng-deep body{overflow-x:auto!important}.data-table-container ::ng-deep body .ag-theme-alpine.ag-dnd-ghost{height:2.1875rem!important;line-height:2.1875rem!important}.data-table-container ::ng-deep body .ag-header-row{box-sizing:border-box;border-bottom:.25rem solid var(--primary);background-color:var(--formBackground);padding-left:.25rem;line-height:3.4375rem;position:sticky!important;top:0;z-index:10;transition:all .15s linear;opacity:.97;color:var(--text)}.data-table-container ::ng-deep body .ag-header-cell-text{position:relative;float:left;color:var(--tableText);font-size:.875rem;font-weight:600;font-family:Open Sans;height:3.4375rem;transition:.5s;white-space:nowrap;color:var(--text)}.data-table-container ::ng-deep body .ag-header-cell-resize:after{display:none}.data-table-container ::ng-deep body .ag-header-cell-menu-button{height:1rem;width:1rem}.data-table-container ::ng-deep body .ag-icon{font-family:agGridAlpine;font-size:1rem;line-height:1rem;font-style:normal;font-weight:800;font-variant:normal;text-transform:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.data-table-container ::ng-deep body .ag-icon-menu:before{content:\"\\f11b\"}.data-table-container ::ng-deep body .ag-icon-menu:hover{color:var(--primary)}.data-table-container ::ng-deep body .ag-icon-asc{margin-top:.4375rem;font-weight:800}.data-table-container ::ng-deep body .ag-icon-desc{margin-top:-.4375rem;font-weight:800}.data-table-container ::ng-deep body .tSelectHeader{left:1.3125rem;top:.625rem}.data-table-container ::ng-deep body .cellMenu{overflow:visible}.data-table-container ::ng-deep body .ag-theme-alpine{-webkit-font-smoothing:antialiased;color:var(--tableText)!important;color:var(--ag-foreground-color, var(--tableText))!important;font-family:Open Sans,sans-serif;font-size:.8125rem;line-height:normal}.data-table-container ::ng-deep body .ag-theme-alpine .ag-row{color:var(--tableText)!important;color:var(--ag-foreground-color, var(--tableText))!important}.data-table-container ::ng-deep body .ag-theme-alpine .ag-header-cell,.data-table-container ::ng-deep body .ag-theme-alpine .ag-header-group-cell{padding-left:.3125rem;padding-right:.9375rem}.os-icon{width:1.4375rem;height:1.4375rem;background-size:1.4375rem 1.4375rem;display:inline-flex;margin-right:.5rem;margin-top:.3125rem;margin-bottom:.3125rem}.os-icon.empty{background:transparent}.os-icon.apple{background-image:url(data:image/png;base64,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)}.os-icon.windows{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAgAAAAIACAYAAAD0eNT6AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAN1wAADdcBQiibeAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAApdSURBVHic7dsxbttYGEZRylCfZAfpvYys23uYxuvI7EDTTBdJRCRTj3z3HECdDf+N9V0I1OlyuSwAQMvb6AMAgNcTAAAQJAAAIEgAAECQAACAIAEAAEECAACCBAAABAkAAAgSAAAQJAAAIEgAAECQAACAIAEAAEECAACCzqMPAAC+3unj8/uyLD9vvQQAABzQ2sAvy/Lt3u8LAADYoWcHfo0AAIABth74NQIAADYweuDXCAAAeMDeB36NAACAK44+8GsEAABJsw/8GgEAwJTqA79GAABwSAb+OQIAgF0y8NsSAAAMYeDHEgAAbMLA75sAAOAhBv7YBAAAVxn4uQkAgCgD3yYAACZl4LlHAAAclIHnGQIAYKcMPFsSAACDGHhGEgAAGzHw7JkAAHiQgefIBADADQaemQkAIMvAUyYAgGkZeLhNAACHZeDhcQIA2C0DD9sRAMAwBh7GEQDAZgw87JcAAB5m4OG4BABwk4GHeQkACDPw0CUAoO336AOAMd5GHwAAvJ4AAIAgAQAAQZ4BgA2tPWR3+fX+fchhQJ4AgCd4ih44KgEAdxh4YFYCgDQDD1QJAKZm4AGuEwAcmoEHeIwAYNcMPMA2BABDGXiAMQQAmzLwAPskAHiKgQc4JgHAXQYeYE4CIM7AAzQJgMkZeACuEQAHZ+ABeIQA2DkDD8AWBMBgBh6AEQTAxgw8AHskAJ5k4AE4IgGwwsADMKN8ABh4AIqmDwADDwB/OnwAGHgA+Hu7DwADDwBfb3gAGHgAeL3NA8DAA8D+PB0ABh4Ajmc1AAw8AMznbOABoOe8LMvv0UcAAK/1NvoAAOD1BAAABAkAAAgSAAAQJAAAIEgAAECQAACAIAEAAEECAACCBAAABAkAAAgSAAAQJAAAIEgAAECQAACAIAEAAEECAACCBAAABAkAAAgSAAAQJAAAIEgAAECQAACAIAEAAEECAACCBAAABAkAAAgSAAAQJAAAIEgAAECQAACAIAEAAEECAACCBAAABAkAAAgSAAAQJAAAIEgAAECQAACAIAEAAEECAACCBAAABAkAAAgSAAAQJAAAIEgAAECQAACAIAEAAEECAACCBAAABAkAAAgSAAAQJAAAIEgAAECQAACAIAEAAEECAACCBAAABAkAAAgSAAAQJAAAIEgAAECQAACAIAEAAEECAACCBAAABAkAAAgSAAAQJAAAIEgAAECQAACAIAEAAEECAACCBAAABAkAAAgSAAAQJAAAIEgAAECQAACAIAEAAEECAACCBAAABAkAAAgSAAAQJAAAIEgAAECQAACAIAEAAEECAACCBAAABAkAAAgSAAAQJAAAIEgAAECQAACAIAEAAEECAACCBAAABAkAAAgSAAAQJAAAIEgAAECQAACAIAEAAEECAACCBAAABAkAAAgSAAAQJAAAIEgAAECQAACAIAEAAEECAACCBAAABAkAAAgSAAAQJAAAIEgAAECQAACAIAEAAEECAACCBAAABAkAAAgSAAAQJAAAIEgAAECQAACAIAEAAEECAACCBAAABAkAAAgSAAAQJAAAIEgAAECQAACAIAEAAEECAACCBAAABAkAAAgSAAAQJAAAIEgAAECQAACAIAEAAEECAACCBAAABAkAAAgSAAAQJAAAIEgAAECQAACAIAEAAEECAACCBAAABAkAAAgSAAAQJAAAIEgAAECQAACAoNPlchl9AwDwYj4BAIAgAQAAQQIAAIIEAAAECQAACBIAABAkAAAgSAAAQJAAAIAgAQAAQQIAAIIEAAAECQAACBIAABAkAAAgSAAAQJAAAIAgAQAAQQIAAIIEAAAECQAACBIAABAkAAAgSAAAQJAAAIAgAQAAQQIAAIIEAAAECQAACBIAABAkAAAg6Hz6+LyMPgKqLr/eTyP/vv9/6PIJAAAECQAACBIAABAkAAAgSAAAQJAAAIAgAQAAQQIAAIIEAAAECQAACBIAABAkAAAgSAAAQJAAAIAgAQAAQQIAAIIEAAAECQAACBIAABAkAAAgSAAAQJAAAIAgAQAAQQIAAIIEAAAECQAACBIAABAkAAAgSAAAQJAAAIAgAQAAQQIAAIIEAAAECQAACBIAABAkAAAgSAAAQJAAAIAgAQAAQQIAAIIEAAAECQAACBIAABAkAAAgSAAAQJAAAIAgAQAAQQIAAIIEAAAECQAACBIAABAkAAAgSAAAQJAAAIAgAQAAQQIAAIIEAAAECQAACBIAABAkAAAgSAAAQJAAAIAgAQAAQQIAAIIEAAAECQAACBIAABAkAAAgSAAAQJAAAIAgAQAAQQIAAIIEAAAECQAACBIAABAkAAAgSAAAQJAAAIAgAQAAQQIAAIIEAAAECQAACBIAABAkAAAgSAAAQJAAAIAgAQAAQQIAAIIEAAAECQAACBIAABAkAAAgSAAAQJAAAIAgAQAAQQIAAIIEAAAECQAACBIAABAkAAAgSAAAQJAAAIAgAQAAQQIAAIIEAAAECQAACBIAABAkAAAgSAAAQJAAAIAgAQAAQQIAAIIEAAAECQAACBIAABAkAAAgSAAAQJAAAIAgAQAAQQIAAIIEAAAECQAACBIAABAkAAAgSAAAQJAAAIAgAQAAQQIAAIIEAAAECQAACBIAABAkAAAgSAAAQJAAAIAgAQAAQQIAAIIEAAAECQAACBIAABAkAAAgSAAAQJAAAIAgAQAAQQIAAIIEAAAECQAACBIAABAkAAAgSAAAQJAAAIAgAQAAQQIAAIIEAAAECQAACBIAABAkAAAgSAAAQJAAAIAgAQAAQedlWX4sy/Lzzuvb688CALZ0vvx6/3dZln/+f/3h9PH5fREIADCV89oPCAQAmM9qAKwRCABwPE8HwBqBAAD7s3kArBEIAPB6wwNgjUAAgK+3+wBYIxAA4O8dPgDWCAQA+NP0AbBGIABQlA+ANQIBgBkJgCcJBACOSABsTCAAsEcCYDCBAMAIAmDnBAIAWxAABycQAHiEAJicQADgGgEQJxAAmgQAdwkEgDkJAJ4iEACOSQCwKYEAsE8CgKEEAsAYAoBdEwgA2xAAHJpAAHiMAGBqAgHgOgFAmkAAqgQA3CEQgFkJAHjCFwQCwBCny+Uy+gZgkNPHpzcAiHobfQAA8HoCAACCBAAABHkIENp+LL7FAEkeAgRu8jVHmJcAAB4mEOC4BACwGYEA+yUAgGEEAowjAIDdEgiwHQEAHJZAgMcJAGBaAgFuEwBAlkCgTAAA3CAQmJkAAHiQQODIBADARgQCeyYAAAYRCIwkAAB2SiCwJQEAcFACgWcIAIBJCQTuEQAAUQKhTQAAcJVAmJsAAOAhAuHYBAAAmxAI+yYAABhCIIwlAADYJYGwLQEAwCEJhOcIAACmJBDuEwAAJNUDQQAAwBWzB4IAAIAHHD0QBAAAbGDvgSAAAGCA0YEgAABgh7YOBAEAAAf0bCAIAACY0FogCAAACHobfQAA8HoCAACCBAAABAkAAAgSAAAQJAAAIEgAAECQAACAIAEAAEECAACCBAAABAkAAAgSAAAQJAAAIEgAAEDQf5pXFokUyDSTAAAAAElFTkSuQmCC)}.os-icon.linux{background-image:url(data:image/png;base64,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)}.os-icon.android{background-image:url(data:image/png;base64,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)}.os-icon.other{background-image:url(data:image/png;base64,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)}::ng-deep .date-time-container.data-table-date-time{position:fixed;z-index:9999}::ng-deep .date-time-container.data-table-date-time .p-calendar .p-inputtext{height:.0625rem;width:.0625rem;padding:0}::ng-deep .date-time-container.data-table-date-time .filter-button-container{height:3.125rem;display:flex;flex-direction:row;justify-content:center;align-items:center}::ng-deep .date-time-container.data-table-date-time .filter-button-container .toggleButton{padding-left:var(--paddingSmall);padding-right:var(--paddingSmall);text-align:center;background-color:var(--inputBorder);color:var(--tableText);width:unset;height:1.4375rem;line-height:1.4375rem;font-size:.875rem;font-weight:600;position:relative;float:left;cursor:pointer;border-radius:.25rem;margin-right:var(--marginSmall);transition:.3s}::ng-deep .date-time-container.data-table-date-time .filter-button-container .toggleButton:hover{filter:brightness(90%);transition:.3s}::ng-deep .date-time-container.data-table-date-time .p-calendar .p-inputtext{border-top-left-radius:1.25rem;border-bottom-left-radius:1.25rem;text-indent:.3125rem}::ng-deep .date-time-container.data-table-date-time .p-calendar .p-button-icon-only{border-top-right-radius:1.25rem;border-bottom-right-radius:1.25rem}::ng-deep .tag-selector-container.data-table-tag-selector{position:fixed;z-index:9999;width:21.875rem;height:-moz-fit-content;height:fit-content;background:var(--formBackground);display:flex;flex-direction:column;justify-content:flex-end;padding:.625rem;border-radius:var(--inputBorderRadius);box-shadow:var(--shadowLarge);margin-top:-1.25rem;border-color:var(--stroke);border-style:solid}::ng-deep .tag-selector-container.data-table-tag-selector .tag-selector-label{margin-bottom:.3125rem;margin-left:.125rem;font-weight:600;color:var(--menu)}::ng-deep .tag-selector-container.data-table-tag-selector .select2-search__field{height:2.1875rem}::ng-deep .tag-selector-container.data-table-tag-selector .nf-select2-dropdown{width:calc(100% - 1.25rem)!important}::ng-deep .tag-selector-container .icon-close{position:absolute;top:.5rem;right:.5rem;cursor:pointer;color:var(--icon);font-weight:600}::ng-deep .tag-selector-container .icon-close:hover{filter:brightness(50%)}\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.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: i9.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "component", type: i4$1.Calendar, selector: "p-calendar", inputs: ["style", "styleClass", "inputStyle", "inputId", "name", "inputStyleClass", "placeholder", "ariaLabelledBy", "ariaLabel", "iconAriaLabel", "disabled", "dateFormat", "multipleSeparator", "rangeSeparator", "inline", "showOtherMonths", "selectOtherMonths", "showIcon", "icon", "appendTo", "readonlyInput", "shortYearCutoff", "monthNavigator", "yearNavigator", "hourFormat", "timeOnly", "stepHour", "stepMinute", "stepSecond", "showSeconds", "required", "showOnFocus", "showWeek", "showClear", "dataType", "selectionMode", "maxDateCount", "showButtonBar", "todayButtonStyleClass", "clearButtonStyleClass", "autoZIndex", "baseZIndex", "panelStyleClass", "panelStyle", "keepInvalid", "hideOnDateTimeSelect", "touchUI", "timeSeparator", "focusTrap", "showTransitionOptions", "hideTransitionOptions", "tabindex", "minDate", "maxDate", "disabledDates", "disabledDays", "yearRange", "showTime", "responsiveOptions", "numberOfMonths", "firstDayOfWeek", "locale", "view", "defaultDate"], outputs: ["onFocus", "onBlur", "onClose", "onSelect", "onClear", "onInput", "onTodayClick", "onClearClick", "onMonthChange", "onYearChange", "onClickOutside", "onShow"] }, { kind: "component", type: i7.AgGridAngular, selector: "ag-grid-angular", inputs: ["gridOptions", "modules", "statusBar", "sideBar", "suppressContextMenu", "preventDefaultOnContextMenu", "allowContextMenuWithControlKey", "columnMenu", "suppressMenuHide", "enableBrowserTooltips", "tooltipTrigger", "tooltipShowDelay", "tooltipHideDelay", "tooltipMouseTrack", "tooltipShowMode", "tooltipInteraction", "popupParent", "copyHeadersToClipboard", "copyGroupHeadersToClipboard", "clipboardDelimiter", "suppressCopyRowsToClipboard", "suppressCopySingleCellRanges", "suppressLastEmptyLineOnPaste", "suppressClipboardPaste", "suppressClipboardApi", "suppressCutToClipboard", "columnDefs", "defaultColDef", "defaultColGroupDef", "columnTypes", "dataTypeDefinitions", "maintainColumnOrder", "suppressFieldDotNotation", "headerHeight", "groupHeaderHeight", "floatingFiltersHeight", "pivotHeaderHeight", "pivotGroupHeaderHeight", "allowDragFromColumnsToolPanel", "suppressMovableColumns", "suppressColumnMoveAnimation", "suppressDragLeaveHidesColumns", "suppressRowGroupHidesColumns", "colResizeDefault", "suppressAutoSize", "autoSizePadding", "skipHeaderOnAutoSize", "autoSizeStrategy", "components", "editType", "singleClickEdit", "suppressClickEdit", "readOnlyEdit", "stopEditingWhenCellsLoseFocus", "enterMovesDown", "enterMovesDownAfterEdit", "enterNavigatesVertically", "enterNavigatesVerticallyAfterEdit", "enableCellEditingOnBackspace", "undoRedoCellEditing", "undoRedoCellEditingLimit", "defaultCsvExportParams", "suppressCsvExport", "defaultExcelExportParams", "suppressExcelExport", "excelStyles", "quickFilterText", "cacheQuickFilter", "excludeHiddenColumnsFromQuickFilter", "includeHiddenColumnsInQuickFilter", "quickFilterParser", "quickFilterMatcher", "applyQuickFilterBeforePivotOrAgg", "excludeChildrenWhenTreeDataFiltering", "enableAdvancedFilter", "advancedFilterModel", "includeHiddenColumnsInAdvancedFilter", "advancedFilterParent", "advancedFilterBuilderParams", "suppressAdvancedFilterEval", "enableCharts", "chartThemes", "customChartThemes", "chartThemeOverrides", "enableChartToolPanelsButton", "suppressChartToolPanelsButton", "chartToolPanelsDef", "chartMenuItems", "loadingCellRenderer", "loadingCellRendererParams", "loadingCellRendererSelector", "localeText", "masterDetail", "keepDetailRows", "keepDetailRowsCount", "detailCellRenderer", "detailCellRendererParams", "detailRowHeight", "detailRowAutoHeight", "context", "alignedGrids", "tabIndex", "rowBuffer", "valueCache", "valueCacheNeverExpires", "enableCellExpressions", "suppressParentsInRowNodes", "suppressTouch", "suppressFocusAfterRefresh", "suppressAsyncEvents", "suppressBrowserResizeObserver", "suppressPropertyNamesCheck", "suppressChangeDetection", "debug", "overlayLoadingTemplate", "loadingOverlayComponent", "loadingOverlayComponentParams", "suppressLoadingOverlay", "overlayNoRowsTemplate", "noRowsOverlayComponent", "noRowsOverlayComponentParams", "suppressNoRowsOverlay", "pagination", "paginationPageSize", "paginationPageSizeSelector", "paginationAutoPageSize", "paginateChildRows", "suppressPaginationPanel", "pivotMode", "pivotPanelShow", "pivotMaxGeneratedColumns", "pivotDefaultExpanded", "pivotColumnGroupTotals", "pivotRowTotals", "pivotSuppressAutoColumn", "suppressExpandablePivotGroups", "functionsReadOnly", "aggFuncs", "suppressAggFuncInHeader", "alwaysAggregateAtRootLevel", "suppressAggAtRootLevel", "aggregateOnlyChangedColumns", "suppressAggFilteredOnly", "removePivotHeaderRowWhenSingleValueColumn", "animateRows", "enableCellChangeFlash", "cellFlashDuration", "cellFlashDelay", "cellFadeDuration", "cellFadeDelay", "allowShowChangeAfterFilter", "domLayout", "ensureDomOrder", "enableRtl", "suppressColumnVirtualisation", "suppressMaxRenderedRowRestriction", "suppressRowVirtualisation", "rowDragManaged", "suppressRowDrag", "suppressMoveWhenRowDragging", "rowDragEntireRow", "rowDragMultiRow", "rowDragText", "fullWidthCellRenderer", "fullWidthCellRendererParams", "embedFullWidthRows", "suppressGroupMaintainValueType", "groupDisplayType", "groupDefaultExpanded", "autoGroupColumnDef", "groupMaintainOrder", "groupSelectsChildren", "groupLockGroupColumns", "groupAggFiltering", "groupIncludeFooter", "groupIncludeTotalFooter", "groupTotalRow", "grandTotalRow", "suppressStickyTotalRow", "groupSuppressBlankHeader", "groupSelectsFiltered", "showOpenedGroup", "groupRemoveSingleChildren", "groupRemoveLowestSingleChildren", "groupHideOpenParents", "groupAllowUnbalanced", "rowGroupPanelShow", "groupRowRenderer", "groupRowRendererParams", "suppressMakeColumnVisibleAfterUnGroup", "treeData", "rowGroupPanelSuppressSort", "suppressGroupRowsSticky", "pinnedTopRowData", "pinnedBottomRowData", "rowModelType", "rowData", "asyncTransactionWaitMillis", "suppressModelUpdateAfterUpdateTransaction", "datasource", "cacheOverflowSize", "infiniteInitialRowCount", "serverSideInitialRowCount", "suppressServerSideInfiniteScroll", "suppressServerSideFullWidthLoadingRow", "cacheBlockSize", "maxBlocksInCache", "maxConcurrentDatasourceRequests", "blockLoadDebounceMillis", "purgeClosedRowNodes", "serverSideDatasource", "serverSideSortAllLevels", "serverSideEnableClientSideSort", "serverSideOnlyRefreshFilteredGroups", "serverSideFilterAllLevels", "serverSideSortOnServer", "serverSideFilterOnServer", "serverSidePivotResultFieldSeparator", "viewportDatasource", "viewportRowModelPageSize", "viewportRowModelBufferSize", "alwaysShowHorizontalScroll", "alwaysShowVerticalScroll", "debounceVerticalScrollbar", "suppressHorizontalScroll", "suppressScrollOnNewData", "suppressScrollWhenPopupsAreOpen", "suppressAnimationFrame", "suppressMiddleClickScrolls", "suppressPreventDefaultOnMouseWheel", "scrollbarWidth", "rowSelection", "rowMultiSelectWithClick", "suppressRowDeselection", "suppressRowClickSelection", "suppressCellFocus", "suppressHeaderFocus", "suppressMultiRangeSelection", "enableCellTextSelection", "enableRangeSelection", "enableRangeHandle", "enableFillHandle", "fillHandleDirection", "suppressClearOnFillReduction", "sortingOrder", "accentedSort", "unSortIcon", "suppressMultiSort", "alwaysMultiSort", "multiSortKey", "suppressMaintainUnsortedOrder", "icons", "rowHeight", "rowStyle", "rowClass", "rowClassRules", "suppressRowHoverHighlight", "suppressRowTransform", "columnHoverHighlight", "gridId", "deltaSort", "treeDataDisplayType", "functionsPassive", "enableGroupEdit", "initialState", "getContextMenuItems", "getMainMenuItems", "postProcessPopup", "processUnpinnedColumns", "processCellForClipboard", "processHeaderForClipboard", "processGroupHeaderForClipboard", "processCellFromClipboard", "sendToClipboard", "processDataFromClipboard", "isExternalFilterPresent", "doesExternalFilterPass", "getChartToolbarItems", "createChartContainer", "navigateToNextHeader", "tabToNextHeader", "navigateToNextCell", "tabToNextCell", "getLocaleText", "getDocument", "paginationNumberFormatter", "getGroupRowAgg", "isGroupOpenByDefault", "initialGroupOrderComparator", "processPivotResultColDef", "processPivotResultColGroupDef", "getDataPath", "getChildCount", "getServerSideGroupLevelParams", "isServerSideGroupOpenByDefault", "isApplyServerSideTransaction", "isServerSideGroup", "getServerSideGroupKey", "getBusinessKeyForNode", "getRowId", "resetRowDataOnUpdate", "processRowPostCreate", "isRowSelectable", "isRowMaster", "fillOperation", "postSortRows", "getRowStyle", "getRowClass", "getRowHeight", "isFullWidthRow"], outputs: ["toolPanelVisibleChanged", "toolPanelSizeChanged", "columnMenuVisibleChanged", "contextMenuVisibleChanged", "cutStart", "cutEnd", "pasteStart", "pasteEnd", "columnVisible", "columnPinned", "columnResized", "columnMoved", "columnValueChanged", "columnPivotModeChanged", "columnPivotChanged", "columnGroupOpened", "newColumnsLoaded", "gridColumnsChanged", "displayedColumnsChanged", "virtualColumnsChanged", "columnEverythingChanged", "columnHeaderMouseOver", "columnHeaderMouseLeave", "columnHeaderClicked", "columnHeaderContextMenu", "componentStateChanged", "cellValueChanged", "cellEditRequest", "rowValueChanged", "cellEditingStarted", "cellEditingStopped", "rowEditingStarted", "rowEditingStopped", "undoStarted", "undoEnded", "redoStarted", "redoEnded", "rangeDeleteStart", "rangeDeleteEnd", "fillStart", "fillEnd", "filterOpened", "filterChanged", "filterModified", "advancedFilterBuilderVisibleChanged", "chartCreated", "chartRangeSelectionChanged", "chartOptionsChanged", "chartDestroyed", "cellKeyDown", "gridReady", "gridPreDestroyed", "firstDataRendered", "gridSizeChanged", "modelUpdated", "virtualRowRemoved", "viewportChanged", "bodyScroll", "bodyScrollEnd", "dragStarted", "dragStopped", "stateUpdated", "paginationChanged", "rowDragEnter", "rowDragMove", "rowDragLeave", "rowDragEnd", "columnRowGroupChanged", "rowGroupOpened", "expandOrCollapseAll", "pivotMaxColumnsExceeded", "pinnedRowDataChanged", "rowDataUpdated", "asyncTransactionsFlushed", "storeRefreshed", "cellClicked", "cellDoubleClicked", "cellFocused", "cellMouseOver", "cellMouseOut", "cellMouseDown", "rowClicked", "rowDoubleClicked", "rowSelected", "selectionChanged", "cellContextMenu", "rangeSelectionChanged", "tooltipShow", "tooltipHide", "sortChanged", "columnRowGroupChangeRequest", "columnPivotChangeRequest", "columnValueChangeRequest", "columnAggFuncChangeRequest"] }, { kind: "directive", type: i2.ClickOutsideDirective, selector: "[clickOutside]", inputs: ["clickOutsideEnabled", "attachOutsideOnClick", "delayClickOutsideInit", "emitOnBlur", "exclude", "excludeBeforeClick", "clickOutsideEvents"], outputs: ["clickOutside"] }, { kind: "component", type: FilterBarComponent, selector: "lib-table-filter-bar", inputs: ["filterName", "filterColumn", "startCount", "endCount", "totalCount", "currentPage"] }, { kind: "component", type: HiddenColumnsBarComponent, selector: "lib-table-hidden-columns-bar", inputs: ["hiddenColumns"], outputs: ["columnVisibilityChanged"] }, { kind: "component", type: NoItemsComponent, selector: "lib-no-items", inputs: ["image", "typeName", "isEmpty", "hasAdd", "hiddenResults", "isLoading"], outputs: ["clickEmit", "refresh"] }, { kind: "component", type: TagSelectorComponent, selector: "lib-tag-selector", inputs: ["placeholder", "disableField", "disableCreate", "hideOption", "isLoading", "errorMessage", "focusOnInit", "selectedRoleAttributes", "selectedNamedAttributes", "hasError", "availableRoleAttributes", "availableNamedAttributes"], outputs: ["addRoleAttribute", "addNamedAttribute", "roleAttributeRemoved", "namedAttributeRemoved", "selectedRoleAttributesChange", "selectedNamedAttributesChange", "filterChange"] }] }); }
8149
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: DataTableComponent, selector: "lib-data-table", inputs: { rowData: "rowData", expandRowData: "expandRowData", collapseRowData: "collapseRowData", rowValidation: "rowValidation", isTimeSearchAvailable: "isTimeSearchAvailable", isLoading: "isLoading", tableId: "tableId", options: "options", validateService: "validateService", rowsToggled: "rowsToggled", tableRefreshCount: "tableRefreshCount", view: "view", serverSideDataSource: "serverSideDataSource", allowDownload: "allowDownload", startCount: "startCount", endCount: "endCount", totalCount: "totalCount", emptyMsg: "emptyMsg", filterApplied: "filterApplied", menuItems: "menuItems", headerActions: "headerActions", noItemsClass: "noItemsClass", entityTypeName: "entityTypeName", showNoItemsAdd: "showNoItemsAdd", currentPage: "currentPage", noItemsImage: "noItemsImage", rowHeight: "rowHeight", filterName: "filterName", filterColumn: "filterColumn", columnDefinitions: "columnDefinitions", refreshCount: "refreshCount" }, outputs: { actionRequested: "actionRequested", gridReady: "gridReady", dragStart: "dragStart", dragLeave: "dragLeave", pageChanged: "pageChanged" }, viewQueries: [{ propertyName: "calendar", first: true, predicate: ["calendar"], descendants: true }, { propertyName: "contextMenu", first: true, predicate: ["contextMenu"], descendants: true }, { propertyName: "tableContainer", first: true, predicate: ["tableContainer"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div #tableContainer class=\"data-table-container\" *ngIf=\"showTable;else nodata\">\n <lib-table-filter-bar\n [startCount]=\"startCount\"\n [endCount]=\"endCount\"\n [totalCount]=\"totalCount\"\n [currentPage]=\"currentPage\"\n [filterName]=\"filterName\"\n [filterColumn]=\"filterColumn\"\n ></lib-table-filter-bar>\n <lib-table-hidden-columns-bar\n *ngIf=\"gridRendered && showFilterBar\"\n [hiddenColumns]=\"hiddenColumns\"\n (columnVisibilityChanged)=\"columnVisibilityChanged($event)\"\n ></lib-table-hidden-columns-bar>\n <div (resize)=\"resizeGridColumnsDebounced($event)\" class=\"ziti-ag-grid\" id=\"ItemTable\">\n <ag-grid-angular\n #nfAgGrid\n [columnDefs]=\"mergedColumnDefinitions\"\n [components]=\"frameworkComponents\"\n [getDataPath]=\"svc.getDataPath\"\n [getRowId]=\"svc.getRowNodeId\"\n [gridOptions]=\"gridOptions\"\n [modules]=\"gridModules\"\n [rowData]=\"rowData\"\n [tooltipHideDelay]=\"20000\"\n [tooltipShowDelay]=\"0\"\n (gridReady)=\"onGridReady($event)\"\n class=\"ziti-ag-grid-table ag-theme-alpine rows\"\n id=\"ItemGrid\"\n >\n </ag-grid-angular>\n </div>\n <div\n [ngClass]=\"{ open: openHeaderMenu }\"\n [ngStyle]=\"{ left: menuLeft + 'px', top: menuTop + 'px' }\"\n class=\"tMenu action-menu header-menu\"\n id=\"HeaderActionMenu\"\n >\n <div (click)=\"resetTableColumns()\" class=\"tActionRow\" id=\"ResetTableButton\">Restore Default Table</div>\n <div\n *ngFor=\"let headerAction of headerActions\"\n (click)=\"actionRequested.emit({ action: headerAction.action })\"\n class=\"tActionRow\"\n id=\"ResetTableButton\"\n >\n {{headerAction.name || headerAction.label}}\n </div>\n </div>\n <div\n [ngClass]=\"{ open: openMenu }\"\n [ngStyle]=\"{ left: menuLeft + 'px', top: menuTop + 'px' }\"\n class=\"tMenu action-menu item-menu\"\n id=\"RowActionMenu\"\n #contextMenu\n >\n <div\n *ngFor=\"let menuItem of menuItems\"\n (click)=\"actionRequested.emit({ action: menuItem.action, item: selectedItem })\"\n [ngClass]=\"{'menu-item-hidden': hideMenuItem(menuItem, selectedItem) }\"\n class=\"tActionRow\"\n id=\"TableActionButton_{{menuItem.action}}\"\n >\n {{menuItem.name || menuItem.label}}\n </div>\n </div>\n <div\n (clickOutside)=\"closeHeaderFilter($event)\"\n [ngClass]=\"{ open: showFilterOptions }\"\n [ngStyle]=\"{ left: menuLeft + 'px', top: menuTop + 'px' }\"\n class=\"tMenu action-menu header-menu\"\n id=\"HeaderFilterOptions\"\n >\n <div (click)=\"applyFilter($event, filter)\" *ngFor=\"let filter of filterOptions\" class=\"tActionRow\" [ngClass]=\"{'has-icon': filter.icon}\" [id]=\"filter.columnId\">\n <span *ngIf=\"filter.bubbleClass\" [ngClass]=\"filter.bubbleClass\" class=\"bubble\">\n <svg *ngIf=\"filter.showLoader\" class=\"circular\" viewBox=\"25 25 50 50\">\n <circle\n class=\"path\"\n cx=\"50\"\n cy=\"50\"\n fill=\"none\"\n r=\"20\"\n stroke-miterlimit=\"10\"\n stroke-width=\"3\"\n ></circle>\n </svg>\n </span>\n <span *ngIf=\"filter.icon\" class=\"os-icon {{filter.icon}}\"></span>\n {{ filter.label }}\n </div>\n </div>\n</div>\n\n<div *ngIf=\"showDateTimePicker\" class=\"date-time-container data-table-date-time\" [ngStyle]=\"{ left: menuLeft + 'px', top: menuTop + 'px' }\" (clickOutside)=\"closeDateTime($event)\">\n <p-calendar\n [(ngModel)]=\"dateValue\"\n (onSelect)=\"setDateRangeFilter('custom')\"\n dateFormat=\"mm/dd/yy\"\n selectionMode=\"range\"\n placeholder=\"Select Time Range\"\n #calendar\n >\n <ng-template pTemplate=\"header\">\n <div class=\"filter-button-container\">\n <div\n class=\"toggleButton\"\n [ngClass]=\"{selected: selectedRange === 'hour'}\"\n (click)=\"setDateRangeFilter('hour')\"\n >\n Last Hour\n </div>\n <div\n class=\"toggleButton\"\n (click)=\"setDateRangeFilter('day')\"\n [ngClass]=\"{selected: selectedRange === 'day'}\"\n >\n Last Day\n </div>\n <div\n class=\"toggleButton\"\n (click)=\"setDateRangeFilter('week')\"\n [ngClass]=\"{selected: selectedRange === 'week'}\"\n >\n Last Week\n </div>\n <div\n class=\"toggleButton\"\n (click)=\"setDateRangeFilter('month')\"\n [ngClass]=\"{selected: selectedRange === 'month'}\"\n >\n Last Month\n </div>\n </div>\n </ng-template>\n </p-calendar>\n</div>\n\n<div *ngIf=\"showTagSelector\" class=\"tag-selector-container data-table-tag-selector\" [ngStyle]=\"{ left: menuLeft + 'px', top: menuTop + 'px' }\" (clickOutside)=\"closeTagSelector($event)\">\n <div class=\"buttonBall icon-close\" (click)=\"closeTagSelector($event)\"></div>\n <div class=\"tag-selector-label\">\n <span>Select an Attribute:</span>\n </div>\n <lib-tag-selector\n [focusOnInit]=\"true\"\n [availableRoleAttributes]=\"roleAttributes\"\n [availableNamedAttributes]=\"namedAttributes\"\n [(selectedRoleAttributes)]=\"selectedRoleAttributes\"\n [(selectedNamedAttributes)]=\"selectedNamedAttributes\"\n (selectedNamedAttributesChange)=\"tagSelectionChanged($event, false)\"\n (selectedRoleAttributesChange)=\"tagSelectionChanged($event, true)\"\n ></lib-tag-selector>\n</div>\n<ng-template #nodata>\n <lib-no-items\n (clickEmit)=\"openCreate()\"\n [image]=\"noItemsImage\"\n [isEmpty]=\"!rowData || rowData.length === 0\"\n [typeName]=\"this.entityTypeLabel\"\n [hasAdd]=\"showNoItemsAdd\"\n ></lib-no-items>\n</ng-template>\n", styles: [".data-table-container{display:flex;position:relative;height:calc(100% - 5.625rem);width:100%;flex-direction:column}.data-table-container .ziti-ag-grid{position:relative;width:100%;height:100%;display:flex;clear:both;align-items:center;justify-content:center}.data-table-container .ziti-ag-grid .ziti-ag-grid-table{height:100%;width:100%}.data-table-container .tMenu.action-menu.header-menu,.data-table-container .tMenu.action-menu.item-menu{position:fixed;height:unset;width:12.5rem;transition-property:opacity}.data-table-container .tMenu.action-menu.header-menu .tActionRow,.data-table-container .tMenu.action-menu.item-menu .tActionRow{display:flex;color:var(--offWhite_ALWAYS)}.data-table-container .tMenu.action-menu.header-menu .tActionRow.menu-item-hidden,.data-table-container .tMenu.action-menu.item-menu .tActionRow.menu-item-hidden{display:none}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper{border:none}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-body-vertical-scroll-viewport{background-color:var(--formBackground)}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row{border:none;background-color:var(--formBackground);color:var(--text)}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.row-invalid{background-color:var(--invalid)!important}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.row-invalid.row-copied{background-color:var(--copiedRow)!important}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.row-copied{background-color:var(--copiedRow)!important}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.ag-row-selected{background-color:var(--formBackground)}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.ag-row-selected.ag-row-hover{background-color:#2196f31a}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.ag-row-odd{background:var(--white)}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.ag-row-odd.ag-row-selected{background-color:var(--shaded)}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.ag-row-odd.ag-row-selected.ag-row-hover{background-color:#2196f31a}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.ag-row-odd.ag-row-hover{background-color:#2196f31a}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.ag-row-hover{background-color:#2196f31a}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row .dots{right:1.5625rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.row-role-item .tCol{font-size:.8125rem;height:2.1875rem;line-height:2.1875rem;font-weight:600}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-cell{border:none}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-cell.ag-cell-value.ziti-table-cell-error{outline:.125rem var(--red) solid;outline-offset:-.1875rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-cell.ag-cell-value.ag-cell-inline-editing{width:100%;height:100%;padding-left:0}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-header-cell:focus:after{border:none}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-pinned-left-header{border:none}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-pinned-left-header .ag-icon-pin{margin-top:.9375rem;transform:rotate(-45deg)}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-pinned-left-header .ag-header-cell-text{cursor:default}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-pinned-left-header .ag-header-col-pin-button:hover .ag-icon-pin{animation-name:unpinColumn;animation-duration:.5s;animation-delay:.1s;animation-iteration-count:1;animation-fill-mode:forwards}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-header-col-pin-button:hover .ag-icon-pin{animation-name:pinColumn;animation-duration:.6s;animation-delay:.1s;animation-iteration-count:1;animation-fill-mode:forwards}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row-level-1 app-table-cell-resource-status app-resource-status{margin-left:2.5rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row-level-1 app-table-cell-resource-status app-resource-status .bubble{height:.6875rem;width:.6875rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row-level-1 app-table-cell-resource-status app-resource-status .bubble .circular{margin-left:2.5rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-icon-eye-slash{margin-top:.75rem;margin-right:.3125rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-icon-pin{margin-top:.75rem}@keyframes pinColumn{0%{transform:rotate(0);margin-top:.75rem}15%{transform:rotate(-10deg);margin-top:.75rem}30%{transform:rotate(-20deg);margin-top:.75rem}45%{transform:rotate(-30deg);margin-top:.8125rem}60%{transform:rotate(-40deg);margin-top:.875rem}75%{transform:rotate(-45deg);margin-top:.9375rem}to{transform:rotate(-45deg);margin-top:1rem}}@keyframes unpinColumn{0%{transform:rotate(-45deg);margin-top:.9375rem}15%{transform:rotate(-45deg);margin-top:.875rem}30%{transform:rotate(-45deg);margin-top:.8125rem}45%{transform:rotate(-40deg);margin-top:.75rem}60%{transform:rotate(-30deg);margin-top:.6875rem}75%{transform:rotate(-20deg);margin-top:.625rem}90%{transform:rotate(-10deg);margin-top:.5625rem}to{transform:rotate(0);margin-top:.5rem}}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-pinned-right-header{border:none}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .selectHeader{background-image:none}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .menuHeader{background-image:none}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-pinned-right-header .ag-header-row:after{height:0}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-horizontal-left-spacer{border:none}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-horizontal-right-spacer{border:none}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-header-cell-resize{margin-top:.125rem;border-left-color:#d4d9e2;border-right-color:#d4d9e2;border-left-width:.0625rem;border-right-width:.0625rem;border-left-style:solid;border-right-style:solid;width:.1875rem;height:.875rem;position:absolute;right:.125rem;top:1.1875rem;cursor:col-resize}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-header-cell-resize:after{display:none}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-header-cell-text{height:3rem;cursor:move;color:var(--text);line-height:3.4375rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-icon-menu{margin-top:.25rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-menu{margin-left:-2.8125rem;z-index:99999999}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-header-cell{padding-right:.3125rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-input-field-input{height:100%;margin-right:0;width:100%;box-shadow:0 0 .3125rem 0 var(--primary);border:solid .125rem var(--primary);overflow:visible}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-checkbox-input-wrapper .ag-input-field-input{border:none}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-header-viewport{box-sizing:border-box;border-bottom:.25rem solid var(--primary);background-color:var(--formBackground);padding-left:.25rem;line-height:3.4375rem;position:sticky!important;top:0;z-index:10;transition:all .15s linear;opacity:.97}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-cell-label-container{cursor:default}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-cell-label-container.nf-can-sort{cursor:pointer}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-header{background-color:var(--navigation);border-bottom:solid .0625rem;border-bottom-color:var(--navigation)}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-header-icon{color:var(--icon)}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-icon-pin{font-weight:800;margin-right:.3125rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-icon-menu{font-weight:800}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-icon-eye-slash{font-weight:800;color:var(--icon)}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-header-cell-resize{border-left-color:var(--stroke);border-right-color:var(--stroke);border-left-width:var(--inputBorderWidth);border-right-width:var(--inputBorderWidth);border-left-style:solid;border-right-style:solid;width:.3125rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-header-cell-resize:hover{border-left-color:var(--icon);border-right-color:var(--icon)}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-header-viewport,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-floating-top-viewport,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-body-viewport,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-center-cols-viewport,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-floating-bottom-viewport,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-body-horizontal-scroll-viewport,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-virtual-list-viewport{background-color:var(--navigation)}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-theme-alpine .ag-row{background-color:var(--navigation)}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .tSelect{left:1.25rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-pinned-left-shadow{box-shadow:.5rem 0 .3125rem -.25rem #dddd;z-index:40}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-pinned-right-shadow{box-shadow:-.5rem 0 .3125rem -.25rem #dddd;z-index:40}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-pinned-left-header .ag-header-row-column{border-bottom-style:solid;border-bottom-width:.25rem;border-bottom-color:var(--stroke)}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-pinned-right-header .ag-header-row-column{border-bottom-style:solid;border-bottom-width:.25rem;border-bottom-color:var(--stroke)}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-pinned-right-header .dots{right:.25rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-cell{-webkit-user-select:text;user-select:text}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-body-viewport .ag-cell{padding-left:1.25rem;text-align:left;line-height:3.0625rem!important}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-pinned-left-cols-container .ag-row{border-left:.25rem solid transparent}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-pinned-left-cols-container .ag-row-hover{border-left:.25rem solid var(--primary)}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-pinned-left-cols-container .tSelect{margin-left:-.25rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-cell-label-container .ag-header-col-hide-button,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-cell-label-container .ag-header-col-pin-button,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-cell-label-container .ag-header-col-filter-button{margin-top:.3125rem;opacity:0;transition:opacity .2s;height:2.5rem;cursor:pointer}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-cell-label-container .ag-header-col-hide-button.nf-ag-col-pinned,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-cell-label-container .ag-header-col-pin-button.nf-ag-col-pinned,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-cell-label-container .ag-header-col-filter-button.nf-ag-col-pinned{opacity:1}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-cell-label-container .ag-header-col-hide-button:hover .ag-icon-eye-slash,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-cell-label-container .ag-header-col-hide-button:hover .ag-icon-pin,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-cell-label-container .ag-header-col-hide-button:hover .ag-icon-filter,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-cell-label-container .ag-header-col-pin-button:hover .ag-icon-eye-slash,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-cell-label-container .ag-header-col-pin-button:hover .ag-icon-pin,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-cell-label-container .ag-header-col-pin-button:hover .ag-icon-filter,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-cell-label-container .ag-header-col-filter-button:hover .ag-icon-eye-slash,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-cell-label-container .ag-header-col-filter-button:hover .ag-icon-pin,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-cell-label-container .ag-header-col-filter-button:hover .ag-icon-filter{color:var(--ag-alpine-active-color, var(--primary))}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-cell-label-container .ag-header-col-hide-button .ag-icon-filter,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-cell-label-container .ag-header-col-pin-button .ag-icon-filter,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-cell-label-container .ag-header-col-filter-button .ag-icon-filter{font-weight:700;margin-top:.8125rem;margin-right:0rem;margin-left:-.0625rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-cell-label-container .ag-header-col-hide-button,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-cell-label-container .ag-header-col-pin-button{position:absolute;margin-top:.625rem!important}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-cell-label-container .ag-header-col-hide-button{margin-right:1.3125rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-cell-label-container:hover .ag-header-col-hide-button,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-cell-label-container:hover .ag-header-col-pin-button,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-cell-label-container:hover .ag-header-col-filter-button{position:relative;display:block;opacity:1}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-cell-label-container:hover .ag-header-col-hide-button{margin-right:0rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .tSelectHeader{top:.75rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-header-cell{padding-left:0rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-sort-descending-icon{margin-top:.9375rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .nf-ag-main-col .ag-cell-label-container{margin-left:-.5rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .nf-ag-main-col .ag-cell-label-container .ag-header-cell-text{padding-left:.1875rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ziti-ag-grid .ag-root-wrapper .ag-row.row-child{background-color:#fff;border-bottom:solid var(--stroke) .0625rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper app-table-column-default{width:100%}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper app-table-cell-registration{width:100%}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper app-table-cell-registration .tcol{width:100%}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.ag-row-even.row-child.row-child-odd,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.ag-row-odd.row-child.row-child-odd{background-color:var(--table)}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.ag-row-even.row-child.row-child-odd.row-role-item,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.ag-row-odd.row-child.row-child-odd.row-role-item{background-color:var(--shaded);border:none}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.ag-row-even.row-child.row-child-odd.row-role-item.ag-row-hover,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.ag-row-odd.row-child.row-child-odd.row-role-item.ag-row-hover{background-color:#2196f31a}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.ag-row-even.row-child.row-child-odd.row-child-second,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.ag-row-odd.row-child.row-child-odd.row-child-second{background-color:var(--shaded)}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.ag-row-even.row-child.row-child-odd.row-child-second.row-child-header,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.ag-row-odd.row-child.row-child-odd.row-child-second.row-child-header{background-color:var(--shaded)}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.ag-row-even.row-child.row-child-odd.row-child-warn,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.ag-row-odd.row-child.row-child-odd.row-child-warn{background-color:var(--copiedRow)}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.ag-row-even.row-child.row-child-odd.row-child-header,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.ag-row-odd.row-child.row-child-odd.row-child-header{background-color:var(--shaded)}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.ag-row-even.row-child.row-child-even,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.ag-row-odd.row-child.row-child-even{background-color:var(--shaded)}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.ag-row-even.row-child.row-child-even.row-role-item,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.ag-row-odd.row-child.row-child-even.row-role-item{background-color:var(--table);border:none}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.ag-row-even.row-child.row-child-even.row-role-item.ag-row-hover,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.ag-row-odd.row-child.row-child-even.row-role-item.ag-row-hover{background-color:#2196f31a}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.ag-row-even.row-child.row-child-even.row-child-second,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.ag-row-odd.row-child.row-child-even.row-child-second{background-color:var(--table)}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.ag-row-even.row-child.row-child-even.row-child-second.row-child-header,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.ag-row-odd.row-child.row-child-even.row-child-second.row-child-header{background-color:var(--table)}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.ag-row-even.row-child.row-child-even.row-child-warn,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.ag-row-odd.row-child.row-child-even.row-child-warn{background-color:var(--copiedRow)}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.ag-row-even.row-child.row-child-even.row-child-header,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.ag-row-odd.row-child.row-child-even.row-child-header{background-color:var(--table)}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .row-child{border-top:solid var(--stroke) .0625rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .row-child.row-child-second{border-top:transparent}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .row-child.row-child-second .ag-cell{font-size:.6875rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .row-child .bubble{width:.5rem;height:.5625rem;margin-left:.3125rem;margin-bottom:.0625rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .row-child .ag-cell{font-size:.8125rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .row-child app-resource-status{margin-left:1.4375rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .row-child app-resource-status .circular{height:.75rem;margin-left:1.125rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .row-child app-resource-status>span{font-size:.8125rem;margin-left:.25rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .row-child.row-child-second app-resource-status{margin-left:1.625rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .row-child.row-child-second app-resource-status .circular{margin-left:1.625rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .row-child.row-child-second app-resource-status>span{font-size:.8125rem;margin-left:.25rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .row-child-second .step-header-container .step-content{position:relative;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;flex-grow:1;flex-shrink:0;padding-right:.3125rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .row-child-second .step-header-container .step-label{padding-left:3.4375rem;margin-left:1.25rem;width:calc(20% + 1.25rem)}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .row-child-second .step-header-container .step-label.step-content{padding-left:0}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .row-child-second .step-header-container .started-label{width:calc(20% + 1.25rem);overflow:hidden;flex-grow:1;flex-shrink:0}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .row-child-second .step-header-container .finished-label{width:calc(20% + 1.25rem);overflow:hidden;flex-grow:1;flex-shrink:0}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .row-child-second .step-header-container .duration-label{width:calc(20% + 1.25rem);overflow:hidden;flex-grow:1;flex-shrink:0}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .row-child-second .step-header-container .state-label{width:calc(20% + 1.25rem);overflow:hidden;flex-grow:1;flex-shrink:0}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .process-info-container app-resource-status .circular{margin-left:.8125rem;margin-top:-.0625rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper app-table-cell-resource-status{width:100%;text-overflow:ellipsis;white-space:nowrap;overflow:hidden;margin-left:-.625rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper app-table-cell-resource-status .bubble{margin-left:.125rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper app-table-cell-resource-status .bubble .circular{left:0;top:1rem}.data-table-container ::ng-deep body{overflow-x:auto!important}.data-table-container ::ng-deep body .ag-theme-alpine.ag-dnd-ghost{height:2.1875rem!important;line-height:2.1875rem!important}.data-table-container ::ng-deep body .ag-header-row{box-sizing:border-box;border-bottom:.25rem solid var(--primary);background-color:var(--formBackground);padding-left:.25rem;line-height:3.4375rem;position:sticky!important;top:0;z-index:10;transition:all .15s linear;opacity:.97;color:var(--text)}.data-table-container ::ng-deep body .ag-header-cell-text{position:relative;float:left;color:var(--tableText);font-size:.875rem;font-weight:600;font-family:Open Sans;height:3.4375rem;transition:.5s;white-space:nowrap;color:var(--text)}.data-table-container ::ng-deep body .ag-header-cell-resize:after{display:none}.data-table-container ::ng-deep body .ag-header-cell-menu-button{height:1rem;width:1rem}.data-table-container ::ng-deep body .ag-icon{font-family:agGridAlpine;font-size:1rem;line-height:1rem;font-style:normal;font-weight:800;font-variant:normal;text-transform:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.data-table-container ::ng-deep body .ag-icon-menu:before{content:\"\\f11b\"}.data-table-container ::ng-deep body .ag-icon-menu:hover{color:var(--primary)}.data-table-container ::ng-deep body .ag-icon-asc{margin-top:.4375rem;font-weight:800}.data-table-container ::ng-deep body .ag-icon-desc{margin-top:-.4375rem;font-weight:800}.data-table-container ::ng-deep body .tSelectHeader{left:1.3125rem;top:.625rem}.data-table-container ::ng-deep body .cellMenu{overflow:visible}.data-table-container ::ng-deep body .ag-theme-alpine{-webkit-font-smoothing:antialiased;color:var(--tableText)!important;color:var(--ag-foreground-color, var(--tableText))!important;font-family:Open Sans,sans-serif;font-size:.8125rem;line-height:normal}.data-table-container ::ng-deep body .ag-theme-alpine .ag-row{color:var(--tableText)!important;color:var(--ag-foreground-color, var(--tableText))!important}.data-table-container ::ng-deep body .ag-theme-alpine .ag-header-cell,.data-table-container ::ng-deep body .ag-theme-alpine .ag-header-group-cell{padding-left:.3125rem;padding-right:.9375rem}.os-icon{width:1.4375rem;height:1.4375rem;background-size:1.4375rem 1.4375rem;display:inline-flex;margin-right:.5rem;margin-top:.3125rem;margin-bottom:.3125rem}.os-icon.empty{background:transparent}.os-icon.apple{background-image:url(data:image/png;base64,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)}.os-icon.windows{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAgAAAAIACAYAAAD0eNT6AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAN1wAADdcBQiibeAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAApdSURBVHic7dsxbttYGEZRylCfZAfpvYys23uYxuvI7EDTTBdJRCRTj3z3HECdDf+N9V0I1OlyuSwAQMvb6AMAgNcTAAAQJAAAIEgAAECQAACAIAEAAEECAACCBAAABAkAAAgSAAAQJAAAIEgAAECQAACAIAEAAEECAACCzqMPAAC+3unj8/uyLD9vvQQAABzQ2sAvy/Lt3u8LAADYoWcHfo0AAIABth74NQIAADYweuDXCAAAeMDeB36NAACAK44+8GsEAABJsw/8GgEAwJTqA79GAABwSAb+OQIAgF0y8NsSAAAMYeDHEgAAbMLA75sAAOAhBv7YBAAAVxn4uQkAgCgD3yYAACZl4LlHAAAclIHnGQIAYKcMPFsSAACDGHhGEgAAGzHw7JkAAHiQgefIBADADQaemQkAIMvAUyYAgGkZeLhNAACHZeDhcQIA2C0DD9sRAMAwBh7GEQDAZgw87JcAAB5m4OG4BABwk4GHeQkACDPw0CUAoO336AOAMd5GHwAAvJ4AAIAgAQAAQZ4BgA2tPWR3+fX+fchhQJ4AgCd4ih44KgEAdxh4YFYCgDQDD1QJAKZm4AGuEwAcmoEHeIwAYNcMPMA2BABDGXiAMQQAmzLwAPskAHiKgQc4JgHAXQYeYE4CIM7AAzQJgMkZeACuEQAHZ+ABeIQA2DkDD8AWBMBgBh6AEQTAxgw8AHskAJ5k4AE4IgGwwsADMKN8ABh4AIqmDwADDwB/OnwAGHgA+Hu7DwADDwBfb3gAGHgAeL3NA8DAA8D+PB0ABh4Ajmc1AAw8AMznbOABoOe8LMvv0UcAAK/1NvoAAOD1BAAABAkAAAgSAAAQJAAAIEgAAECQAACAIAEAAEECAACCBAAABAkAAAgSAAAQJAAAIEgAAECQAACAIAEAAEECAACCBAAABAkAAAgSAAAQJAAAIEgAAECQAACAIAEAAEECAACCBAAABAkAAAgSAAAQJAAAIEgAAECQAACAIAEAAEECAACCBAAABAkAAAgSAAAQJAAAIEgAAECQAACAIAEAAEECAACCBAAABAkAAAgSAAAQJAAAIEgAAECQAACAIAEAAEECAACCBAAABAkAAAgSAAAQJAAAIEgAAECQAACAIAEAAEECAACCBAAABAkAAAgSAAAQJAAAIEgAAECQAACAIAEAAEECAACCBAAABAkAAAgSAAAQJAAAIEgAAECQAACAIAEAAEECAACCBAAABAkAAAgSAAAQJAAAIEgAAECQAACAIAEAAEECAACCBAAABAkAAAgSAAAQJAAAIEgAAECQAACAIAEAAEECAACCBAAABAkAAAgSAAAQJAAAIEgAAECQAACAIAEAAEECAACCBAAABAkAAAgSAAAQJAAAIEgAAECQAACAIAEAAEECAACCBAAABAkAAAgSAAAQJAAAIEgAAECQAACAIAEAAEECAACCBAAABAkAAAgSAAAQJAAAIEgAAECQAACAIAEAAEECAACCBAAABAkAAAgSAAAQJAAAIEgAAECQAACAIAEAAEECAACCBAAABAkAAAgSAAAQJAAAIEgAAECQAACAIAEAAEECAACCBAAABAkAAAgSAAAQJAAAIEgAAECQAACAIAEAAEECAACCBAAABAkAAAgSAAAQJAAAIEgAAECQAACAIAEAAEECAACCBAAABAkAAAgSAAAQJAAAIEgAAECQAACAoNPlchl9AwDwYj4BAIAgAQAAQQIAAIIEAAAECQAACBIAABAkAAAgSAAAQJAAAIAgAQAAQQIAAIIEAAAECQAACBIAABAkAAAgSAAAQJAAAIAgAQAAQQIAAIIEAAAECQAACBIAABAkAAAgSAAAQJAAAIAgAQAAQQIAAIIEAAAECQAACBIAABAkAAAg6Hz6+LyMPgKqLr/eTyP/vv9/6PIJAAAECQAACBIAABAkAAAgSAAAQJAAAIAgAQAAQQIAAIIEAAAECQAACBIAABAkAAAgSAAAQJAAAIAgAQAAQQIAAIIEAAAECQAACBIAABAkAAAgSAAAQJAAAIAgAQAAQQIAAIIEAAAECQAACBIAABAkAAAgSAAAQJAAAIAgAQAAQQIAAIIEAAAECQAACBIAABAkAAAgSAAAQJAAAIAgAQAAQQIAAIIEAAAECQAACBIAABAkAAAgSAAAQJAAAIAgAQAAQQIAAIIEAAAECQAACBIAABAkAAAgSAAAQJAAAIAgAQAAQQIAAIIEAAAECQAACBIAABAkAAAgSAAAQJAAAIAgAQAAQQIAAIIEAAAECQAACBIAABAkAAAgSAAAQJAAAIAgAQAAQQIAAIIEAAAECQAACBIAABAkAAAgSAAAQJAAAIAgAQAAQQIAAIIEAAAECQAACBIAABAkAAAgSAAAQJAAAIAgAQAAQQIAAIIEAAAECQAACBIAABAkAAAgSAAAQJAAAIAgAQAAQQIAAIIEAAAECQAACBIAABAkAAAgSAAAQJAAAIAgAQAAQQIAAIIEAAAECQAACBIAABAkAAAgSAAAQJAAAIAgAQAAQQIAAIIEAAAECQAACBIAABAkAAAgSAAAQJAAAIAgAQAAQQIAAIIEAAAECQAACBIAABAkAAAgSAAAQJAAAIAgAQAAQQIAAIIEAAAECQAACBIAABAkAAAgSAAAQJAAAIAgAQAAQQIAAIIEAAAECQAACBIAABAkAAAgSAAAQJAAAIAgAQAAQQIAAIIEAAAECQAACBIAABAkAAAgSAAAQJAAAIAgAQAAQQIAAIIEAAAECQAACBIAABAkAAAgSAAAQJAAAIAgAQAAQedlWX4sy/Lzzuvb688CALZ0vvx6/3dZln/+f/3h9PH5fREIADCV89oPCAQAmM9qAKwRCABwPE8HwBqBAAD7s3kArBEIAPB6wwNgjUAAgK+3+wBYIxAA4O8dPgDWCAQA+NP0AbBGIABQlA+ANQIBgBkJgCcJBACOSABsTCAAsEcCYDCBAMAIAmDnBAIAWxAABycQAHiEAJicQADgGgEQJxAAmgQAdwkEgDkJAJ4iEACOSQCwKYEAsE8CgKEEAsAYAoBdEwgA2xAAHJpAAHiMAGBqAgHgOgFAmkAAqgQA3CEQgFkJAHjCFwQCwBCny+Uy+gZgkNPHpzcAiHobfQAA8HoCAACCBAAABHkIENp+LL7FAEkeAgRu8jVHmJcAAB4mEOC4BACwGYEA+yUAgGEEAowjAIDdEgiwHQEAHJZAgMcJAGBaAgFuEwBAlkCgTAAA3CAQmJkAAHiQQODIBADARgQCeyYAAAYRCIwkAAB2SiCwJQEAcFACgWcIAIBJCQTuEQAAUQKhTQAAcJVAmJsAAOAhAuHYBAAAmxAI+yYAABhCIIwlAADYJYGwLQEAwCEJhOcIAACmJBDuEwAAJNUDQQAAwBWzB4IAAIAHHD0QBAAAbGDvgSAAAGCA0YEgAABgh7YOBAEAAAf0bCAIAACY0FogCAAACHobfQAA8HoCAACCBAAABAkAAAgSAAAQJAAAIEgAAECQAACAIAEAAEECAACCBAAABAkAAAgSAAAQJAAAIEgAAEDQf5pXFokUyDSTAAAAAElFTkSuQmCC)}.os-icon.linux{background-image:url(data:image/png;base64,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)}.os-icon.android{background-image:url(data:image/png;base64,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)}.os-icon.other{background-image:url(data:image/png;base64,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)}::ng-deep .date-time-container.data-table-date-time{position:fixed;z-index:9999}::ng-deep .date-time-container.data-table-date-time .p-calendar .p-inputtext{height:.0625rem;width:.0625rem;padding:0}::ng-deep .date-time-container.data-table-date-time .filter-button-container{height:3.125rem;display:flex;flex-direction:row;justify-content:center;align-items:center}::ng-deep .date-time-container.data-table-date-time .filter-button-container .toggleButton{padding-left:var(--paddingSmall);padding-right:var(--paddingSmall);text-align:center;background-color:var(--inputBorder);color:var(--tableText);width:unset;height:1.4375rem;line-height:1.4375rem;font-size:.875rem;font-weight:600;position:relative;float:left;cursor:pointer;border-radius:.25rem;margin-right:var(--marginSmall);transition:.3s}::ng-deep .date-time-container.data-table-date-time .filter-button-container .toggleButton:hover{filter:brightness(90%);transition:.3s}::ng-deep .date-time-container.data-table-date-time .p-calendar .p-inputtext{border-top-left-radius:1.25rem;border-bottom-left-radius:1.25rem;text-indent:.3125rem}::ng-deep .date-time-container.data-table-date-time .p-calendar .p-button-icon-only{border-top-right-radius:1.25rem;border-bottom-right-radius:1.25rem}::ng-deep .tag-selector-container.data-table-tag-selector{position:fixed;z-index:9999;width:21.875rem;height:-moz-fit-content;height:fit-content;background:var(--formBackground);display:flex;flex-direction:column;justify-content:flex-end;padding:.625rem;border-radius:var(--inputBorderRadius);box-shadow:var(--shadowLarge);margin-top:-1.25rem;border-color:var(--stroke);border-style:solid}::ng-deep .tag-selector-container.data-table-tag-selector .tag-selector-label{margin-bottom:.3125rem;margin-left:.125rem;font-weight:600;color:var(--menu)}::ng-deep .tag-selector-container.data-table-tag-selector .select2-search__field{height:2.1875rem}::ng-deep .tag-selector-container.data-table-tag-selector .nf-select2-dropdown{width:calc(100% - 1.25rem)!important}::ng-deep .tag-selector-container .icon-close{position:absolute;top:.5rem;right:.5rem;cursor:pointer;color:var(--icon);font-weight:600}::ng-deep .tag-selector-container .icon-close:hover{filter:brightness(50%)}\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.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: i9.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "component", type: i4$1.Calendar, selector: "p-calendar", inputs: ["style", "styleClass", "inputStyle", "inputId", "name", "inputStyleClass", "placeholder", "ariaLabelledBy", "ariaLabel", "iconAriaLabel", "disabled", "dateFormat", "multipleSeparator", "rangeSeparator", "inline", "showOtherMonths", "selectOtherMonths", "showIcon", "icon", "appendTo", "readonlyInput", "shortYearCutoff", "monthNavigator", "yearNavigator", "hourFormat", "timeOnly", "stepHour", "stepMinute", "stepSecond", "showSeconds", "required", "showOnFocus", "showWeek", "showClear", "dataType", "selectionMode", "maxDateCount", "showButtonBar", "todayButtonStyleClass", "clearButtonStyleClass", "autoZIndex", "baseZIndex", "panelStyleClass", "panelStyle", "keepInvalid", "hideOnDateTimeSelect", "touchUI", "timeSeparator", "focusTrap", "showTransitionOptions", "hideTransitionOptions", "tabindex", "minDate", "maxDate", "disabledDates", "disabledDays", "yearRange", "showTime", "responsiveOptions", "numberOfMonths", "firstDayOfWeek", "locale", "view", "defaultDate"], outputs: ["onFocus", "onBlur", "onClose", "onSelect", "onClear", "onInput", "onTodayClick", "onClearClick", "onMonthChange", "onYearChange", "onClickOutside", "onShow"] }, { kind: "component", type: i7.AgGridAngular, selector: "ag-grid-angular", inputs: ["gridOptions", "modules", "statusBar", "sideBar", "suppressContextMenu", "preventDefaultOnContextMenu", "allowContextMenuWithControlKey", "columnMenu", "suppressMenuHide", "enableBrowserTooltips", "tooltipTrigger", "tooltipShowDelay", "tooltipHideDelay", "tooltipMouseTrack", "tooltipShowMode", "tooltipInteraction", "popupParent", "copyHeadersToClipboard", "copyGroupHeadersToClipboard", "clipboardDelimiter", "suppressCopyRowsToClipboard", "suppressCopySingleCellRanges", "suppressLastEmptyLineOnPaste", "suppressClipboardPaste", "suppressClipboardApi", "suppressCutToClipboard", "columnDefs", "defaultColDef", "defaultColGroupDef", "columnTypes", "dataTypeDefinitions", "maintainColumnOrder", "suppressFieldDotNotation", "headerHeight", "groupHeaderHeight", "floatingFiltersHeight", "pivotHeaderHeight", "pivotGroupHeaderHeight", "allowDragFromColumnsToolPanel", "suppressMovableColumns", "suppressColumnMoveAnimation", "suppressDragLeaveHidesColumns", "suppressRowGroupHidesColumns", "colResizeDefault", "suppressAutoSize", "autoSizePadding", "skipHeaderOnAutoSize", "autoSizeStrategy", "components", "editType", "singleClickEdit", "suppressClickEdit", "readOnlyEdit", "stopEditingWhenCellsLoseFocus", "enterMovesDown", "enterMovesDownAfterEdit", "enterNavigatesVertically", "enterNavigatesVerticallyAfterEdit", "enableCellEditingOnBackspace", "undoRedoCellEditing", "undoRedoCellEditingLimit", "defaultCsvExportParams", "suppressCsvExport", "defaultExcelExportParams", "suppressExcelExport", "excelStyles", "quickFilterText", "cacheQuickFilter", "excludeHiddenColumnsFromQuickFilter", "includeHiddenColumnsInQuickFilter", "quickFilterParser", "quickFilterMatcher", "applyQuickFilterBeforePivotOrAgg", "excludeChildrenWhenTreeDataFiltering", "enableAdvancedFilter", "advancedFilterModel", "includeHiddenColumnsInAdvancedFilter", "advancedFilterParent", "advancedFilterBuilderParams", "suppressAdvancedFilterEval", "enableCharts", "chartThemes", "customChartThemes", "chartThemeOverrides", "enableChartToolPanelsButton", "suppressChartToolPanelsButton", "chartToolPanelsDef", "chartMenuItems", "loadingCellRenderer", "loadingCellRendererParams", "loadingCellRendererSelector", "localeText", "masterDetail", "keepDetailRows", "keepDetailRowsCount", "detailCellRenderer", "detailCellRendererParams", "detailRowHeight", "detailRowAutoHeight", "context", "alignedGrids", "tabIndex", "rowBuffer", "valueCache", "valueCacheNeverExpires", "enableCellExpressions", "suppressParentsInRowNodes", "suppressTouch", "suppressFocusAfterRefresh", "suppressAsyncEvents", "suppressBrowserResizeObserver", "suppressPropertyNamesCheck", "suppressChangeDetection", "debug", "overlayLoadingTemplate", "loadingOverlayComponent", "loadingOverlayComponentParams", "suppressLoadingOverlay", "overlayNoRowsTemplate", "noRowsOverlayComponent", "noRowsOverlayComponentParams", "suppressNoRowsOverlay", "pagination", "paginationPageSize", "paginationPageSizeSelector", "paginationAutoPageSize", "paginateChildRows", "suppressPaginationPanel", "pivotMode", "pivotPanelShow", "pivotMaxGeneratedColumns", "pivotDefaultExpanded", "pivotColumnGroupTotals", "pivotRowTotals", "pivotSuppressAutoColumn", "suppressExpandablePivotGroups", "functionsReadOnly", "aggFuncs", "suppressAggFuncInHeader", "alwaysAggregateAtRootLevel", "suppressAggAtRootLevel", "aggregateOnlyChangedColumns", "suppressAggFilteredOnly", "removePivotHeaderRowWhenSingleValueColumn", "animateRows", "enableCellChangeFlash", "cellFlashDuration", "cellFlashDelay", "cellFadeDuration", "cellFadeDelay", "allowShowChangeAfterFilter", "domLayout", "ensureDomOrder", "enableRtl", "suppressColumnVirtualisation", "suppressMaxRenderedRowRestriction", "suppressRowVirtualisation", "rowDragManaged", "suppressRowDrag", "suppressMoveWhenRowDragging", "rowDragEntireRow", "rowDragMultiRow", "rowDragText", "fullWidthCellRenderer", "fullWidthCellRendererParams", "embedFullWidthRows", "suppressGroupMaintainValueType", "groupDisplayType", "groupDefaultExpanded", "autoGroupColumnDef", "groupMaintainOrder", "groupSelectsChildren", "groupLockGroupColumns", "groupAggFiltering", "groupIncludeFooter", "groupIncludeTotalFooter", "groupTotalRow", "grandTotalRow", "suppressStickyTotalRow", "groupSuppressBlankHeader", "groupSelectsFiltered", "showOpenedGroup", "groupRemoveSingleChildren", "groupRemoveLowestSingleChildren", "groupHideOpenParents", "groupAllowUnbalanced", "rowGroupPanelShow", "groupRowRenderer", "groupRowRendererParams", "suppressMakeColumnVisibleAfterUnGroup", "treeData", "rowGroupPanelSuppressSort", "suppressGroupRowsSticky", "pinnedTopRowData", "pinnedBottomRowData", "rowModelType", "rowData", "asyncTransactionWaitMillis", "suppressModelUpdateAfterUpdateTransaction", "datasource", "cacheOverflowSize", "infiniteInitialRowCount", "serverSideInitialRowCount", "suppressServerSideInfiniteScroll", "suppressServerSideFullWidthLoadingRow", "cacheBlockSize", "maxBlocksInCache", "maxConcurrentDatasourceRequests", "blockLoadDebounceMillis", "purgeClosedRowNodes", "serverSideDatasource", "serverSideSortAllLevels", "serverSideEnableClientSideSort", "serverSideOnlyRefreshFilteredGroups", "serverSideFilterAllLevels", "serverSideSortOnServer", "serverSideFilterOnServer", "serverSidePivotResultFieldSeparator", "viewportDatasource", "viewportRowModelPageSize", "viewportRowModelBufferSize", "alwaysShowHorizontalScroll", "alwaysShowVerticalScroll", "debounceVerticalScrollbar", "suppressHorizontalScroll", "suppressScrollOnNewData", "suppressScrollWhenPopupsAreOpen", "suppressAnimationFrame", "suppressMiddleClickScrolls", "suppressPreventDefaultOnMouseWheel", "scrollbarWidth", "rowSelection", "rowMultiSelectWithClick", "suppressRowDeselection", "suppressRowClickSelection", "suppressCellFocus", "suppressHeaderFocus", "suppressMultiRangeSelection", "enableCellTextSelection", "enableRangeSelection", "enableRangeHandle", "enableFillHandle", "fillHandleDirection", "suppressClearOnFillReduction", "sortingOrder", "accentedSort", "unSortIcon", "suppressMultiSort", "alwaysMultiSort", "multiSortKey", "suppressMaintainUnsortedOrder", "icons", "rowHeight", "rowStyle", "rowClass", "rowClassRules", "suppressRowHoverHighlight", "suppressRowTransform", "columnHoverHighlight", "gridId", "deltaSort", "treeDataDisplayType", "functionsPassive", "enableGroupEdit", "initialState", "getContextMenuItems", "getMainMenuItems", "postProcessPopup", "processUnpinnedColumns", "processCellForClipboard", "processHeaderForClipboard", "processGroupHeaderForClipboard", "processCellFromClipboard", "sendToClipboard", "processDataFromClipboard", "isExternalFilterPresent", "doesExternalFilterPass", "getChartToolbarItems", "createChartContainer", "navigateToNextHeader", "tabToNextHeader", "navigateToNextCell", "tabToNextCell", "getLocaleText", "getDocument", "paginationNumberFormatter", "getGroupRowAgg", "isGroupOpenByDefault", "initialGroupOrderComparator", "processPivotResultColDef", "processPivotResultColGroupDef", "getDataPath", "getChildCount", "getServerSideGroupLevelParams", "isServerSideGroupOpenByDefault", "isApplyServerSideTransaction", "isServerSideGroup", "getServerSideGroupKey", "getBusinessKeyForNode", "getRowId", "resetRowDataOnUpdate", "processRowPostCreate", "isRowSelectable", "isRowMaster", "fillOperation", "postSortRows", "getRowStyle", "getRowClass", "getRowHeight", "isFullWidthRow"], outputs: ["toolPanelVisibleChanged", "toolPanelSizeChanged", "columnMenuVisibleChanged", "contextMenuVisibleChanged", "cutStart", "cutEnd", "pasteStart", "pasteEnd", "columnVisible", "columnPinned", "columnResized", "columnMoved", "columnValueChanged", "columnPivotModeChanged", "columnPivotChanged", "columnGroupOpened", "newColumnsLoaded", "gridColumnsChanged", "displayedColumnsChanged", "virtualColumnsChanged", "columnEverythingChanged", "columnHeaderMouseOver", "columnHeaderMouseLeave", "columnHeaderClicked", "columnHeaderContextMenu", "componentStateChanged", "cellValueChanged", "cellEditRequest", "rowValueChanged", "cellEditingStarted", "cellEditingStopped", "rowEditingStarted", "rowEditingStopped", "undoStarted", "undoEnded", "redoStarted", "redoEnded", "rangeDeleteStart", "rangeDeleteEnd", "fillStart", "fillEnd", "filterOpened", "filterChanged", "filterModified", "advancedFilterBuilderVisibleChanged", "chartCreated", "chartRangeSelectionChanged", "chartOptionsChanged", "chartDestroyed", "cellKeyDown", "gridReady", "gridPreDestroyed", "firstDataRendered", "gridSizeChanged", "modelUpdated", "virtualRowRemoved", "viewportChanged", "bodyScroll", "bodyScrollEnd", "dragStarted", "dragStopped", "stateUpdated", "paginationChanged", "rowDragEnter", "rowDragMove", "rowDragLeave", "rowDragEnd", "columnRowGroupChanged", "rowGroupOpened", "expandOrCollapseAll", "pivotMaxColumnsExceeded", "pinnedRowDataChanged", "rowDataUpdated", "asyncTransactionsFlushed", "storeRefreshed", "cellClicked", "cellDoubleClicked", "cellFocused", "cellMouseOver", "cellMouseOut", "cellMouseDown", "rowClicked", "rowDoubleClicked", "rowSelected", "selectionChanged", "cellContextMenu", "rangeSelectionChanged", "tooltipShow", "tooltipHide", "sortChanged", "columnRowGroupChangeRequest", "columnPivotChangeRequest", "columnValueChangeRequest", "columnAggFuncChangeRequest"] }, { kind: "directive", type: i2.ClickOutsideDirective, selector: "[clickOutside]", inputs: ["clickOutsideEnabled", "attachOutsideOnClick", "delayClickOutsideInit", "emitOnBlur", "exclude", "excludeBeforeClick", "clickOutsideEvents"], outputs: ["clickOutside"] }, { kind: "component", type: FilterBarComponent, selector: "lib-table-filter-bar", inputs: ["filterName", "filterColumn", "startCount", "endCount", "totalCount", "currentPage"] }, { kind: "component", type: HiddenColumnsBarComponent, selector: "lib-table-hidden-columns-bar", inputs: ["hiddenColumns"], outputs: ["columnVisibilityChanged"] }, { kind: "component", type: NoItemsComponent, selector: "lib-no-items", inputs: ["image", "typeName", "isEmpty", "hasAdd", "hiddenResults", "isLoading"], outputs: ["clickEmit", "refresh"] }, { kind: "component", type: TagSelectorComponent, selector: "lib-tag-selector", inputs: ["placeholder", "disableField", "disableCreate", "hideOption", "isLoading", "errorMessage", "focusOnInit", "selectedRoleAttributes", "selectedNamedAttributes", "hasError", "availableRoleAttributes", "availableNamedAttributes"], outputs: ["addRoleAttribute", "addNamedAttribute", "roleAttributeRemoved", "namedAttributeRemoved", "selectedRoleAttributesChange", "selectedNamedAttributesChange", "filterChange"] }] }); }
8093
8150
  }
8094
8151
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DataTableComponent, decorators: [{
8095
8152
  type: Component,
8096
- args: [{ selector: 'lib-data-table', template: "<div #tableContainer class=\"data-table-container\" *ngIf=\"showTable;else nodata\">\n <lib-table-filter-bar\n [startCount]=\"startCount\"\n [endCount]=\"endCount\"\n [totalCount]=\"totalCount\"\n [currentPage]=\"currentPage\"\n [filterName]=\"filterName\"\n [filterColumn]=\"filterColumn\"\n ></lib-table-filter-bar>\n <lib-table-hidden-columns-bar\n *ngIf=\"gridRendered && showFilterBar\"\n [hiddenColumns]=\"hiddenColumns\"\n (columnVisibilityChanged)=\"columnVisibilityChanged($event)\"\n ></lib-table-hidden-columns-bar>\n <div (resize)=\"resizeGridColumnsDebounced($event)\" class=\"ziti-ag-grid\" id=\"ItemTable\">\n <ag-grid-angular\n #nfAgGrid\n [columnDefs]=\"mergedColumnDefinitions\"\n [components]=\"frameworkComponents\"\n [getDataPath]=\"svc.getDataPath\"\n [getRowId]=\"svc.getRowNodeId\"\n [gridOptions]=\"gridOptions\"\n [modules]=\"gridModules\"\n [rowData]=\"rowData\"\n [tooltipHideDelay]=\"20000\"\n [tooltipShowDelay]=\"0\"\n (gridReady)=\"onGridReady($event)\"\n class=\"ziti-ag-grid-table ag-theme-alpine rows\"\n id=\"ItemGrid\"\n >\n </ag-grid-angular>\n </div>\n <div\n [ngClass]=\"{ open: openHeaderMenu }\"\n [ngStyle]=\"{ left: menuLeft + 'px', top: menuTop + 'px' }\"\n class=\"tMenu action-menu header-menu\"\n id=\"HeaderActionMenu\"\n >\n <div (click)=\"resetTableColumns()\" class=\"tActionRow\" id=\"ResetTableButton\">Restore Default Table</div>\n <div\n *ngFor=\"let headerAction of headerActions\"\n (click)=\"actionRequested.emit({ action: headerAction.action })\"\n class=\"tActionRow\"\n id=\"ResetTableButton\"\n >\n {{headerAction.name || headerAction.label}}\n </div>\n </div>\n <div\n [ngClass]=\"{ open: openMenu }\"\n [ngStyle]=\"{ left: menuLeft + 'px', top: menuTop + 'px' }\"\n class=\"tMenu action-menu item-menu\"\n id=\"RowActionMenu\"\n #contextMenu\n >\n <div\n *ngFor=\"let menuItem of menuItems\"\n (click)=\"actionRequested.emit({ action: menuItem.action, item: selectedItem })\"\n [ngClass]=\"{'menu-item-hidden': hideMenuItem(menuItem, selectedItem) }\"\n class=\"tActionRow\"\n id=\"TableActionButton_{{menuItem.action}}\"\n >\n {{menuItem.name || menuItem.label}}\n </div>\n </div>\n <div\n (clickOutside)=\"closeHeaderFilter($event)\"\n [ngClass]=\"{ open: showFilterOptions }\"\n [ngStyle]=\"{ left: menuLeft + 'px', top: menuTop + 'px' }\"\n class=\"tMenu action-menu header-menu\"\n id=\"HeaderFilterOptions\"\n >\n <div (click)=\"applyFilter($event, filter)\" *ngFor=\"let filter of filterOptions\" class=\"tActionRow\" [ngClass]=\"{'has-icon': filter.icon}\" [id]=\"filter.columnId\">\n <span *ngIf=\"filter.bubbleClass\" [ngClass]=\"filter.bubbleClass\" class=\"bubble\">\n <svg *ngIf=\"filter.showLoader\" class=\"circular\" viewBox=\"25 25 50 50\">\n <circle\n class=\"path\"\n cx=\"50\"\n cy=\"50\"\n fill=\"none\"\n r=\"20\"\n stroke-miterlimit=\"10\"\n stroke-width=\"3\"\n ></circle>\n </svg>\n </span>\n <span *ngIf=\"filter.icon\" class=\"os-icon {{filter.icon}}\"></span>\n {{ filter.label }}\n </div>\n </div>\n</div>\n\n<div *ngIf=\"showDateTimePicker\" class=\"date-time-container data-table-date-time\" [ngStyle]=\"{ left: menuLeft + 'px', top: menuTop + 'px' }\" (clickOutside)=\"closeDateTime($event)\">\n <p-calendar\n [(ngModel)]=\"dateValue\"\n (onSelect)=\"setDateRangeFilter('custom')\"\n dateFormat=\"mm/dd/yy\"\n selectionMode=\"range\"\n placeholder=\"Select Time Range\"\n #calendar\n >\n <ng-template pTemplate=\"header\">\n <div class=\"filter-button-container\">\n <div\n class=\"toggleButton\"\n [ngClass]=\"{selected: selectedRange === 'hour'}\"\n (click)=\"setDateRangeFilter('hour')\"\n >\n Last Hour\n </div>\n <div\n class=\"toggleButton\"\n (click)=\"setDateRangeFilter('day')\"\n [ngClass]=\"{selected: selectedRange === 'day'}\"\n >\n Last Day\n </div>\n <div\n class=\"toggleButton\"\n (click)=\"setDateRangeFilter('week')\"\n [ngClass]=\"{selected: selectedRange === 'week'}\"\n >\n Last Week\n </div>\n <div\n class=\"toggleButton\"\n (click)=\"setDateRangeFilter('month')\"\n [ngClass]=\"{selected: selectedRange === 'month'}\"\n >\n Last Month\n </div>\n </div>\n </ng-template>\n </p-calendar>\n</div>\n\n<div *ngIf=\"showTagSelector\" class=\"tag-selector-container data-table-tag-selector\" [ngStyle]=\"{ left: menuLeft + 'px', top: menuTop + 'px' }\" (clickOutside)=\"closeTagSelector($event)\">\n <div class=\"buttonBall icon-close\" (click)=\"closeTagSelector($event)\"></div>\n <div class=\"tag-selector-label\">\n <span>Select an Attribute:</span>\n </div>\n <lib-tag-selector\n [focusOnInit]=\"true\"\n [availableRoleAttributes]=\"roleAttributes\"\n [availableNamedAttributes]=\"namedAttributes\"\n [(selectedRoleAttributes)]=\"selectedRoleAttributes\"\n [(selectedNamedAttributes)]=\"selectedNamedAttributes\"\n (selectedNamedAttributesChange)=\"tagSelectionChanged($event, false)\"\n (selectedRoleAttributesChange)=\"tagSelectionChanged($event, true)\"\n ></lib-tag-selector>\n</div>\n<ng-template #nodata>\n <lib-no-items\n (clickEmit)=\"openCreate()\"\n [image]=\"noItemsImage\"\n [isEmpty]=\"!rowData || rowData.length === 0\"\n [typeName]=\"this.entityTypeLabel\"\n ></lib-no-items>\n</ng-template>", styles: [".data-table-container{display:flex;position:relative;height:calc(100% - 5.625rem);width:100%;flex-direction:column}.data-table-container .ziti-ag-grid{position:relative;width:100%;height:100%;display:flex;clear:both;align-items:center;justify-content:center}.data-table-container .ziti-ag-grid .ziti-ag-grid-table{height:100%;width:100%}.data-table-container .tMenu.action-menu.header-menu,.data-table-container .tMenu.action-menu.item-menu{position:fixed;height:unset;width:12.5rem;transition-property:opacity}.data-table-container .tMenu.action-menu.header-menu .tActionRow,.data-table-container .tMenu.action-menu.item-menu .tActionRow{display:flex;color:var(--offWhite_ALWAYS)}.data-table-container .tMenu.action-menu.header-menu .tActionRow.menu-item-hidden,.data-table-container .tMenu.action-menu.item-menu .tActionRow.menu-item-hidden{display:none}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper{border:none}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-body-vertical-scroll-viewport{background-color:var(--formBackground)}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row{border:none;background-color:var(--formBackground);color:var(--text)}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.row-invalid{background-color:var(--invalid)!important}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.row-invalid.row-copied{background-color:var(--copiedRow)!important}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.row-copied{background-color:var(--copiedRow)!important}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.ag-row-selected{background-color:var(--formBackground)}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.ag-row-selected.ag-row-hover{background-color:#2196f31a}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.ag-row-odd{background:var(--white)}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.ag-row-odd.ag-row-selected{background-color:var(--shaded)}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.ag-row-odd.ag-row-selected.ag-row-hover{background-color:#2196f31a}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.ag-row-odd.ag-row-hover{background-color:#2196f31a}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.ag-row-hover{background-color:#2196f31a}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row .dots{right:1.5625rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.row-role-item .tCol{font-size:.8125rem;height:2.1875rem;line-height:2.1875rem;font-weight:600}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-cell{border:none}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-cell.ag-cell-value.ziti-table-cell-error{outline:.125rem var(--red) solid;outline-offset:-.1875rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-cell.ag-cell-value.ag-cell-inline-editing{width:100%;height:100%;padding-left:0}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-header-cell:focus:after{border:none}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-pinned-left-header{border:none}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-pinned-left-header .ag-icon-pin{margin-top:.9375rem;transform:rotate(-45deg)}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-pinned-left-header .ag-header-cell-text{cursor:default}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-pinned-left-header .ag-header-col-pin-button:hover .ag-icon-pin{animation-name:unpinColumn;animation-duration:.5s;animation-delay:.1s;animation-iteration-count:1;animation-fill-mode:forwards}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-header-col-pin-button:hover .ag-icon-pin{animation-name:pinColumn;animation-duration:.6s;animation-delay:.1s;animation-iteration-count:1;animation-fill-mode:forwards}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row-level-1 app-table-cell-resource-status app-resource-status{margin-left:2.5rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row-level-1 app-table-cell-resource-status app-resource-status .bubble{height:.6875rem;width:.6875rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row-level-1 app-table-cell-resource-status app-resource-status .bubble .circular{margin-left:2.5rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-icon-eye-slash{margin-top:.75rem;margin-right:.3125rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-icon-pin{margin-top:.75rem}@keyframes pinColumn{0%{transform:rotate(0);margin-top:.75rem}15%{transform:rotate(-10deg);margin-top:.75rem}30%{transform:rotate(-20deg);margin-top:.75rem}45%{transform:rotate(-30deg);margin-top:.8125rem}60%{transform:rotate(-40deg);margin-top:.875rem}75%{transform:rotate(-45deg);margin-top:.9375rem}to{transform:rotate(-45deg);margin-top:1rem}}@keyframes unpinColumn{0%{transform:rotate(-45deg);margin-top:.9375rem}15%{transform:rotate(-45deg);margin-top:.875rem}30%{transform:rotate(-45deg);margin-top:.8125rem}45%{transform:rotate(-40deg);margin-top:.75rem}60%{transform:rotate(-30deg);margin-top:.6875rem}75%{transform:rotate(-20deg);margin-top:.625rem}90%{transform:rotate(-10deg);margin-top:.5625rem}to{transform:rotate(0);margin-top:.5rem}}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-pinned-right-header{border:none}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .selectHeader{background-image:none}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .menuHeader{background-image:none}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-pinned-right-header .ag-header-row:after{height:0}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-horizontal-left-spacer{border:none}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-horizontal-right-spacer{border:none}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-header-cell-resize{margin-top:.125rem;border-left-color:#d4d9e2;border-right-color:#d4d9e2;border-left-width:.0625rem;border-right-width:.0625rem;border-left-style:solid;border-right-style:solid;width:.1875rem;height:.875rem;position:absolute;right:.125rem;top:1.1875rem;cursor:col-resize}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-header-cell-resize:after{display:none}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-header-cell-text{height:3rem;cursor:move;color:var(--text);line-height:3.4375rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-icon-menu{margin-top:.25rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-menu{margin-left:-2.8125rem;z-index:99999999}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-header-cell{padding-right:.3125rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-input-field-input{height:100%;margin-right:0;width:100%;box-shadow:0 0 .3125rem 0 var(--primary);border:solid .125rem var(--primary);overflow:visible}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-checkbox-input-wrapper .ag-input-field-input{border:none}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-header-viewport{box-sizing:border-box;border-bottom:.25rem solid var(--primary);background-color:var(--formBackground);padding-left:.25rem;line-height:3.4375rem;position:sticky!important;top:0;z-index:10;transition:all .15s linear;opacity:.97}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-cell-label-container{cursor:default}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-cell-label-container.nf-can-sort{cursor:pointer}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-header{background-color:var(--navigation);border-bottom:solid .0625rem;border-bottom-color:var(--navigation)}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-header-icon{color:var(--icon)}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-icon-pin{font-weight:800;margin-right:.3125rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-icon-menu{font-weight:800}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-icon-eye-slash{font-weight:800;color:var(--icon)}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-header-cell-resize{border-left-color:var(--stroke);border-right-color:var(--stroke);border-left-width:var(--inputBorderWidth);border-right-width:var(--inputBorderWidth);border-left-style:solid;border-right-style:solid;width:.3125rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-header-cell-resize:hover{border-left-color:var(--icon);border-right-color:var(--icon)}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-header-viewport,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-floating-top-viewport,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-body-viewport,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-center-cols-viewport,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-floating-bottom-viewport,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-body-horizontal-scroll-viewport,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-virtual-list-viewport{background-color:var(--navigation)}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-theme-alpine .ag-row{background-color:var(--navigation)}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .tSelect{left:1.25rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-pinned-left-shadow{box-shadow:.5rem 0 .3125rem -.25rem #dddd;z-index:40}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-pinned-right-shadow{box-shadow:-.5rem 0 .3125rem -.25rem #dddd;z-index:40}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-pinned-left-header .ag-header-row-column{border-bottom-style:solid;border-bottom-width:.25rem;border-bottom-color:var(--stroke)}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-pinned-right-header .ag-header-row-column{border-bottom-style:solid;border-bottom-width:.25rem;border-bottom-color:var(--stroke)}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-pinned-right-header .dots{right:.25rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-cell{-webkit-user-select:text;user-select:text}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-body-viewport .ag-cell{padding-left:1.25rem;text-align:left;line-height:3.0625rem!important}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-pinned-left-cols-container .ag-row{border-left:.25rem solid transparent}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-pinned-left-cols-container .ag-row-hover{border-left:.25rem solid var(--primary)}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-pinned-left-cols-container .tSelect{margin-left:-.25rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-cell-label-container .ag-header-col-hide-button,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-cell-label-container .ag-header-col-pin-button,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-cell-label-container .ag-header-col-filter-button{margin-top:.3125rem;opacity:0;transition:opacity .2s;height:2.5rem;cursor:pointer}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-cell-label-container .ag-header-col-hide-button.nf-ag-col-pinned,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-cell-label-container .ag-header-col-pin-button.nf-ag-col-pinned,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-cell-label-container .ag-header-col-filter-button.nf-ag-col-pinned{opacity:1}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-cell-label-container .ag-header-col-hide-button:hover .ag-icon-eye-slash,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-cell-label-container .ag-header-col-hide-button:hover .ag-icon-pin,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-cell-label-container .ag-header-col-hide-button:hover .ag-icon-filter,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-cell-label-container .ag-header-col-pin-button:hover .ag-icon-eye-slash,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-cell-label-container .ag-header-col-pin-button:hover .ag-icon-pin,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-cell-label-container .ag-header-col-pin-button:hover .ag-icon-filter,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-cell-label-container .ag-header-col-filter-button:hover .ag-icon-eye-slash,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-cell-label-container .ag-header-col-filter-button:hover .ag-icon-pin,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-cell-label-container .ag-header-col-filter-button:hover .ag-icon-filter{color:var(--ag-alpine-active-color, var(--primary))}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-cell-label-container .ag-header-col-hide-button .ag-icon-filter,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-cell-label-container .ag-header-col-pin-button .ag-icon-filter,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-cell-label-container .ag-header-col-filter-button .ag-icon-filter{font-weight:700;margin-top:.8125rem;margin-right:0rem;margin-left:-.0625rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-cell-label-container .ag-header-col-hide-button,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-cell-label-container .ag-header-col-pin-button{position:absolute;margin-top:.625rem!important}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-cell-label-container .ag-header-col-hide-button{margin-right:1.3125rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-cell-label-container:hover .ag-header-col-hide-button,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-cell-label-container:hover .ag-header-col-pin-button,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-cell-label-container:hover .ag-header-col-filter-button{position:relative;display:block;opacity:1}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-cell-label-container:hover .ag-header-col-hide-button{margin-right:0rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .tSelectHeader{top:.75rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-header-cell{padding-left:0rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-sort-descending-icon{margin-top:.9375rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .nf-ag-main-col .ag-cell-label-container{margin-left:-.5rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .nf-ag-main-col .ag-cell-label-container .ag-header-cell-text{padding-left:.1875rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ziti-ag-grid .ag-root-wrapper .ag-row.row-child{background-color:#fff;border-bottom:solid var(--stroke) .0625rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper app-table-column-default{width:100%}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper app-table-cell-registration{width:100%}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper app-table-cell-registration .tcol{width:100%}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.ag-row-even.row-child.row-child-odd,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.ag-row-odd.row-child.row-child-odd{background-color:var(--table)}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.ag-row-even.row-child.row-child-odd.row-role-item,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.ag-row-odd.row-child.row-child-odd.row-role-item{background-color:var(--shaded);border:none}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.ag-row-even.row-child.row-child-odd.row-role-item.ag-row-hover,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.ag-row-odd.row-child.row-child-odd.row-role-item.ag-row-hover{background-color:#2196f31a}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.ag-row-even.row-child.row-child-odd.row-child-second,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.ag-row-odd.row-child.row-child-odd.row-child-second{background-color:var(--shaded)}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.ag-row-even.row-child.row-child-odd.row-child-second.row-child-header,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.ag-row-odd.row-child.row-child-odd.row-child-second.row-child-header{background-color:var(--shaded)}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.ag-row-even.row-child.row-child-odd.row-child-warn,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.ag-row-odd.row-child.row-child-odd.row-child-warn{background-color:var(--copiedRow)}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.ag-row-even.row-child.row-child-odd.row-child-header,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.ag-row-odd.row-child.row-child-odd.row-child-header{background-color:var(--shaded)}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.ag-row-even.row-child.row-child-even,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.ag-row-odd.row-child.row-child-even{background-color:var(--shaded)}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.ag-row-even.row-child.row-child-even.row-role-item,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.ag-row-odd.row-child.row-child-even.row-role-item{background-color:var(--table);border:none}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.ag-row-even.row-child.row-child-even.row-role-item.ag-row-hover,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.ag-row-odd.row-child.row-child-even.row-role-item.ag-row-hover{background-color:#2196f31a}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.ag-row-even.row-child.row-child-even.row-child-second,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.ag-row-odd.row-child.row-child-even.row-child-second{background-color:var(--table)}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.ag-row-even.row-child.row-child-even.row-child-second.row-child-header,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.ag-row-odd.row-child.row-child-even.row-child-second.row-child-header{background-color:var(--table)}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.ag-row-even.row-child.row-child-even.row-child-warn,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.ag-row-odd.row-child.row-child-even.row-child-warn{background-color:var(--copiedRow)}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.ag-row-even.row-child.row-child-even.row-child-header,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.ag-row-odd.row-child.row-child-even.row-child-header{background-color:var(--table)}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .row-child{border-top:solid var(--stroke) .0625rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .row-child.row-child-second{border-top:transparent}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .row-child.row-child-second .ag-cell{font-size:.6875rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .row-child .bubble{width:.5rem;height:.5625rem;margin-left:.3125rem;margin-bottom:.0625rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .row-child .ag-cell{font-size:.8125rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .row-child app-resource-status{margin-left:1.4375rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .row-child app-resource-status .circular{height:.75rem;margin-left:1.125rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .row-child app-resource-status>span{font-size:.8125rem;margin-left:.25rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .row-child.row-child-second app-resource-status{margin-left:1.625rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .row-child.row-child-second app-resource-status .circular{margin-left:1.625rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .row-child.row-child-second app-resource-status>span{font-size:.8125rem;margin-left:.25rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .row-child-second .step-header-container .step-content{position:relative;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;flex-grow:1;flex-shrink:0;padding-right:.3125rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .row-child-second .step-header-container .step-label{padding-left:3.4375rem;margin-left:1.25rem;width:calc(20% + 1.25rem)}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .row-child-second .step-header-container .step-label.step-content{padding-left:0}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .row-child-second .step-header-container .started-label{width:calc(20% + 1.25rem);overflow:hidden;flex-grow:1;flex-shrink:0}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .row-child-second .step-header-container .finished-label{width:calc(20% + 1.25rem);overflow:hidden;flex-grow:1;flex-shrink:0}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .row-child-second .step-header-container .duration-label{width:calc(20% + 1.25rem);overflow:hidden;flex-grow:1;flex-shrink:0}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .row-child-second .step-header-container .state-label{width:calc(20% + 1.25rem);overflow:hidden;flex-grow:1;flex-shrink:0}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .process-info-container app-resource-status .circular{margin-left:.8125rem;margin-top:-.0625rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper app-table-cell-resource-status{width:100%;text-overflow:ellipsis;white-space:nowrap;overflow:hidden;margin-left:-.625rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper app-table-cell-resource-status .bubble{margin-left:.125rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper app-table-cell-resource-status .bubble .circular{left:0;top:1rem}.data-table-container ::ng-deep body{overflow-x:auto!important}.data-table-container ::ng-deep body .ag-theme-alpine.ag-dnd-ghost{height:2.1875rem!important;line-height:2.1875rem!important}.data-table-container ::ng-deep body .ag-header-row{box-sizing:border-box;border-bottom:.25rem solid var(--primary);background-color:var(--formBackground);padding-left:.25rem;line-height:3.4375rem;position:sticky!important;top:0;z-index:10;transition:all .15s linear;opacity:.97;color:var(--text)}.data-table-container ::ng-deep body .ag-header-cell-text{position:relative;float:left;color:var(--tableText);font-size:.875rem;font-weight:600;font-family:Open Sans;height:3.4375rem;transition:.5s;white-space:nowrap;color:var(--text)}.data-table-container ::ng-deep body .ag-header-cell-resize:after{display:none}.data-table-container ::ng-deep body .ag-header-cell-menu-button{height:1rem;width:1rem}.data-table-container ::ng-deep body .ag-icon{font-family:agGridAlpine;font-size:1rem;line-height:1rem;font-style:normal;font-weight:800;font-variant:normal;text-transform:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.data-table-container ::ng-deep body .ag-icon-menu:before{content:\"\\f11b\"}.data-table-container ::ng-deep body .ag-icon-menu:hover{color:var(--primary)}.data-table-container ::ng-deep body .ag-icon-asc{margin-top:.4375rem;font-weight:800}.data-table-container ::ng-deep body .ag-icon-desc{margin-top:-.4375rem;font-weight:800}.data-table-container ::ng-deep body .tSelectHeader{left:1.3125rem;top:.625rem}.data-table-container ::ng-deep body .cellMenu{overflow:visible}.data-table-container ::ng-deep body .ag-theme-alpine{-webkit-font-smoothing:antialiased;color:var(--tableText)!important;color:var(--ag-foreground-color, var(--tableText))!important;font-family:Open Sans,sans-serif;font-size:.8125rem;line-height:normal}.data-table-container ::ng-deep body .ag-theme-alpine .ag-row{color:var(--tableText)!important;color:var(--ag-foreground-color, var(--tableText))!important}.data-table-container ::ng-deep body .ag-theme-alpine .ag-header-cell,.data-table-container ::ng-deep body .ag-theme-alpine .ag-header-group-cell{padding-left:.3125rem;padding-right:.9375rem}.os-icon{width:1.4375rem;height:1.4375rem;background-size:1.4375rem 1.4375rem;display:inline-flex;margin-right:.5rem;margin-top:.3125rem;margin-bottom:.3125rem}.os-icon.empty{background:transparent}.os-icon.apple{background-image:url(data:image/png;base64,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)}.os-icon.windows{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAgAAAAIACAYAAAD0eNT6AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAN1wAADdcBQiibeAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAApdSURBVHic7dsxbttYGEZRylCfZAfpvYys23uYxuvI7EDTTBdJRCRTj3z3HECdDf+N9V0I1OlyuSwAQMvb6AMAgNcTAAAQJAAAIEgAAECQAACAIAEAAEECAACCBAAABAkAAAgSAAAQJAAAIEgAAECQAACAIAEAAEECAACCzqMPAAC+3unj8/uyLD9vvQQAABzQ2sAvy/Lt3u8LAADYoWcHfo0AAIABth74NQIAADYweuDXCAAAeMDeB36NAACAK44+8GsEAABJsw/8GgEAwJTqA79GAABwSAb+OQIAgF0y8NsSAAAMYeDHEgAAbMLA75sAAOAhBv7YBAAAVxn4uQkAgCgD3yYAACZl4LlHAAAclIHnGQIAYKcMPFsSAACDGHhGEgAAGzHw7JkAAHiQgefIBADADQaemQkAIMvAUyYAgGkZeLhNAACHZeDhcQIA2C0DD9sRAMAwBh7GEQDAZgw87JcAAB5m4OG4BABwk4GHeQkACDPw0CUAoO336AOAMd5GHwAAvJ4AAIAgAQAAQZ4BgA2tPWR3+fX+fchhQJ4AgCd4ih44KgEAdxh4YFYCgDQDD1QJAKZm4AGuEwAcmoEHeIwAYNcMPMA2BABDGXiAMQQAmzLwAPskAHiKgQc4JgHAXQYeYE4CIM7AAzQJgMkZeACuEQAHZ+ABeIQA2DkDD8AWBMBgBh6AEQTAxgw8AHskAJ5k4AE4IgGwwsADMKN8ABh4AIqmDwADDwB/OnwAGHgA+Hu7DwADDwBfb3gAGHgAeL3NA8DAA8D+PB0ABh4Ajmc1AAw8AMznbOABoOe8LMvv0UcAAK/1NvoAAOD1BAAABAkAAAgSAAAQJAAAIEgAAECQAACAIAEAAEECAACCBAAABAkAAAgSAAAQJAAAIEgAAECQAACAIAEAAEECAACCBAAABAkAAAgSAAAQJAAAIEgAAECQAACAIAEAAEECAACCBAAABAkAAAgSAAAQJAAAIEgAAECQAACAIAEAAEECAACCBAAABAkAAAgSAAAQJAAAIEgAAECQAACAIAEAAEECAACCBAAABAkAAAgSAAAQJAAAIEgAAECQAACAIAEAAEECAACCBAAABAkAAAgSAAAQJAAAIEgAAECQAACAIAEAAEECAACCBAAABAkAAAgSAAAQJAAAIEgAAECQAACAIAEAAEECAACCBAAABAkAAAgSAAAQJAAAIEgAAECQAACAIAEAAEECAACCBAAABAkAAAgSAAAQJAAAIEgAAECQAACAIAEAAEECAACCBAAABAkAAAgSAAAQJAAAIEgAAECQAACAIAEAAEECAACCBAAABAkAAAgSAAAQJAAAIEgAAECQAACAIAEAAEECAACCBAAABAkAAAgSAAAQJAAAIEgAAECQAACAIAEAAEECAACCBAAABAkAAAgSAAAQJAAAIEgAAECQAACAIAEAAEECAACCBAAABAkAAAgSAAAQJAAAIEgAAECQAACAIAEAAEECAACCBAAABAkAAAgSAAAQJAAAIEgAAECQAACAIAEAAEECAACCBAAABAkAAAgSAAAQJAAAIEgAAECQAACAIAEAAEECAACCBAAABAkAAAgSAAAQJAAAIEgAAECQAACAIAEAAEECAACCBAAABAkAAAgSAAAQJAAAIEgAAECQAACAIAEAAEECAACCBAAABAkAAAgSAAAQJAAAIEgAAECQAACAoNPlchl9AwDwYj4BAIAgAQAAQQIAAIIEAAAECQAACBIAABAkAAAgSAAAQJAAAIAgAQAAQQIAAIIEAAAECQAACBIAABAkAAAgSAAAQJAAAIAgAQAAQQIAAIIEAAAECQAACBIAABAkAAAgSAAAQJAAAIAgAQAAQQIAAIIEAAAECQAACBIAABAkAAAg6Hz6+LyMPgKqLr/eTyP/vv9/6PIJAAAECQAACBIAABAkAAAgSAAAQJAAAIAgAQAAQQIAAIIEAAAECQAACBIAABAkAAAgSAAAQJAAAIAgAQAAQQIAAIIEAAAECQAACBIAABAkAAAgSAAAQJAAAIAgAQAAQQIAAIIEAAAECQAACBIAABAkAAAgSAAAQJAAAIAgAQAAQQIAAIIEAAAECQAACBIAABAkAAAgSAAAQJAAAIAgAQAAQQIAAIIEAAAECQAACBIAABAkAAAgSAAAQJAAAIAgAQAAQQIAAIIEAAAECQAACBIAABAkAAAgSAAAQJAAAIAgAQAAQQIAAIIEAAAECQAACBIAABAkAAAgSAAAQJAAAIAgAQAAQQIAAIIEAAAECQAACBIAABAkAAAgSAAAQJAAAIAgAQAAQQIAAIIEAAAECQAACBIAABAkAAAgSAAAQJAAAIAgAQAAQQIAAIIEAAAECQAACBIAABAkAAAgSAAAQJAAAIAgAQAAQQIAAIIEAAAECQAACBIAABAkAAAgSAAAQJAAAIAgAQAAQQIAAIIEAAAECQAACBIAABAkAAAgSAAAQJAAAIAgAQAAQQIAAIIEAAAECQAACBIAABAkAAAgSAAAQJAAAIAgAQAAQQIAAIIEAAAECQAACBIAABAkAAAgSAAAQJAAAIAgAQAAQQIAAIIEAAAECQAACBIAABAkAAAgSAAAQJAAAIAgAQAAQQIAAIIEAAAECQAACBIAABAkAAAgSAAAQJAAAIAgAQAAQQIAAIIEAAAECQAACBIAABAkAAAgSAAAQJAAAIAgAQAAQQIAAIIEAAAECQAACBIAABAkAAAgSAAAQJAAAIAgAQAAQQIAAIIEAAAECQAACBIAABAkAAAgSAAAQJAAAIAgAQAAQedlWX4sy/Lzzuvb688CALZ0vvx6/3dZln/+f/3h9PH5fREIADCV89oPCAQAmM9qAKwRCABwPE8HwBqBAAD7s3kArBEIAPB6wwNgjUAAgK+3+wBYIxAA4O8dPgDWCAQA+NP0AbBGIABQlA+ANQIBgBkJgCcJBACOSABsTCAAsEcCYDCBAMAIAmDnBAIAWxAABycQAHiEAJicQADgGgEQJxAAmgQAdwkEgDkJAJ4iEACOSQCwKYEAsE8CgKEEAsAYAoBdEwgA2xAAHJpAAHiMAGBqAgHgOgFAmkAAqgQA3CEQgFkJAHjCFwQCwBCny+Uy+gZgkNPHpzcAiHobfQAA8HoCAACCBAAABHkIENp+LL7FAEkeAgRu8jVHmJcAAB4mEOC4BACwGYEA+yUAgGEEAowjAIDdEgiwHQEAHJZAgMcJAGBaAgFuEwBAlkCgTAAA3CAQmJkAAHiQQODIBADARgQCeyYAAAYRCIwkAAB2SiCwJQEAcFACgWcIAIBJCQTuEQAAUQKhTQAAcJVAmJsAAOAhAuHYBAAAmxAI+yYAABhCIIwlAADYJYGwLQEAwCEJhOcIAACmJBDuEwAAJNUDQQAAwBWzB4IAAIAHHD0QBAAAbGDvgSAAAGCA0YEgAABgh7YOBAEAAAf0bCAIAACY0FogCAAACHobfQAA8HoCAACCBAAABAkAAAgSAAAQJAAAIEgAAECQAACAIAEAAEECAACCBAAABAkAAAgSAAAQJAAAIEgAAEDQf5pXFokUyDSTAAAAAElFTkSuQmCC)}.os-icon.linux{background-image:url(data:image/png;base64,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)}.os-icon.android{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAgAAAAIACAMAAADDpiTIAAAAA3NCSVQICAjb4U/gAAAACXBIWXMAABEnAAARJwH2RM9yAAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAAwBQTFRF////qsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFIqsFINDsfYAAAAP90Uk5TAAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fn+AgYKDhIWGh4iJiouMjY6PkJGSk5SVlpeYmZqbnJ2en6ChoqOkpaanqKmqq6ytrq+wsbKztLW2t7i5uru8vb6/wMHCw8TFxsfIycrLzM3Oz9DR0tPU1dbX2Nna29zd3t/g4eLj5OXm5+jp6uvs7e7v8PHy8/T19vf4+fr7/P3+6wjZNQAAE99JREFUGBntwQmclWW9wPHf+Z8ZYNiRdQZUEBMYxGQTFTU1lpIE3FNRU4lPWVR+skzUzLyGy630Xm/pLbWUtHJhkxLFpI8YQoBLCQgIInIGlLk6www4zPJcN+bMwGHmed9z5l14/t8v8dDmu4vff+ORQcRBu+teKdl492BU7nT/h/lY7beIvn5bzccqJqBy5h/mU7VnEnUdXzefqhmMypEvmb22tSfifm72egKVI/9t6v2UaOtXZfaqQuXIn029yiIi7U8mrT0qN35l0h4gykaZtLJ8VG6MN2m1xxBhS0zao6gcyX/TpC0kus42DZyOypXzTAPjiar89SZtASp3lpq014SI+o5JqxmMyp0TTQNXEE2dd5i0/0Xl0uMmbWtbIukOk7azFyqXjtxj0n5MFPX90KT9GJVbd5m0nb2IoEdM2ta2qNzq+r5Ju4/oGVln0q5A5do1Jq2mmMj5u0l7TVC51nqTSVtA1Ew2DYxH5d6FpoHTiZa8N0zaQlQLSCw3aasSRMq3TVrtMaiWcLJp4FKipON7Ju1+VMuYbdLeLiBCZpq0yiJUyziq2qRdR3Qcttuk3YxqKfeYtLLuRMbDJq2kPaqldC8zaf9DVAyvM2nTUC3nRyategAR8bxJ+3cS1XLabDZpc4iGM00DZ6Ba0hTTwClEQd4ak7YI1aISK03a8gQR8E2TVnssMZMgZk77G2kXPYo/7Tt27NSxY6eOHTtUlZeVl5eVl5eV1+JLhw09qPfQZcRMgriZ/xXqbR5QhQeFxcWDD+vYsVPHjsL+KsvLy8rfW7N69foaPLh1BvV2H/UOMZMgbgb9K0m9H96Jld7Fg4uLi7tgpXrd6tdXr15XjY0+6wqo97PriZsEsfPrb1DvgyNLaVrXEYOLi4s74VnN+tWvr351Lc34/aXUe/fInagW16PcpN1FE+T4n7xUa7Ky5TfndKIJQ2tN2jdRQbjepO05kgPoddmjpSYXql+4fniCA1hk0tbkoYJQ8I5Je5wM8r8w8+U6k0PvPnxxdzI4wzQwERWMr5kGTmQfh06bXWZyr+6ft4wWGku+btIWowIir5i0pTSUf+4zdabFbL6xiIammbS64aigjDENnEe9I2ZuMy2rZvaXhb3abzNps1DB+YtJ29CKT+Sds7DOBGDT9YV86qcmbfdhqOAcXWPSvsdH+t1aYoJS/cS4BFBUadJuQwXpNyattEve2U/XmUBtvK4nD5i09zqhgtSrwqS9kDLB2zOv1qRNJ6aSxFNF/qnUO6wDwUsOSFBv/RV1xFOCmGq3vpDoOHs2MSXEVOWNRMeS2cRVgriSV4YQEeb45cSVEFd1C4mKjW+ggtbvaRMdqXNQgUp+v9JEypzeqOAMXWGipuyqBCoYBXdUmwh6sRgVhDFvmmiqurkVqqV1/b2JrjUnoVrWxe+aKKu7txOq5fT4q4m6rV8iVpLEyHHPDSPqOlxUuwTVIqZ+aGJhdgdU7rW6z8TFmoGoXOv9komP8rOIiyTxcPKiAcRH6/PzFxtU7kyvNjHz1y6oXCl4yMTPm8cQBwmir++TQ4mhXVMfJfqSRN7pzx5BHOWf03GRIeqSRN2EeR2IqRP6zjNEXJKIm/hEa2Lr2CPnGqItSbSd/edWxNgxA+bUEWlJIu38R/OJtaMHz64jypJE2YV/yCPmiofMriXChAi75OEksTf5idZEWILouvy3wsHg6bM+JLKEyPr6/cJB4UvzCogsIaq+eV+Cg8TYp9oSVUJETf9VgoPG6X9tT0QliKbLfsdB5dkv1xJJSSLphMfzOKj07/w0kZQkivo815mDzKitq4iiBBFUsGQYB509X1xCBAkR9OAwDj6tnjycCBKi54YLOBh1n9uO6EkQOZOfTHBwevJcQ9QkiZohC1pzkBqUWEzUJIiYbv/si633VqxYP3DE8K6EZM+/VqwsGDFigGDJXPAYqkn5fzeW9tx8OJ/q97MaE4IlJ7TiE+0nbDCWKoeimnSfsfTqsaSNeN0Ebff3hXrt7qkzdt7uiWrCN4ylW/JpqPXtJlirBtLI6VuNnSV5qAPqX2ns/JZ9PWyC9H5v9nFKnbFzHepAEn83dt7uyL66bDUBuoT93G3sfFiMOoBvG0vj2N8ZJjhz2F/b9cbOsiQqo34Vxs4jZPJnE5TdPclgnLH0QyJEiIzE/e2ws5BMniUor24ng8VV2Ll5INEhRMY3TsPSP8lkBUFZRSZ7XsNOmweEyBCi4vA7sFSxlkz+XUVAVpLRCiydcDWRIUTFb9tj6eU6Mql+jYCsIqMV2LrlKKJCiIhpY7BVRmZlBKSMjMqwVfCAEBFCNBz6n1gbRmbDCMhQMhqGtdHfISKEaPhNB6wVFZJJv0MIyDAyGoG9W/sTDUIkXDkeD0aQyQiCMoyMhmOv7QMJIkGIgg6348UoMhlFUIYLGRzZFQ9OuRBV78fGkw/6sL++O01gfkAGjxtP1uWhPnNImfHmafaTeN4E58Oj2c9XjUdXoj4z03j1dfY13QRpVT776FVqPNrcCvWJnpXGq/LjaGx0pQnUPXk00vEZ49m3UZ+4y3hX8x/5pLW+vdYEbPlAGjhts/EuVYD6SJ8PjR+vfJ69hv/bBG/39xJ8puDuOuPHDwhfgtDdNw1fqletXLVyw4Bhw4cNzSMMm5evWrWqYNjwYcd1x5fSfjsJW4Kw9V+bh6tu+ilhSxC2hy7BWWVH/B8hSxKy4l8ncFYb8xwhSxCyx87FYZX9txOuJOEaelcCh7XKf5pwJQjX4+fgtKo+OwiVEKoeE3Fb60sIlxCqS/Nx3JWEK0Go1gzEdccvI0xCmEYPxHlTCZUQpitRF7QjTEKIOpyP6nA+YRJC9NV2KKYSpgQhemkUCgatJTxCeAaPQn3kSkIkhGcq6mOX5hMeITStpqA+1uNMwiOEZlI31CeuJDxCaKaiPjW+D6ERwtJrDOpTyYsIjRCWMYL6zHhCI4RlLGqv0QWERQjLGNRerU8hLEJIBhWh6o0lLEJIxqLSxhIWISRjUGlDehISIRx5p6LSEl8kJEI4RnVANTCWkAjhGINqaCwhEcIxBtVQ70GEQwhFh+NRjYwlHEIovpCHamQs4RBCMQbV2BfyCYUQirGoxjqMIhRCGNoUo/YxglAIYeiF2lcvQiGEoTNqX50JhRCGFGpfKUIhhOHdnah9bCAUQigeQjX2f/MJhRCK2/agGvn5TkKRJBTlRSNRDZReuIdQCOGYWYVq4I4KwiGEY8tpKdRe5id3EpIEYen1+GjUJ8qmPEVYkoSl4uH2x7RCwZIzlxKaBCFqO3H4YT0SuKzy7Q1z3kQppZRSSimllFJKKaWUUkoppSJLUIESciNBlrqNPaL3R3pUbt269Z2tS1/Glpw0fPjwvglcZzavWLlySR22hp7Qu0/v3r3bvbv1Ixuf3UGYjrrmhVrTyNv3jGuFjf4vGFXvhf7YaDXunrdNI7UvXHMUIWk3Y43JpOyRITQncVWFUQ1UXJWgOUMeKTOZrJnRjuAlp5WYA6l9sA9Nu9WofdxK0/o8WGsOpGRakoBNWmOasvu2TjRhZI1R+6gZSRM63bbbNGXNJILUbZFpzo6vcEBtVhu1n9VtOKCv7DDNWdSNwAzZZJpXey0Hcq1RGVzLgVxba5q3aQgBmbzTWJnVhsz+YlQGfyGzNrOMlZ2TCcQNdcbSsiIy2m5UBtvJqGiZsVR3AwG42dh7ozMZ9DEqoz5k0PkNY+9mvBI8Ou9G7B31xyT7G4LKaAj7S/7xKOzdeB4eCd4M/V0CD8bfyf5aozJqzf7uHI8Hid8NxRvBk55z2+LJ1ZejsnD51XjSdm5PPBG8kCcOxaN7R6J8G3kvHh36hOCF4MWU0XjV6i6Ub3e1wqvRU/BC8KDNLXh34lkon846Ee9uaYMHggfTD8OHmXkoX/Jm4sNh0/FAsNdlBn4MmIryZeoA/JjRBXuCvRmd8eUn7VA+tPsJvnSegT3BmnwNf3pOQPkwoSf+fE2wJlgb3Q2fJqF8mIRP3UZjTbA2Eb/OyEN5lncGfk3EmmBtEn51PgXl2Smd8WsS1gRbgz6Hb5NQnk3Ct88NwpZgawL+TUB5NgH/JmBLsNUf//oKyiPpi3/9sSXYKsK/ZE+URz2T+FeELcFWIVkoRHlUSBYKsSXYKiILRSiPishCEbYES9KTLBShPCoiCz0FS4Kl7nlkoRDlUSFZyOuOJcFSAdkoQHlUQDYKsCQopwnKaYJymqCcJiinCcppgnKaoJwmKKcJymmCcpqgnCYopwnKaYJymqCcJiinCcppgnKaoJwmKKcJymmCcpqgnCYopwnKaYJymqCcJiinCcppgnKaoJwmKKcJymmCcpqgnCYopwnKaYJymqCcJiinCcppgnKaoJwmKKcJymmCcpqgnCYopwnKaYJymqCcJiinCcppgnKaoJwmKKcJymmCcpqgnCYopwnKaYJymqCcJiinCcppgnKaoJwmKKcJymmCcpqgnCYopwnKaYJymqCcJiinCcppgnKaoJwmKKcJymmCcpqgnCYopwnKaYJymqCcJiinCcppgnKaoJwmKKcJymmCcpqgnCYopwnKaYJymqCcJiinCcppgnKaoJwmKKcJymmCcpqgnCYopwnKaYJymqCcJiinCcppgnKaoJwmKKcJymmCcpqgnCYopwnKaYJymqCcJliqIBsVKI8qyEYFlgRLpXvIQgnKoxKysKcUS4Ils40spFAepcjCNoMlwVaKLKRQHqXIQgpbgq0UWUihPEqRhRS2BFsl+Fe9A+XRjmr8K8GWYGst/q0zKI/MOvxbiy3B1lP4Nx/l2Xz8ewpbgq23XsW3uSjP5uLbq29hS7A2D7+2L0N5tmw7fs3DmmBtLn7NNyjPzHz8mos1wdrKd/BpLsqHufj0zkqsCfbuxZ+NC1E+LNyIP/diT7D3yxJ8ub4a5UP19fhS8kvsCfZ23YQfK/+E8uVPK/Hjpl3YEzx4YC0+XGtQvphr8WHtA3ggeFB7Hd4tfA7l03ML8e66WjwQvJizAK8qrkb5dnUFXi2YgxeCJxetxpu6i9egfFtzcR3erL4ITwRPyieW4smMeagszJuBJ6UTy/FE8ObNc6vxYNbtqKzcPgsPqs99E28EjxZPx97SqagsTV2KvemL8Ujw6r7LqrA0f1wVKktV4+Zjqeqy+/BK8Oyh07Zj5fbJFaisVUy+HSvbT3sIzwTvlo58heZVXfKjOlQO1P3okiqa98rIpXgn+LDlpD/QnE2nzkLlyKxTN9GcP5y0BR8EPyqnnLCEppRePfAlVM68NPDqUpqy5IQplQRr4mpzILtmdqIJk43KaDJN6DRzlzmQ1RMJQfKK52tMBpt+0YcmTTYqo8k0qc8vNpkMap6/IklIDpnyWLlpqG75DcfQnMlGZTSZ5hxzw/I601D5Y1MOIRsJstRqdN+ij/TcmUqlSlIvpWje5NmoTM6aQ/OKji8qLCoq6rA99ZG3XtxDdvLI0p7nUUFKPUkuCcppgnKaoJwmKKcJymmCcpqgnCYopwnKaYJymqCcJiinCcppgnKaoJwmKKcJymmCcpqgnCYopwnKaYJymqCcJiinCcppgnKaoJwmKKcJymmCcpqgnCYopwnKaYJymqCcJiinCcppgnKaoJwmKKcJwduJymgnwUsQvK47UJl0KyVwQvBK30Jl8FYpwRNCsBKVwUpCIIRgASqDBYQgQQgSz4xB7WvROEPwEoTh0H91QjVWNmQLIRDCsOWqWlQjtVdtIQxCKB45cS2qgbUnPkIokoRj6/3tjhPUp2rvPn8z4UgQmrafHz68bwIPjuxNFpZ9iK1jO+Ff9T/wwmxesfLVXSgLd5ls9MXaYpOFbcSJoJwmKKcJymmCcpqgnCYopwnKaYJymqCcJiinCcppgnKaoJwmKKcJymmCcpqgnCYopwnKaYJymqCcJiinCcppgnKaoJwmKKcJymmCcpqgnCYopwnKaYJymqCcJiinCcppgnKaoJwmKKcJymmCcpqgnCYopwnKaYJymqCcJiinCcppgnKaoJwmKKcJymmCcpqgnCYopwnKaYJymqCcJiinCcppgnKaoJwmKKcJymmCcpqgnCYopwnKaYJymqCcJiinCcppgnKaECO7yMYurO0iC7uIEyFGSshCzQ6slZCFEuJEiJEUWdhWh7UUWUgRJ0KMpMhCCnspspAiToQYKSELJdgrIQslxIkQIyVkIYW9FFlIESdCjFRtwb8N2Nto8G8DcSLEyXz8m4+9Hcvwbccy4kSIkzn4tno9HszFtwW1xIkQJ4s/wK85eDEX3+aiWs4s49cIPFlnfNrdjlgRYmUOPr2zEk/m4tOiSlTLKdhq/LkJb4prjD+TUC3p68aX7e3x6H7jy4uoFpVcY/z4Fl712WX8GI1qWZOND+vz8ew248McVEt70Xh3Ht51LjWe1QxCtbSRVcar5/BjmvHsF6iWd7nxaGNXfPm18ejZPFQAfmk82Xk0/uT9zXiyrgsqCMmFxoO6ifh1yAbjwfsDUMHo/IaxNwP/isuMtZpxqKAUvmQs1V5DNo7dbCx98GVUcNo8bKx8cAbZ6bHEWFk3EBWoH9Sa5q0bSLZa3W8sPNMFFbAz3jXNeaoLOfCdXaYZtT9PogLX8ZZK05SXx5Ebfe6vMU156mhUKArvrTYHsmlKgpwZPM8c0PJTUaEZ8GCpyWTVd1uTUyfP2WUyqHn+ggQqTHmn/9dm00jN8989nNxre9bvS00jlU9e1pW4S3AQGHZCYVFRUWGHbamSVOqtZ0ppIXknf76wqKiwKD+VSpWk1j63m/j7f6ohy6APqWRGAAAAAElFTkSuQmCC)}.os-icon.other{background-image:url(data:image/png;base64,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)}::ng-deep .date-time-container.data-table-date-time{position:fixed;z-index:9999}::ng-deep .date-time-container.data-table-date-time .p-calendar .p-inputtext{height:.0625rem;width:.0625rem;padding:0}::ng-deep .date-time-container.data-table-date-time .filter-button-container{height:3.125rem;display:flex;flex-direction:row;justify-content:center;align-items:center}::ng-deep .date-time-container.data-table-date-time .filter-button-container .toggleButton{padding-left:var(--paddingSmall);padding-right:var(--paddingSmall);text-align:center;background-color:var(--inputBorder);color:var(--tableText);width:unset;height:1.4375rem;line-height:1.4375rem;font-size:.875rem;font-weight:600;position:relative;float:left;cursor:pointer;border-radius:.25rem;margin-right:var(--marginSmall);transition:.3s}::ng-deep .date-time-container.data-table-date-time .filter-button-container .toggleButton:hover{filter:brightness(90%);transition:.3s}::ng-deep .date-time-container.data-table-date-time .p-calendar .p-inputtext{border-top-left-radius:1.25rem;border-bottom-left-radius:1.25rem;text-indent:.3125rem}::ng-deep .date-time-container.data-table-date-time .p-calendar .p-button-icon-only{border-top-right-radius:1.25rem;border-bottom-right-radius:1.25rem}::ng-deep .tag-selector-container.data-table-tag-selector{position:fixed;z-index:9999;width:21.875rem;height:-moz-fit-content;height:fit-content;background:var(--formBackground);display:flex;flex-direction:column;justify-content:flex-end;padding:.625rem;border-radius:var(--inputBorderRadius);box-shadow:var(--shadowLarge);margin-top:-1.25rem;border-color:var(--stroke);border-style:solid}::ng-deep .tag-selector-container.data-table-tag-selector .tag-selector-label{margin-bottom:.3125rem;margin-left:.125rem;font-weight:600;color:var(--menu)}::ng-deep .tag-selector-container.data-table-tag-selector .select2-search__field{height:2.1875rem}::ng-deep .tag-selector-container.data-table-tag-selector .nf-select2-dropdown{width:calc(100% - 1.25rem)!important}::ng-deep .tag-selector-container .icon-close{position:absolute;top:.5rem;right:.5rem;cursor:pointer;color:var(--icon);font-weight:600}::ng-deep .tag-selector-container .icon-close:hover{filter:brightness(50%)}\n"] }]
8153
+ args: [{ selector: 'lib-data-table', template: "<div #tableContainer class=\"data-table-container\" *ngIf=\"showTable;else nodata\">\n <lib-table-filter-bar\n [startCount]=\"startCount\"\n [endCount]=\"endCount\"\n [totalCount]=\"totalCount\"\n [currentPage]=\"currentPage\"\n [filterName]=\"filterName\"\n [filterColumn]=\"filterColumn\"\n ></lib-table-filter-bar>\n <lib-table-hidden-columns-bar\n *ngIf=\"gridRendered && showFilterBar\"\n [hiddenColumns]=\"hiddenColumns\"\n (columnVisibilityChanged)=\"columnVisibilityChanged($event)\"\n ></lib-table-hidden-columns-bar>\n <div (resize)=\"resizeGridColumnsDebounced($event)\" class=\"ziti-ag-grid\" id=\"ItemTable\">\n <ag-grid-angular\n #nfAgGrid\n [columnDefs]=\"mergedColumnDefinitions\"\n [components]=\"frameworkComponents\"\n [getDataPath]=\"svc.getDataPath\"\n [getRowId]=\"svc.getRowNodeId\"\n [gridOptions]=\"gridOptions\"\n [modules]=\"gridModules\"\n [rowData]=\"rowData\"\n [tooltipHideDelay]=\"20000\"\n [tooltipShowDelay]=\"0\"\n (gridReady)=\"onGridReady($event)\"\n class=\"ziti-ag-grid-table ag-theme-alpine rows\"\n id=\"ItemGrid\"\n >\n </ag-grid-angular>\n </div>\n <div\n [ngClass]=\"{ open: openHeaderMenu }\"\n [ngStyle]=\"{ left: menuLeft + 'px', top: menuTop + 'px' }\"\n class=\"tMenu action-menu header-menu\"\n id=\"HeaderActionMenu\"\n >\n <div (click)=\"resetTableColumns()\" class=\"tActionRow\" id=\"ResetTableButton\">Restore Default Table</div>\n <div\n *ngFor=\"let headerAction of headerActions\"\n (click)=\"actionRequested.emit({ action: headerAction.action })\"\n class=\"tActionRow\"\n id=\"ResetTableButton\"\n >\n {{headerAction.name || headerAction.label}}\n </div>\n </div>\n <div\n [ngClass]=\"{ open: openMenu }\"\n [ngStyle]=\"{ left: menuLeft + 'px', top: menuTop + 'px' }\"\n class=\"tMenu action-menu item-menu\"\n id=\"RowActionMenu\"\n #contextMenu\n >\n <div\n *ngFor=\"let menuItem of menuItems\"\n (click)=\"actionRequested.emit({ action: menuItem.action, item: selectedItem })\"\n [ngClass]=\"{'menu-item-hidden': hideMenuItem(menuItem, selectedItem) }\"\n class=\"tActionRow\"\n id=\"TableActionButton_{{menuItem.action}}\"\n >\n {{menuItem.name || menuItem.label}}\n </div>\n </div>\n <div\n (clickOutside)=\"closeHeaderFilter($event)\"\n [ngClass]=\"{ open: showFilterOptions }\"\n [ngStyle]=\"{ left: menuLeft + 'px', top: menuTop + 'px' }\"\n class=\"tMenu action-menu header-menu\"\n id=\"HeaderFilterOptions\"\n >\n <div (click)=\"applyFilter($event, filter)\" *ngFor=\"let filter of filterOptions\" class=\"tActionRow\" [ngClass]=\"{'has-icon': filter.icon}\" [id]=\"filter.columnId\">\n <span *ngIf=\"filter.bubbleClass\" [ngClass]=\"filter.bubbleClass\" class=\"bubble\">\n <svg *ngIf=\"filter.showLoader\" class=\"circular\" viewBox=\"25 25 50 50\">\n <circle\n class=\"path\"\n cx=\"50\"\n cy=\"50\"\n fill=\"none\"\n r=\"20\"\n stroke-miterlimit=\"10\"\n stroke-width=\"3\"\n ></circle>\n </svg>\n </span>\n <span *ngIf=\"filter.icon\" class=\"os-icon {{filter.icon}}\"></span>\n {{ filter.label }}\n </div>\n </div>\n</div>\n\n<div *ngIf=\"showDateTimePicker\" class=\"date-time-container data-table-date-time\" [ngStyle]=\"{ left: menuLeft + 'px', top: menuTop + 'px' }\" (clickOutside)=\"closeDateTime($event)\">\n <p-calendar\n [(ngModel)]=\"dateValue\"\n (onSelect)=\"setDateRangeFilter('custom')\"\n dateFormat=\"mm/dd/yy\"\n selectionMode=\"range\"\n placeholder=\"Select Time Range\"\n #calendar\n >\n <ng-template pTemplate=\"header\">\n <div class=\"filter-button-container\">\n <div\n class=\"toggleButton\"\n [ngClass]=\"{selected: selectedRange === 'hour'}\"\n (click)=\"setDateRangeFilter('hour')\"\n >\n Last Hour\n </div>\n <div\n class=\"toggleButton\"\n (click)=\"setDateRangeFilter('day')\"\n [ngClass]=\"{selected: selectedRange === 'day'}\"\n >\n Last Day\n </div>\n <div\n class=\"toggleButton\"\n (click)=\"setDateRangeFilter('week')\"\n [ngClass]=\"{selected: selectedRange === 'week'}\"\n >\n Last Week\n </div>\n <div\n class=\"toggleButton\"\n (click)=\"setDateRangeFilter('month')\"\n [ngClass]=\"{selected: selectedRange === 'month'}\"\n >\n Last Month\n </div>\n </div>\n </ng-template>\n </p-calendar>\n</div>\n\n<div *ngIf=\"showTagSelector\" class=\"tag-selector-container data-table-tag-selector\" [ngStyle]=\"{ left: menuLeft + 'px', top: menuTop + 'px' }\" (clickOutside)=\"closeTagSelector($event)\">\n <div class=\"buttonBall icon-close\" (click)=\"closeTagSelector($event)\"></div>\n <div class=\"tag-selector-label\">\n <span>Select an Attribute:</span>\n </div>\n <lib-tag-selector\n [focusOnInit]=\"true\"\n [availableRoleAttributes]=\"roleAttributes\"\n [availableNamedAttributes]=\"namedAttributes\"\n [(selectedRoleAttributes)]=\"selectedRoleAttributes\"\n [(selectedNamedAttributes)]=\"selectedNamedAttributes\"\n (selectedNamedAttributesChange)=\"tagSelectionChanged($event, false)\"\n (selectedRoleAttributesChange)=\"tagSelectionChanged($event, true)\"\n ></lib-tag-selector>\n</div>\n<ng-template #nodata>\n <lib-no-items\n (clickEmit)=\"openCreate()\"\n [image]=\"noItemsImage\"\n [isEmpty]=\"!rowData || rowData.length === 0\"\n [typeName]=\"this.entityTypeLabel\"\n [hasAdd]=\"showNoItemsAdd\"\n ></lib-no-items>\n</ng-template>\n", styles: [".data-table-container{display:flex;position:relative;height:calc(100% - 5.625rem);width:100%;flex-direction:column}.data-table-container .ziti-ag-grid{position:relative;width:100%;height:100%;display:flex;clear:both;align-items:center;justify-content:center}.data-table-container .ziti-ag-grid .ziti-ag-grid-table{height:100%;width:100%}.data-table-container .tMenu.action-menu.header-menu,.data-table-container .tMenu.action-menu.item-menu{position:fixed;height:unset;width:12.5rem;transition-property:opacity}.data-table-container .tMenu.action-menu.header-menu .tActionRow,.data-table-container .tMenu.action-menu.item-menu .tActionRow{display:flex;color:var(--offWhite_ALWAYS)}.data-table-container .tMenu.action-menu.header-menu .tActionRow.menu-item-hidden,.data-table-container .tMenu.action-menu.item-menu .tActionRow.menu-item-hidden{display:none}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper{border:none}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-body-vertical-scroll-viewport{background-color:var(--formBackground)}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row{border:none;background-color:var(--formBackground);color:var(--text)}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.row-invalid{background-color:var(--invalid)!important}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.row-invalid.row-copied{background-color:var(--copiedRow)!important}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.row-copied{background-color:var(--copiedRow)!important}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.ag-row-selected{background-color:var(--formBackground)}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.ag-row-selected.ag-row-hover{background-color:#2196f31a}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.ag-row-odd{background:var(--white)}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.ag-row-odd.ag-row-selected{background-color:var(--shaded)}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.ag-row-odd.ag-row-selected.ag-row-hover{background-color:#2196f31a}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.ag-row-odd.ag-row-hover{background-color:#2196f31a}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.ag-row-hover{background-color:#2196f31a}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row .dots{right:1.5625rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.row-role-item .tCol{font-size:.8125rem;height:2.1875rem;line-height:2.1875rem;font-weight:600}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-cell{border:none}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-cell.ag-cell-value.ziti-table-cell-error{outline:.125rem var(--red) solid;outline-offset:-.1875rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-cell.ag-cell-value.ag-cell-inline-editing{width:100%;height:100%;padding-left:0}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-header-cell:focus:after{border:none}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-pinned-left-header{border:none}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-pinned-left-header .ag-icon-pin{margin-top:.9375rem;transform:rotate(-45deg)}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-pinned-left-header .ag-header-cell-text{cursor:default}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-pinned-left-header .ag-header-col-pin-button:hover .ag-icon-pin{animation-name:unpinColumn;animation-duration:.5s;animation-delay:.1s;animation-iteration-count:1;animation-fill-mode:forwards}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-header-col-pin-button:hover .ag-icon-pin{animation-name:pinColumn;animation-duration:.6s;animation-delay:.1s;animation-iteration-count:1;animation-fill-mode:forwards}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row-level-1 app-table-cell-resource-status app-resource-status{margin-left:2.5rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row-level-1 app-table-cell-resource-status app-resource-status .bubble{height:.6875rem;width:.6875rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row-level-1 app-table-cell-resource-status app-resource-status .bubble .circular{margin-left:2.5rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-icon-eye-slash{margin-top:.75rem;margin-right:.3125rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-icon-pin{margin-top:.75rem}@keyframes pinColumn{0%{transform:rotate(0);margin-top:.75rem}15%{transform:rotate(-10deg);margin-top:.75rem}30%{transform:rotate(-20deg);margin-top:.75rem}45%{transform:rotate(-30deg);margin-top:.8125rem}60%{transform:rotate(-40deg);margin-top:.875rem}75%{transform:rotate(-45deg);margin-top:.9375rem}to{transform:rotate(-45deg);margin-top:1rem}}@keyframes unpinColumn{0%{transform:rotate(-45deg);margin-top:.9375rem}15%{transform:rotate(-45deg);margin-top:.875rem}30%{transform:rotate(-45deg);margin-top:.8125rem}45%{transform:rotate(-40deg);margin-top:.75rem}60%{transform:rotate(-30deg);margin-top:.6875rem}75%{transform:rotate(-20deg);margin-top:.625rem}90%{transform:rotate(-10deg);margin-top:.5625rem}to{transform:rotate(0);margin-top:.5rem}}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-pinned-right-header{border:none}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .selectHeader{background-image:none}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .menuHeader{background-image:none}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-pinned-right-header .ag-header-row:after{height:0}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-horizontal-left-spacer{border:none}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-horizontal-right-spacer{border:none}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-header-cell-resize{margin-top:.125rem;border-left-color:#d4d9e2;border-right-color:#d4d9e2;border-left-width:.0625rem;border-right-width:.0625rem;border-left-style:solid;border-right-style:solid;width:.1875rem;height:.875rem;position:absolute;right:.125rem;top:1.1875rem;cursor:col-resize}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-header-cell-resize:after{display:none}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-header-cell-text{height:3rem;cursor:move;color:var(--text);line-height:3.4375rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-icon-menu{margin-top:.25rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-menu{margin-left:-2.8125rem;z-index:99999999}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-header-cell{padding-right:.3125rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-input-field-input{height:100%;margin-right:0;width:100%;box-shadow:0 0 .3125rem 0 var(--primary);border:solid .125rem var(--primary);overflow:visible}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-checkbox-input-wrapper .ag-input-field-input{border:none}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-header-viewport{box-sizing:border-box;border-bottom:.25rem solid var(--primary);background-color:var(--formBackground);padding-left:.25rem;line-height:3.4375rem;position:sticky!important;top:0;z-index:10;transition:all .15s linear;opacity:.97}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-cell-label-container{cursor:default}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-cell-label-container.nf-can-sort{cursor:pointer}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-header{background-color:var(--navigation);border-bottom:solid .0625rem;border-bottom-color:var(--navigation)}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-header-icon{color:var(--icon)}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-icon-pin{font-weight:800;margin-right:.3125rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-icon-menu{font-weight:800}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-icon-eye-slash{font-weight:800;color:var(--icon)}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-header-cell-resize{border-left-color:var(--stroke);border-right-color:var(--stroke);border-left-width:var(--inputBorderWidth);border-right-width:var(--inputBorderWidth);border-left-style:solid;border-right-style:solid;width:.3125rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-header-cell-resize:hover{border-left-color:var(--icon);border-right-color:var(--icon)}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-header-viewport,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-floating-top-viewport,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-body-viewport,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-center-cols-viewport,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-floating-bottom-viewport,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-body-horizontal-scroll-viewport,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-virtual-list-viewport{background-color:var(--navigation)}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-theme-alpine .ag-row{background-color:var(--navigation)}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .tSelect{left:1.25rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-pinned-left-shadow{box-shadow:.5rem 0 .3125rem -.25rem #dddd;z-index:40}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-pinned-right-shadow{box-shadow:-.5rem 0 .3125rem -.25rem #dddd;z-index:40}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-pinned-left-header .ag-header-row-column{border-bottom-style:solid;border-bottom-width:.25rem;border-bottom-color:var(--stroke)}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-pinned-right-header .ag-header-row-column{border-bottom-style:solid;border-bottom-width:.25rem;border-bottom-color:var(--stroke)}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-pinned-right-header .dots{right:.25rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-cell{-webkit-user-select:text;user-select:text}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-body-viewport .ag-cell{padding-left:1.25rem;text-align:left;line-height:3.0625rem!important}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-pinned-left-cols-container .ag-row{border-left:.25rem solid transparent}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-pinned-left-cols-container .ag-row-hover{border-left:.25rem solid var(--primary)}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-pinned-left-cols-container .tSelect{margin-left:-.25rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-cell-label-container .ag-header-col-hide-button,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-cell-label-container .ag-header-col-pin-button,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-cell-label-container .ag-header-col-filter-button{margin-top:.3125rem;opacity:0;transition:opacity .2s;height:2.5rem;cursor:pointer}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-cell-label-container .ag-header-col-hide-button.nf-ag-col-pinned,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-cell-label-container .ag-header-col-pin-button.nf-ag-col-pinned,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-cell-label-container .ag-header-col-filter-button.nf-ag-col-pinned{opacity:1}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-cell-label-container .ag-header-col-hide-button:hover .ag-icon-eye-slash,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-cell-label-container .ag-header-col-hide-button:hover .ag-icon-pin,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-cell-label-container .ag-header-col-hide-button:hover .ag-icon-filter,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-cell-label-container .ag-header-col-pin-button:hover .ag-icon-eye-slash,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-cell-label-container .ag-header-col-pin-button:hover .ag-icon-pin,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-cell-label-container .ag-header-col-pin-button:hover .ag-icon-filter,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-cell-label-container .ag-header-col-filter-button:hover .ag-icon-eye-slash,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-cell-label-container .ag-header-col-filter-button:hover .ag-icon-pin,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-cell-label-container .ag-header-col-filter-button:hover .ag-icon-filter{color:var(--ag-alpine-active-color, var(--primary))}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-cell-label-container .ag-header-col-hide-button .ag-icon-filter,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-cell-label-container .ag-header-col-pin-button .ag-icon-filter,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-cell-label-container .ag-header-col-filter-button .ag-icon-filter{font-weight:700;margin-top:.8125rem;margin-right:0rem;margin-left:-.0625rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-cell-label-container .ag-header-col-hide-button,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-cell-label-container .ag-header-col-pin-button{position:absolute;margin-top:.625rem!important}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-cell-label-container .ag-header-col-hide-button{margin-right:1.3125rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-cell-label-container:hover .ag-header-col-hide-button,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-cell-label-container:hover .ag-header-col-pin-button,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-cell-label-container:hover .ag-header-col-filter-button{position:relative;display:block;opacity:1}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-cell-label-container:hover .ag-header-col-hide-button{margin-right:0rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .tSelectHeader{top:.75rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-header-cell{padding-left:0rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-sort-descending-icon{margin-top:.9375rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .nf-ag-main-col .ag-cell-label-container{margin-left:-.5rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .nf-ag-main-col .ag-cell-label-container .ag-header-cell-text{padding-left:.1875rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ziti-ag-grid .ag-root-wrapper .ag-row.row-child{background-color:#fff;border-bottom:solid var(--stroke) .0625rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper app-table-column-default{width:100%}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper app-table-cell-registration{width:100%}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper app-table-cell-registration .tcol{width:100%}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.ag-row-even.row-child.row-child-odd,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.ag-row-odd.row-child.row-child-odd{background-color:var(--table)}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.ag-row-even.row-child.row-child-odd.row-role-item,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.ag-row-odd.row-child.row-child-odd.row-role-item{background-color:var(--shaded);border:none}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.ag-row-even.row-child.row-child-odd.row-role-item.ag-row-hover,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.ag-row-odd.row-child.row-child-odd.row-role-item.ag-row-hover{background-color:#2196f31a}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.ag-row-even.row-child.row-child-odd.row-child-second,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.ag-row-odd.row-child.row-child-odd.row-child-second{background-color:var(--shaded)}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.ag-row-even.row-child.row-child-odd.row-child-second.row-child-header,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.ag-row-odd.row-child.row-child-odd.row-child-second.row-child-header{background-color:var(--shaded)}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.ag-row-even.row-child.row-child-odd.row-child-warn,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.ag-row-odd.row-child.row-child-odd.row-child-warn{background-color:var(--copiedRow)}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.ag-row-even.row-child.row-child-odd.row-child-header,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.ag-row-odd.row-child.row-child-odd.row-child-header{background-color:var(--shaded)}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.ag-row-even.row-child.row-child-even,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.ag-row-odd.row-child.row-child-even{background-color:var(--shaded)}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.ag-row-even.row-child.row-child-even.row-role-item,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.ag-row-odd.row-child.row-child-even.row-role-item{background-color:var(--table);border:none}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.ag-row-even.row-child.row-child-even.row-role-item.ag-row-hover,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.ag-row-odd.row-child.row-child-even.row-role-item.ag-row-hover{background-color:#2196f31a}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.ag-row-even.row-child.row-child-even.row-child-second,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.ag-row-odd.row-child.row-child-even.row-child-second{background-color:var(--table)}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.ag-row-even.row-child.row-child-even.row-child-second.row-child-header,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.ag-row-odd.row-child.row-child-even.row-child-second.row-child-header{background-color:var(--table)}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.ag-row-even.row-child.row-child-even.row-child-warn,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.ag-row-odd.row-child.row-child-even.row-child-warn{background-color:var(--copiedRow)}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.ag-row-even.row-child.row-child-even.row-child-header,.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .ag-row.ag-row-odd.row-child.row-child-even.row-child-header{background-color:var(--table)}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .row-child{border-top:solid var(--stroke) .0625rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .row-child.row-child-second{border-top:transparent}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .row-child.row-child-second .ag-cell{font-size:.6875rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .row-child .bubble{width:.5rem;height:.5625rem;margin-left:.3125rem;margin-bottom:.0625rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .row-child .ag-cell{font-size:.8125rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .row-child app-resource-status{margin-left:1.4375rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .row-child app-resource-status .circular{height:.75rem;margin-left:1.125rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .row-child app-resource-status>span{font-size:.8125rem;margin-left:.25rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .row-child.row-child-second app-resource-status{margin-left:1.625rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .row-child.row-child-second app-resource-status .circular{margin-left:1.625rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .row-child.row-child-second app-resource-status>span{font-size:.8125rem;margin-left:.25rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .row-child-second .step-header-container .step-content{position:relative;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;flex-grow:1;flex-shrink:0;padding-right:.3125rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .row-child-second .step-header-container .step-label{padding-left:3.4375rem;margin-left:1.25rem;width:calc(20% + 1.25rem)}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .row-child-second .step-header-container .step-label.step-content{padding-left:0}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .row-child-second .step-header-container .started-label{width:calc(20% + 1.25rem);overflow:hidden;flex-grow:1;flex-shrink:0}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .row-child-second .step-header-container .finished-label{width:calc(20% + 1.25rem);overflow:hidden;flex-grow:1;flex-shrink:0}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .row-child-second .step-header-container .duration-label{width:calc(20% + 1.25rem);overflow:hidden;flex-grow:1;flex-shrink:0}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .row-child-second .step-header-container .state-label{width:calc(20% + 1.25rem);overflow:hidden;flex-grow:1;flex-shrink:0}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper .process-info-container app-resource-status .circular{margin-left:.8125rem;margin-top:-.0625rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper app-table-cell-resource-status{width:100%;text-overflow:ellipsis;white-space:nowrap;overflow:hidden;margin-left:-.625rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper app-table-cell-resource-status .bubble{margin-left:.125rem}.data-table-container ::ng-deep #ItemTable.ziti-ag-grid .ag-root-wrapper app-table-cell-resource-status .bubble .circular{left:0;top:1rem}.data-table-container ::ng-deep body{overflow-x:auto!important}.data-table-container ::ng-deep body .ag-theme-alpine.ag-dnd-ghost{height:2.1875rem!important;line-height:2.1875rem!important}.data-table-container ::ng-deep body .ag-header-row{box-sizing:border-box;border-bottom:.25rem solid var(--primary);background-color:var(--formBackground);padding-left:.25rem;line-height:3.4375rem;position:sticky!important;top:0;z-index:10;transition:all .15s linear;opacity:.97;color:var(--text)}.data-table-container ::ng-deep body .ag-header-cell-text{position:relative;float:left;color:var(--tableText);font-size:.875rem;font-weight:600;font-family:Open Sans;height:3.4375rem;transition:.5s;white-space:nowrap;color:var(--text)}.data-table-container ::ng-deep body .ag-header-cell-resize:after{display:none}.data-table-container ::ng-deep body .ag-header-cell-menu-button{height:1rem;width:1rem}.data-table-container ::ng-deep body .ag-icon{font-family:agGridAlpine;font-size:1rem;line-height:1rem;font-style:normal;font-weight:800;font-variant:normal;text-transform:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.data-table-container ::ng-deep body .ag-icon-menu:before{content:\"\\f11b\"}.data-table-container ::ng-deep body .ag-icon-menu:hover{color:var(--primary)}.data-table-container ::ng-deep body .ag-icon-asc{margin-top:.4375rem;font-weight:800}.data-table-container ::ng-deep body .ag-icon-desc{margin-top:-.4375rem;font-weight:800}.data-table-container ::ng-deep body .tSelectHeader{left:1.3125rem;top:.625rem}.data-table-container ::ng-deep body .cellMenu{overflow:visible}.data-table-container ::ng-deep body .ag-theme-alpine{-webkit-font-smoothing:antialiased;color:var(--tableText)!important;color:var(--ag-foreground-color, var(--tableText))!important;font-family:Open Sans,sans-serif;font-size:.8125rem;line-height:normal}.data-table-container ::ng-deep body .ag-theme-alpine .ag-row{color:var(--tableText)!important;color:var(--ag-foreground-color, var(--tableText))!important}.data-table-container ::ng-deep body .ag-theme-alpine .ag-header-cell,.data-table-container ::ng-deep body .ag-theme-alpine .ag-header-group-cell{padding-left:.3125rem;padding-right:.9375rem}.os-icon{width:1.4375rem;height:1.4375rem;background-size:1.4375rem 1.4375rem;display:inline-flex;margin-right:.5rem;margin-top:.3125rem;margin-bottom:.3125rem}.os-icon.empty{background:transparent}.os-icon.apple{background-image:url(data:image/png;base64,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)}.os-icon.windows{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAgAAAAIACAYAAAD0eNT6AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAN1wAADdcBQiibeAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAApdSURBVHic7dsxbttYGEZRylCfZAfpvYys23uYxuvI7EDTTBdJRCRTj3z3HECdDf+N9V0I1OlyuSwAQMvb6AMAgNcTAAAQJAAAIEgAAECQAACAIAEAAEECAACCBAAABAkAAAgSAAAQJAAAIEgAAECQAACAIAEAAEECAACCzqMPAAC+3unj8/uyLD9vvQQAABzQ2sAvy/Lt3u8LAADYoWcHfo0AAIABth74NQIAADYweuDXCAAAeMDeB36NAACAK44+8GsEAABJsw/8GgEAwJTqA79GAABwSAb+OQIAgF0y8NsSAAAMYeDHEgAAbMLA75sAAOAhBv7YBAAAVxn4uQkAgCgD3yYAACZl4LlHAAAclIHnGQIAYKcMPFsSAACDGHhGEgAAGzHw7JkAAHiQgefIBADADQaemQkAIMvAUyYAgGkZeLhNAACHZeDhcQIA2C0DD9sRAMAwBh7GEQDAZgw87JcAAB5m4OG4BABwk4GHeQkACDPw0CUAoO336AOAMd5GHwAAvJ4AAIAgAQAAQZ4BgA2tPWR3+fX+fchhQJ4AgCd4ih44KgEAdxh4YFYCgDQDD1QJAKZm4AGuEwAcmoEHeIwAYNcMPMA2BABDGXiAMQQAmzLwAPskAHiKgQc4JgHAXQYeYE4CIM7AAzQJgMkZeACuEQAHZ+ABeIQA2DkDD8AWBMBgBh6AEQTAxgw8AHskAJ5k4AE4IgGwwsADMKN8ABh4AIqmDwADDwB/OnwAGHgA+Hu7DwADDwBfb3gAGHgAeL3NA8DAA8D+PB0ABh4Ajmc1AAw8AMznbOABoOe8LMvv0UcAAK/1NvoAAOD1BAAABAkAAAgSAAAQJAAAIEgAAECQAACAIAEAAEECAACCBAAABAkAAAgSAAAQJAAAIEgAAECQAACAIAEAAEECAACCBAAABAkAAAgSAAAQJAAAIEgAAECQAACAIAEAAEECAACCBAAABAkAAAgSAAAQJAAAIEgAAECQAACAIAEAAEECAACCBAAABAkAAAgSAAAQJAAAIEgAAECQAACAIAEAAEECAACCBAAABAkAAAgSAAAQJAAAIEgAAECQAACAIAEAAEECAACCBAAABAkAAAgSAAAQJAAAIEgAAECQAACAIAEAAEECAACCBAAABAkAAAgSAAAQJAAAIEgAAECQAACAIAEAAEECAACCBAAABAkAAAgSAAAQJAAAIEgAAECQAACAIAEAAEECAACCBAAABAkAAAgSAAAQJAAAIEgAAECQAACAIAEAAEECAACCBAAABAkAAAgSAAAQJAAAIEgAAECQAACAIAEAAEECAACCBAAABAkAAAgSAAAQJAAAIEgAAECQAACAIAEAAEECAACCBAAABAkAAAgSAAAQJAAAIEgAAECQAACAIAEAAEECAACCBAAABAkAAAgSAAAQJAAAIEgAAECQAACAIAEAAEECAACCBAAABAkAAAgSAAAQJAAAIEgAAECQAACAIAEAAEECAACCBAAABAkAAAgSAAAQJAAAIEgAAECQAACAIAEAAEECAACCBAAABAkAAAgSAAAQJAAAIEgAAECQAACAIAEAAEECAACCBAAABAkAAAgSAAAQJAAAIEgAAECQAACAIAEAAEECAACCBAAABAkAAAgSAAAQJAAAIEgAAECQAACAIAEAAEECAACCBAAABAkAAAgSAAAQJAAAIEgAAECQAACAoNPlchl9AwDwYj4BAIAgAQAAQQIAAIIEAAAECQAACBIAABAkAAAgSAAAQJAAAIAgAQAAQQIAAIIEAAAECQAACBIAABAkAAAgSAAAQJAAAIAgAQAAQQIAAIIEAAAECQAACBIAABAkAAAgSAAAQJAAAIAgAQAAQQIAAIIEAAAECQAACBIAABAkAAAg6Hz6+LyMPgKqLr/eTyP/vv9/6PIJAAAECQAACBIAABAkAAAgSAAAQJAAAIAgAQAAQQIAAIIEAAAECQAACBIAABAkAAAgSAAAQJAAAIAgAQAAQQIAAIIEAAAECQAACBIAABAkAAAgSAAAQJAAAIAgAQAAQQIAAIIEAAAECQAACBIAABAkAAAgSAAAQJAAAIAgAQAAQQIAAIIEAAAECQAACBIAABAkAAAgSAAAQJAAAIAgAQAAQQIAAIIEAAAECQAACBIAABAkAAAgSAAAQJAAAIAgAQAAQQIAAIIEAAAECQAACBIAABAkAAAgSAAAQJAAAIAgAQAAQQIAAIIEAAAECQAACBIAABAkAAAgSAAAQJAAAIAgAQAAQQIAAIIEAAAECQAACBIAABAkAAAgSAAAQJAAAIAgAQAAQQIAAIIEAAAECQAACBIAABAkAAAgSAAAQJAAAIAgAQAAQQIAAIIEAAAECQAACBIAABAkAAAgSAAAQJAAAIAgAQAAQQIAAIIEAAAECQAACBIAABAkAAAgSAAAQJAAAIAgAQAAQQIAAIIEAAAECQAACBIAABAkAAAgSAAAQJAAAIAgAQAAQQIAAIIEAAAECQAACBIAABAkAAAgSAAAQJAAAIAgAQAAQQIAAIIEAAAECQAACBIAABAkAAAgSAAAQJAAAIAgAQAAQQIAAIIEAAAECQAACBIAABAkAAAgSAAAQJAAAIAgAQAAQQIAAIIEAAAECQAACBIAABAkAAAgSAAAQJAAAIAgAQAAQQIAAIIEAAAECQAACBIAABAkAAAgSAAAQJAAAIAgAQAAQQIAAIIEAAAECQAACBIAABAkAAAgSAAAQJAAAIAgAQAAQQIAAIIEAAAECQAACBIAABAkAAAgSAAAQJAAAIAgAQAAQedlWX4sy/Lzzuvb688CALZ0vvx6/3dZln/+f/3h9PH5fREIADCV89oPCAQAmM9qAKwRCABwPE8HwBqBAAD7s3kArBEIAPB6wwNgjUAAgK+3+wBYIxAA4O8dPgDWCAQA+NP0AbBGIABQlA+ANQIBgBkJgCcJBACOSABsTCAAsEcCYDCBAMAIAmDnBAIAWxAABycQAHiEAJicQADgGgEQJxAAmgQAdwkEgDkJAJ4iEACOSQCwKYEAsE8CgKEEAsAYAoBdEwgA2xAAHJpAAHiMAGBqAgHgOgFAmkAAqgQA3CEQgFkJAHjCFwQCwBCny+Uy+gZgkNPHpzcAiHobfQAA8HoCAACCBAAABHkIENp+LL7FAEkeAgRu8jVHmJcAAB4mEOC4BACwGYEA+yUAgGEEAowjAIDdEgiwHQEAHJZAgMcJAGBaAgFuEwBAlkCgTAAA3CAQmJkAAHiQQODIBADARgQCeyYAAAYRCIwkAAB2SiCwJQEAcFACgWcIAIBJCQTuEQAAUQKhTQAAcJVAmJsAAOAhAuHYBAAAmxAI+yYAABhCIIwlAADYJYGwLQEAwCEJhOcIAACmJBDuEwAAJNUDQQAAwBWzB4IAAIAHHD0QBAAAbGDvgSAAAGCA0YEgAABgh7YOBAEAAAf0bCAIAACY0FogCAAACHobfQAA8HoCAACCBAAABAkAAAgSAAAQJAAAIEgAAECQAACAIAEAAEECAACCBAAABAkAAAgSAAAQJAAAIEgAAEDQf5pXFokUyDSTAAAAAElFTkSuQmCC)}.os-icon.linux{background-image:url(data:image/png;base64,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)}.os-icon.android{background-image:url(data:image/png;base64,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)}.os-icon.other{background-image:url(data:image/png;base64,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)}::ng-deep .date-time-container.data-table-date-time{position:fixed;z-index:9999}::ng-deep .date-time-container.data-table-date-time .p-calendar .p-inputtext{height:.0625rem;width:.0625rem;padding:0}::ng-deep .date-time-container.data-table-date-time .filter-button-container{height:3.125rem;display:flex;flex-direction:row;justify-content:center;align-items:center}::ng-deep .date-time-container.data-table-date-time .filter-button-container .toggleButton{padding-left:var(--paddingSmall);padding-right:var(--paddingSmall);text-align:center;background-color:var(--inputBorder);color:var(--tableText);width:unset;height:1.4375rem;line-height:1.4375rem;font-size:.875rem;font-weight:600;position:relative;float:left;cursor:pointer;border-radius:.25rem;margin-right:var(--marginSmall);transition:.3s}::ng-deep .date-time-container.data-table-date-time .filter-button-container .toggleButton:hover{filter:brightness(90%);transition:.3s}::ng-deep .date-time-container.data-table-date-time .p-calendar .p-inputtext{border-top-left-radius:1.25rem;border-bottom-left-radius:1.25rem;text-indent:.3125rem}::ng-deep .date-time-container.data-table-date-time .p-calendar .p-button-icon-only{border-top-right-radius:1.25rem;border-bottom-right-radius:1.25rem}::ng-deep .tag-selector-container.data-table-tag-selector{position:fixed;z-index:9999;width:21.875rem;height:-moz-fit-content;height:fit-content;background:var(--formBackground);display:flex;flex-direction:column;justify-content:flex-end;padding:.625rem;border-radius:var(--inputBorderRadius);box-shadow:var(--shadowLarge);margin-top:-1.25rem;border-color:var(--stroke);border-style:solid}::ng-deep .tag-selector-container.data-table-tag-selector .tag-selector-label{margin-bottom:.3125rem;margin-left:.125rem;font-weight:600;color:var(--menu)}::ng-deep .tag-selector-container.data-table-tag-selector .select2-search__field{height:2.1875rem}::ng-deep .tag-selector-container.data-table-tag-selector .nf-select2-dropdown{width:calc(100% - 1.25rem)!important}::ng-deep .tag-selector-container .icon-close{position:absolute;top:.5rem;right:.5rem;cursor:pointer;color:var(--icon);font-weight:600}::ng-deep .tag-selector-container .icon-close:hover{filter:brightness(50%)}\n"] }]
8097
8154
  }], ctorParameters: function () { return [{ type: DataTableService }, { type: DataTableFilterService }]; }, propDecorators: { rowData: [{
8098
8155
  type: Input
8099
8156
  }], expandRowData: [{
@@ -8341,6 +8398,7 @@ class ProjectableForm extends ExtendableComponent {
8341
8398
  this.entityType = 'identities';
8342
8399
  this.entityClass = Entity;
8343
8400
  this.isLoading = false;
8401
+ this.usePreviousLocation = true;
8344
8402
  this.moreActions = [];
8345
8403
  this.tagElements = [];
8346
8404
  this.tagData = [];
@@ -8521,7 +8579,7 @@ class ProjectableForm extends ExtendableComponent {
8521
8579
  }
8522
8580
  }
8523
8581
  returnToListPage() {
8524
- if (this.location && this.previousRoute) {
8582
+ if (this.location && this.previousRoute && this.usePreviousLocation) {
8525
8583
  this.location.back();
8526
8584
  }
8527
8585
  else {
@@ -9020,6 +9078,7 @@ class JsonViewComponent {
9020
9078
  this.readOnly = false;
9021
9079
  this.jsonInvalid = false;
9022
9080
  this.showCopy = false;
9081
+ this.showLineNumbers = true;
9023
9082
  this.dataChange = new EventEmitter();
9024
9083
  this.jsonChange = new EventEmitter();
9025
9084
  this.jsonInvalidChange = new EventEmitter();
@@ -9173,11 +9232,11 @@ class JsonViewComponent {
9173
9232
  this.growlerService.show(growlerData);
9174
9233
  }
9175
9234
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: JsonViewComponent, deps: [{ token: GrowlerService }], target: i0.ɵɵFactoryTarget.Component }); }
9176
- 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:12.5rem;border:var(--jsonEditorBorder);border-radius:var(--inputBorderRadius);overflow:hidden}#jsoneditor.read-only .jse-menu{display:none}.copy.icon-copy{position:absolute;top:.625rem;right:.625rem;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"] }] }); }
9235
+ 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", showLineNumbers: "showLineNumbers" }, 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, 'hide-line-numbers': !showLineNumbers}\" #editor (keyup.enter)=\"enterKeyPressed($event)\" (keyup)=\"jsonChanged($event)\"></div>\n<div *ngIf=\"showCopy\" class=\"icon-copy copy\" (click)=\"copyToClipboad()\"></div>\n", styles: [":host{display:flex;width:100%;height:100%;flex-direction:column;position:relative}#jsoneditor{height:100%;min-height:12.5rem;border:var(--jsonEditorBorder);border-radius:var(--inputBorderRadius);overflow:hidden}#jsoneditor.read-only .jse-menu{display:none}.copy.icon-copy{position:absolute;top:.625rem;right:.625rem;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"] }] }); }
9177
9236
  }
9178
9237
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: JsonViewComponent, decorators: [{
9179
9238
  type: Component,
9180
- 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:12.5rem;border:var(--jsonEditorBorder);border-radius:var(--inputBorderRadius);overflow:hidden}#jsoneditor.read-only .jse-menu{display:none}.copy.icon-copy{position:absolute;top:.625rem;right:.625rem;background:transparent}::ng-deep #jsoneditor .jse-json-node.svelte-1wlxti1 .jse-insert-area.svelte-1wlxti1.svelte-1wlxti1.svelte-1wlxti1{display:none}\n"] }]
9239
+ args: [{ selector: 'lib-json-view', template: "<div id=\"jsoneditor\" [ngClass]=\"{'read-only': readOnly, 'hide-line-numbers': !showLineNumbers}\" #editor (keyup.enter)=\"enterKeyPressed($event)\" (keyup)=\"jsonChanged($event)\"></div>\n<div *ngIf=\"showCopy\" class=\"icon-copy copy\" (click)=\"copyToClipboad()\"></div>\n", styles: [":host{display:flex;width:100%;height:100%;flex-direction:column;position:relative}#jsoneditor{height:100%;min-height:12.5rem;border:var(--jsonEditorBorder);border-radius:var(--inputBorderRadius);overflow:hidden}#jsoneditor.read-only .jse-menu{display:none}.copy.icon-copy{position:absolute;top:.625rem;right:.625rem;background:transparent}::ng-deep #jsoneditor .jse-json-node.svelte-1wlxti1 .jse-insert-area.svelte-1wlxti1.svelte-1wlxti1.svelte-1wlxti1{display:none}\n"] }]
9181
9240
  }], ctorParameters: function () { return [{ type: GrowlerService }]; }, propDecorators: { data: [{
9182
9241
  type: Input
9183
9242
  }], schema: [{
@@ -9188,6 +9247,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
9188
9247
  type: Input
9189
9248
  }], showCopy: [{
9190
9249
  type: Input
9250
+ }], showLineNumbers: [{
9251
+ type: Input
9191
9252
  }], dataChange: [{
9192
9253
  type: Output
9193
9254
  }], jsonChange: [{
@@ -9404,7 +9465,7 @@ class TerminatorFormComponent extends ProjectableForm {
9404
9465
  });
9405
9466
  }
9406
9467
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TerminatorFormComponent, deps: [{ token: TerminatorFormService }, { 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 }); }
9407
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: TerminatorFormComponent, selector: "lib-configuration", inputs: { formData: "formData", errors: "errors" }, outputs: { close: "close" }, 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 ? 'Terminator Details' : 'Create Terminator')\"\n [moreActions]=\"formData.moreActions\"\n (actionRequested)=\"headerActionRequested($event)\"\n [(formView)]=\"formView\"\n [saveDisabled]=\"svc.saveDisabled || formDataInvalid\"\n ></lib-form-header>\n <div class=\"terminator-form-container projectable-form-container\">\n <div class=\"projectable-form-main-column form-group-row\" [hidden]=\"formView !== 'simple'\">\n <div class=\"form-group-column one-half\">\n <lib-form-field-container\n [title]=\"'Service'\"\n [contentStyle]=\"'z-index: 10003'\"\n >\n <input class=\"form-field-input read-only\" [(ngModel)]=\"selectedServiceNamedAttribute\" [disabled]=\"true\"/>\n <!--<lib-tag-selector\n [(selectedNamedAttributes)]=\"svc.selectedServiceNamedAttributes\"\n [availableNamedAttributes]=\"svc.serviceNamedAttributes\"\n [placeholder]=\"'Select a service'\"\n (addNamedAttribute)=\"serviceAttributeChanged($event)\"\n (namedAttributeRemoved)=\"serviceAttributeChanged()\"\n ></lib-tag-selector>-->\n </lib-form-field-container>\n <lib-form-field-container\n [title]=\"'Router'\"\n [contentStyle]=\"'z-index: 10002'\"\n >\n <input class=\"form-field-input read-only\" [(ngModel)]=\"selectedRouterNamedAttribute\" [disabled]=\"true\"/>\n <!--<lib-tag-selector\n [(selectedNamedAttributes)]=\"svc.selectedRouterNamedAttributes\"\n [availableNamedAttributes]=\"svc.routerNamedAttributes\"\n [placeholder]=\"'Select a router'\"\n (addNamedAttribute)=\"routerAttributeChanged($event)\"\n (namedAttributeRemoved)=\"routerAttributeChanged()\"\n ></lib-tag-selector>-->\n </lib-form-field-container>\n <lib-form-field-container\n [title]=\"'Identity'\"\n [contentStyle]=\"'z-index: 10001'\"\n >\n <input class=\"form-field-input read-only\" [(ngModel)]=\"selectedIdentityNamedAttribute\" [disabled]=\"true\"/>\n <!--<lib-tag-selector\n [(selectedNamedAttributes)]=\"svc.selectedIdentityNamedAttributes\"\n [availableNamedAttributes]=\"svc.identityNamedAttributes\"\n [placeholder]=\"'Select an identity'\"\n (addNamedAttribute)=\"identityAttributeChanged($event)\"\n (namedAttributeRemoved)=\"identityAttributeChanged()\"\n ></lib-tag-selector>-->\n </lib-form-field-container>\n </div>\n <div class=\"form-group-column one-half\">\n <lib-form-field-container\n [title]=\"'Address'\"\n [contentStyle]=\"'z-index: 1001'\"\n >\n <input class=\"form-field-input read-only\" [disabled]=\"true\" [(ngModel)]=\"formData.address\"/>\n </lib-form-field-container>\n <lib-form-field-container\n [showHeader]=\"false\"\n [layout]=\"'row'\"\n [contentStyle]=\"'z-index: 1001'\"\n >\n <div class=\"form-field-label-container\">\n <span class=\"form-field-title\">Binding</span>\n <input class=\"form-field-input\" [disabled]=\"true\" [(ngModel)]=\"formData.binding\"/>\n </div>\n <div class=\"form-field-label-container\">\n <span class=\"form-field-title\">Identity Secret</span>\n <input class=\"form-field-input\" [disabled]=\"true\" [(ngModel)]=\"formData.identitySecret\"/>\n </div>\n </lib-form-field-container>\n <lib-form-field-container\n [layout]=\"'row'\"\n [showHeader]=\"false\"\n >\n <div class=\"form-field-label-container\">\n <span class=\"form-field-title\">Hosting Cost</span>\n <input class=\"form-field-input\" [disabled]=\"true\" [(ngModel)]=\"formData.cost\" type=\"number\"/>\n </div>\n <div class=\"form-field-label-container\">\n <span class=\"form-field-title\">Precedence</span>\n <select\n [(ngModel)]=\"formData.precedence\"\n [disabled]=\"true\"\n id=\"hostingPrecedence\"\n class=\"form-field-dropdown read-only\"\n >\n <option value=\"default\">Default</option>\n <option value=\"required\">Required</option>\n <option value=\"failed\">Failed</option>\n </select>\n </div>\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: [".terminator-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}::ng-deep .terminator-form-container select:disabled,::ng-deep .terminator-form-container input:disabled{opacity:.75!important;cursor:text;background-color:var(--stroke)!important}@media (max-width: 1524px){.terminator-form-container .projectable-form-main-column{max-width:38.75rem}}\n"], dependencies: [{ 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.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { 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: "component", type: FormHeaderComponent, selector: "lib-form-header", inputs: ["data", "badges", "title", "moreActions", "formView", "saveDisabled", "saveTooltip", "actionButtonText", "moreActionsText", "showHeaderToggle", "showHeaderButton"], 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", "contentClass", "showHeader", "showToggle", "headerActions", "headerToggle"], outputs: ["actionRequested", "headerToggleChange"] }, { 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"] }] }); }
9468
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: TerminatorFormComponent, selector: "lib-configuration", inputs: { formData: "formData", errors: "errors" }, outputs: { close: "close" }, 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 ? 'Terminator Details' : 'Create Terminator')\"\n [moreActions]=\"formData.moreActions\"\n (actionRequested)=\"headerActionRequested($event)\"\n [(formView)]=\"formView\"\n [saveDisabled]=\"svc.saveDisabled || formDataInvalid\"\n ></lib-form-header>\n <div class=\"terminator-form-container projectable-form-container\">\n <div class=\"projectable-form-main-column form-group-row\" [hidden]=\"formView !== 'simple'\">\n <div class=\"form-group-column one-half\">\n <lib-form-field-container\n [title]=\"'Service'\"\n [contentStyle]=\"'z-index: 10003'\"\n >\n <input class=\"form-field-input read-only\" [(ngModel)]=\"selectedServiceNamedAttribute\" [disabled]=\"true\"/>\n <!--<lib-tag-selector\n [(selectedNamedAttributes)]=\"svc.selectedServiceNamedAttributes\"\n [availableNamedAttributes]=\"svc.serviceNamedAttributes\"\n [placeholder]=\"'Select a service'\"\n (addNamedAttribute)=\"serviceAttributeChanged($event)\"\n (namedAttributeRemoved)=\"serviceAttributeChanged()\"\n ></lib-tag-selector>-->\n </lib-form-field-container>\n <lib-form-field-container\n [title]=\"'Router'\"\n [contentStyle]=\"'z-index: 10002'\"\n >\n <input class=\"form-field-input read-only\" [(ngModel)]=\"selectedRouterNamedAttribute\" [disabled]=\"true\"/>\n <!--<lib-tag-selector\n [(selectedNamedAttributes)]=\"svc.selectedRouterNamedAttributes\"\n [availableNamedAttributes]=\"svc.routerNamedAttributes\"\n [placeholder]=\"'Select a router'\"\n (addNamedAttribute)=\"routerAttributeChanged($event)\"\n (namedAttributeRemoved)=\"routerAttributeChanged()\"\n ></lib-tag-selector>-->\n </lib-form-field-container>\n <lib-form-field-container\n [title]=\"'Identity'\"\n [contentStyle]=\"'z-index: 10001'\"\n >\n <input class=\"form-field-input read-only\" [(ngModel)]=\"selectedIdentityNamedAttribute\" [disabled]=\"true\"/>\n <!--<lib-tag-selector\n [(selectedNamedAttributes)]=\"svc.selectedIdentityNamedAttributes\"\n [availableNamedAttributes]=\"svc.identityNamedAttributes\"\n [placeholder]=\"'Select an identity'\"\n (addNamedAttribute)=\"identityAttributeChanged($event)\"\n (namedAttributeRemoved)=\"identityAttributeChanged()\"\n ></lib-tag-selector>-->\n </lib-form-field-container>\n </div>\n <div class=\"form-group-column one-half\">\n <lib-form-field-container\n [title]=\"'Address'\"\n [contentStyle]=\"'z-index: 1001'\"\n >\n <input class=\"form-field-input read-only\" [disabled]=\"true\" [(ngModel)]=\"formData.address\"/>\n </lib-form-field-container>\n <lib-form-field-container\n [showHeader]=\"false\"\n [layout]=\"'row'\"\n [contentStyle]=\"'z-index: 1001'\"\n >\n <div class=\"form-field-label-container\">\n <span class=\"form-field-title\">Binding</span>\n <input class=\"form-field-input\" [disabled]=\"true\" [(ngModel)]=\"formData.binding\"/>\n </div>\n <div class=\"form-field-label-container\">\n <span class=\"form-field-title\">Identity Secret</span>\n <input class=\"form-field-input\" [disabled]=\"true\" [(ngModel)]=\"formData.identitySecret\"/>\n </div>\n </lib-form-field-container>\n <lib-form-field-container\n [layout]=\"'row'\"\n [showHeader]=\"false\"\n >\n <div class=\"form-field-label-container\">\n <span class=\"form-field-title\">Hosting Cost</span>\n <input class=\"form-field-input\" [disabled]=\"true\" [(ngModel)]=\"formData.cost\" type=\"number\"/>\n </div>\n <div class=\"form-field-label-container\">\n <span class=\"form-field-title\">Precedence</span>\n <select\n [(ngModel)]=\"formData.precedence\"\n [disabled]=\"true\"\n id=\"hostingPrecedence\"\n class=\"form-field-dropdown read-only\"\n >\n <option value=\"default\">Default</option>\n <option value=\"required\">Required</option>\n <option value=\"failed\">Failed</option>\n </select>\n </div>\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: [".terminator-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}::ng-deep .terminator-form-container select:disabled,::ng-deep .terminator-form-container input:disabled{opacity:.75!important;cursor:text;background-color:var(--stroke)!important}@media (max-width: 1524px){.terminator-form-container .projectable-form-main-column{max-width:38.75rem}}\n"], dependencies: [{ 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.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { 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: "component", type: FormHeaderComponent, selector: "lib-form-header", inputs: ["data", "badges", "title", "moreActions", "formView", "saveDisabled", "saveTooltip", "actionButtonText", "moreActionsText", "showHeaderToggle", "showHeaderButton"], 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", "contentClass", "showHeader", "showToggle", "headerActions", "headerToggle"], outputs: ["actionRequested", "headerToggleChange"] }, { kind: "component", type: LoadingIndicatorComponent, selector: "lib-loading-indicator", inputs: ["isLoading"] }, { kind: "component", type: JsonViewComponent, selector: "lib-json-view", inputs: ["data", "schema", "readOnly", "jsonInvalid", "showCopy", "showLineNumbers"], outputs: ["dataChange", "jsonChange", "jsonInvalidChange"] }] }); }
9408
9469
  }
9409
9470
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TerminatorFormComponent, decorators: [{
9410
9471
  type: Component,
@@ -13355,7 +13416,7 @@ class IdentityFormComponent extends ProjectableForm {
13355
13416
  this.isLoading = false;
13356
13417
  });
13357
13418
  }
13358
- validate() {
13419
+ validate(identity) {
13359
13420
  this.errors = {};
13360
13421
  if (isEmpty(this.formData.name)) {
13361
13422
  this.errors['name'] = true;
@@ -13432,7 +13493,7 @@ class IdentityFormComponent extends ProjectableForm {
13432
13493
  provide: MatDialogRef,
13433
13494
  useValue: {}
13434
13495
  }
13435
- ], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div class=\"projectable-form-wrapper\"\n (keyup.enter)=\"save($event)\"\n (keyup.escape)=\"closeModal(false)\"\n>\n <lib-form-header\n [data]=\"formData\"\n [title]=\"formData.id ? 'Edit Identity: ' : 'Create New Identity'\"\n [moreActions]=\"moreActions\"\n (actionRequested)=\"headerActionRequested($event)\"\n [(formView)]=\"formView\"\n ></lib-form-header>\n <div class=\"identity-form-container projectable-form-container\">\n <div class=\"projectable-form-main-column form-group-row\" *ngIf=\"formView === 'simple'\">\n <div class=\"form-group-column three-fifths\">\n <lib-form-field-container [title]=\"'Identity Name'\" [label]=\"'REQUIRED'\">\n <input\n class=\"form-field-input\"\n placeholder=\"Name this identity\"\n [ngClass]=\"{error: errors['name']}\"\n [(ngModel)]=\"formData.name\"\n autofocus\n #nameFieldInput\n />\n </lib-form-field-container>\n <lib-form-field-container\n [title]=\"'Select or create Identity attributes'\"\n [label]=\"'OPTIONAL'\"\n [contentStyle]=\"'z-index: 99999999'\"\n [helpText]=\"'Attributes are tags applied to an resource. Apply the same tag to other Identities to form a group of Identities.'\"\n >\n <lib-tag-selector\n [(selectedRoleAttributes)]=\"formData.roleAttributes\"\n [availableRoleAttributes]=\"identityRoleAttributes\"\n [placeholder]=\"'Add attributes to group Identities'\"\n ></lib-tag-selector>\n </lib-form-field-container>\n <ng-content select=\"[slot=column-1-slot-1]\"></ng-content>\n <lib-form-field-container\n [title]=\"'Auth Policy'\"\n [label]=\"'OPTIONAL'\"\n [helpText]=\"'Authentication Policies restrict the authentication methods available to identities.'\"\n >\n <select\n [(ngModel)]=\"formData.authPolicyId\"\n id=\"authPolicyId\"\n class=\"form-field-dropdown\"\n >\n <option value=\"\">Select an Authentication Policy</option>\n <option\n *ngFor=\"let policy of authPolicies\"\n [value]=\"policy.id\"\n >\n {{ policy.name }}\n </option>\n </select>\n <div class=\"form-field-label-container\" style=\"gap: var(--paddingMedium)\">\n <div class=\"form-field-header\">\n <div class=\"form-field-title-container\">\n <span class=\"form-field-title\">External ID</span>\n </div>\n <span class=\"form-field-label\">OPTIONAL</span>\n </div>\n <input class=\"form-field-input\" placeholder=\"Optional External ID\" [(ngModel)]=\"formData.externalId\"/>\n </div>\n </lib-form-field-container>\n <ng-content select=\"[slot=column-1-slot-2]\"></ng-content>\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]=\"'Enrollment Type'\"\n [title2]=\"enrollmentTypeTitle\"\n [layout]=\"'row'\"\n class=\"form-field-advanced\"\n >\n <select\n id=\"EnrollmentType\"\n class=\"form-field-dropdown\"\n [ngClass]=\"{disabled: isEditing}\"\n [(ngModel)]=\"enrollmentType\"\n (change)=\"updateEnrollment()\"\n >\n <option value=\"ott\">One Time Token</option>\n <option value=\"CA\">Certificate Authority</option>\n <option value=\"updb\">UPDB</option>\n <option value=\"none\">None</option>\n </select>\n <select\n id=\"CertAuthorities\"\n class=\"form-field-dropdown\"\n *ngIf=\"enrollmentType === 'CA'\"\n [ngClass]=\"{disabled: isEditing}\"\n [(ngModel)]=\"enrollmentCA\"\n [ngClass]=\"{error: errors.enrollmentCA}\"\n (change)=\"updateEnrollment()\"\n >\n <option *ngFor=\"let ca of cas\" [value]=\"ca.id\">{{ca.name}}</option>\n </select>\n <input\n *ngIf=\"enrollmentType === 'updb' && !isEditing\"\n [ngClass]=\"{disabled: isEditing, error: errors.enrollmentUPDB}\"\n [(ngModel)]=\"enrollmentUPDB\"\n (keyup)=\"updateEnrollment()\"\n class=\"form-field-input\"\n id=\"UPDBName\"\n type=\"text\"\n maxlength=\"500\"\n placeholder=\"Enter a name\"\n >\n </lib-form-field-container>\n <lib-form-field-container\n [title]=\"'Admin'\"\n [layout]=\"'row'\"\n class=\"form-field-advanced is-admin-container\"\n >\n <div class=\"config-item\">\n <div class=\"config-container toggle-container\">\n <div class=\"config-container-label\">IS ADMIN</div>\n <div\n (click)=\"toggleIsAdmin()\"\n [ngClass]=\"{ on: formData.isAdmin }\"\n class=\"toggle\"\n >\n <span [hidden]=\"!formData.isAdmin\" class=\"on-label\">YES</span>\n <span [hidden]=\"formData.isAdmin\" class=\"off-label\">NO</span>\n <div class=\"switch\"></div>\n </div>\n </div>\n </div>\n </lib-form-field-container>\n <lib-form-field-container\n [title]=\"'Hosting Cost'\"\n [title2]=\"'Precedence'\"\n [layout]=\"'row'\"\n class=\"form-field-advanced\"\n >\n <input class=\"form-field-input\" [(ngModel)]=\"formData.defaultHostingCost\" type=\"number\"/>\n <select\n [(ngModel)]=\"formData.defaultHostingPrecedence\"\n id=\"hostingPrecedence\"\n class=\"form-field-dropdown\"\n >\n <option value=\"default\">Default</option>\n <option value=\"required\">Required</option>\n <option value=\"failed\">Failed</option>\n </select>\n </lib-form-field-container>\n <lib-form-field-container *ngFor=\"let tagElement of tagElements\"\n [title]=\"tagElement.label\"\n [label]=\"'OPTIONAL'\"\n class=\"form-field-advanced\"\n >\n <div [innerHTML]=\"tagElement.content | safe\"></div>\n </lib-form-field-container>\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 <lib-form-field-container\n [title]=\"'App Data'\"\n [label]=\"'OPTIONAL'\"\n class=\"form-field-advanced\"\n >\n <lib-json-view [(data)]=\"formData.appData\"></lib-json-view>\n </lib-form-field-container>\n </div>\n </div>\n <div class=\"form-group-column two-fifths\">\n <ng-content select=\"[slot=column-2-slot-1]\"></ng-content>\n <lib-form-field-container\n *ngIf=\"hasEnrolmentToken || hasAuthenticator\"\n [showHeader]=\"false\"\n >\n <lib-qr-code\n [identity]=\"formData\"\n [jwt]=\"jwt\"\n [expiration]=\"enrollmentExpiration\"\n [authenticators]=\"formData.authenticators\"\n [type]=\"'identity'\"\n [canExpand]=\"true\"\n (doRefresh)=\"refreshIdentity()\"\n ></lib-qr-code>\n </lib-form-field-container>\n <lib-form-field-container\n *ngIf=\"formData.id\"\n [title]=\"'Associated Services'\"\n [count]=\"associatedServices.length\"\n [class]=\"'hide-overflow'\"\n [helpText]=\"'Preview list of all services that this Identity is associated with.'\"\n >\n <lib-preview-list\n (itemSelected)=\"serviceSelected($event)\"\n [clickable]=\"true\"\n [isLoading]=\"servicesLoading\"\n [allNames]=\"associatedServiceNames\"\n ></lib-preview-list>\n <div class=\"svc-test-result\" [ngClass]=\"{'test-result-open': testResultOpen}\">\n <div class=\"close icon-close\" (click)=\"closeTestResult()\"></div>\n <div class=\"result-container\" [innerHTML]=\"testResult\" ></div>\n </div>\n </lib-form-field-container>\n <lib-form-field-container\n *ngIf=\"formData.id\"\n [title]=\"'Associated Service Policies'\"\n [count]=\"associatedServicePolicies.length\"\n [helpText]=\"'Preview list of all service policies that this Identity is associated with.'\"\n >\n <lib-preview-list\n (itemSelected)=\"serviceSelected($event)\"\n [clickable]=\"false\"\n [isLoading]=\"servicePoliciesLoading\"\n [allNames]=\"associatedServicePolicyNames\"\n ></lib-preview-list>\n </lib-form-field-container>\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: [".identity-form-container{display:flex;flex-direction:column;height:100%;width:100%;align-items:center;gap:.9375rem}.disabled{opacity:.5;pointer-events:none}::ng-deep .admin-toggle{width:100%;width:35%;display:flex}::ng-deep .admin-toggle .form-field-line{display:none}::ng-deep .admin-toggle .toggle{width:100%}::ng-deep .is-admin-container .form-field-title-container.title-container-2{width:35%!important}.svc-test-result{position:absolute;transition:var(--transition);height:0;width:100%;background-color:var(--background);bottom:0;font-weight:600;padding-left:.625rem;padding-right:.625rem;border-color:var(--inputBorder);border-style:solid;border-width:var(--inputBorderWidth);border-bottom-right-radius:var(--inputBorderRadius);border-bottom-left-radius:var(--inputBorderRadius);border-top-style:none}.svc-test-result.test-result-open{height:-moz-fit-content;height:fit-content;box-shadow:0 -.125rem .6875rem 0 var(--boxShadow);padding-bottom:.9375rem;padding-top:.9375rem}.svc-test-result .close.icon-close{top:.625rem;right:.625rem;font-size:1.125rem;height:1.125rem;width:1.125rem;line-height:1.125rem}::ng-deep .admin-toggle .form-field-toggle-container:focus .form-field-label{color:var(--primaryColor)}::ng-deep .admin-toggle .form-field-toggle-container:focus .form-field-line{border-color:var(--primaryColor)}::ng-deep .admin-toggle .form-field-toggle-container:focus .toggle{border-color:var(--primaryColor);border-style:solid;border-width:var(--inputBorderWidth)}::ng-deep .admin-toggle .form-field-toggle-container:focus .toggle .switch{top:.0625rem}::ng-deep .copy.icon-copy.url-copy{background-color:var(--navigation)}\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.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { 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", "badges", "title", "moreActions", "formView", "saveDisabled", "saveTooltip", "actionButtonText", "moreActionsText", "showHeaderToggle", "showHeaderButton"], 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", "contentClass", "showHeader", "showToggle", "headerActions", "headerToggle"], outputs: ["actionRequested", "headerToggleChange"] }, { kind: "component", type: PreviewListComponent, selector: "lib-preview-list", inputs: ["label", "clickable", "isLoading", "allNames", "items", "allowRemove", "tooltip", "showfilter"], outputs: ["itemSelected", "itemRemoved"] }, { 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: TagSelectorComponent, selector: "lib-tag-selector", inputs: ["placeholder", "disableField", "disableCreate", "hideOption", "isLoading", "errorMessage", "focusOnInit", "selectedRoleAttributes", "selectedNamedAttributes", "hasError", "availableRoleAttributes", "availableNamedAttributes"], outputs: ["addRoleAttribute", "addNamedAttribute", "roleAttributeRemoved", "namedAttributeRemoved", "selectedRoleAttributesChange", "selectedNamedAttributesChange", "filterChange"] }, { kind: "component", type: QrCodeComponent, selector: "lib-qr-code", inputs: ["jwt", "token", "expiration", "identity", "type", "authenticators", "qrOnly", "canExpand"], outputs: ["doRefresh"] }, { kind: "component", type: CustomTagsComponent, selector: "lib-custom-tags", inputs: ["tags"], outputs: ["tagsChange"] }, { kind: "pipe", type: SafePipe, name: "safe" }] }); }
13496
+ ], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div class=\"projectable-form-wrapper\"\n (keyup.enter)=\"save($event)\"\n (keyup.escape)=\"closeModal(false)\"\n>\n <lib-form-header\n [data]=\"formData\"\n [title]=\"formData.id ? 'Edit Identity: ' : 'Create New Identity'\"\n [moreActions]=\"moreActions\"\n (actionRequested)=\"headerActionRequested($event)\"\n [(formView)]=\"formView\"\n ></lib-form-header>\n <div class=\"identity-form-container projectable-form-container\">\n <div class=\"projectable-form-main-column form-group-row\" *ngIf=\"formView === 'simple'\">\n <div class=\"form-group-column three-fifths\">\n <lib-form-field-container [title]=\"'Identity Name'\" [label]=\"'REQUIRED'\">\n <input\n class=\"form-field-input\"\n placeholder=\"Name this identity\"\n [ngClass]=\"{error: errors['name']}\"\n [(ngModel)]=\"formData.name\"\n autofocus\n #nameFieldInput\n />\n </lib-form-field-container>\n <lib-form-field-container\n [title]=\"'Select or create Identity attributes'\"\n [label]=\"'OPTIONAL'\"\n [contentStyle]=\"'z-index: 99999999'\"\n [helpText]=\"'Attributes are tags applied to an resource. Apply the same tag to other Identities to form a group of Identities.'\"\n >\n <lib-tag-selector\n [(selectedRoleAttributes)]=\"formData.roleAttributes\"\n [availableRoleAttributes]=\"identityRoleAttributes\"\n [placeholder]=\"'Add attributes to group Identities'\"\n ></lib-tag-selector>\n </lib-form-field-container>\n <ng-content select=\"[slot=column-1-slot-1]\"></ng-content>\n <lib-form-field-container\n [title]=\"'Auth Policy'\"\n [label]=\"'OPTIONAL'\"\n [helpText]=\"'Authentication Policies restrict the authentication methods available to identities.'\"\n >\n <select\n [(ngModel)]=\"formData.authPolicyId\"\n id=\"authPolicyId\"\n class=\"form-field-dropdown\"\n >\n <option value=\"\">Select an Authentication Policy</option>\n <option\n *ngFor=\"let policy of authPolicies\"\n [value]=\"policy.id\"\n >\n {{ policy.name }}\n </option>\n </select>\n <div class=\"form-field-label-container\" style=\"gap: var(--paddingMedium)\">\n <div class=\"form-field-header\">\n <div class=\"form-field-title-container\">\n <span class=\"form-field-title\">External ID</span>\n </div>\n <span class=\"form-field-label\">OPTIONAL</span>\n </div>\n <input class=\"form-field-input\" placeholder=\"Optional External ID\" [(ngModel)]=\"formData.externalId\"/>\n </div>\n </lib-form-field-container>\n <ng-content select=\"[slot=column-1-slot-2]\"></ng-content>\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]=\"'Enrollment Type'\"\n [title2]=\"enrollmentTypeTitle\"\n [layout]=\"'row'\"\n class=\"form-field-advanced\"\n >\n <select\n id=\"EnrollmentType\"\n class=\"form-field-dropdown\"\n [ngClass]=\"{disabled: isEditing}\"\n [(ngModel)]=\"enrollmentType\"\n (change)=\"updateEnrollment()\"\n >\n <option value=\"ott\">One Time Token</option>\n <option value=\"CA\">Certificate Authority</option>\n <option value=\"updb\">UPDB</option>\n <option value=\"none\">None</option>\n </select>\n <select\n id=\"CertAuthorities\"\n class=\"form-field-dropdown\"\n *ngIf=\"enrollmentType === 'CA'\"\n [ngClass]=\"{disabled: isEditing}\"\n [(ngModel)]=\"enrollmentCA\"\n [ngClass]=\"{error: errors.enrollmentCA}\"\n (change)=\"updateEnrollment()\"\n >\n <option *ngFor=\"let ca of cas\" [value]=\"ca.id\">{{ca.name}}</option>\n </select>\n <input\n *ngIf=\"enrollmentType === 'updb' && !isEditing\"\n [ngClass]=\"{disabled: isEditing, error: errors.enrollmentUPDB}\"\n [(ngModel)]=\"enrollmentUPDB\"\n (keyup)=\"updateEnrollment()\"\n class=\"form-field-input\"\n id=\"UPDBName\"\n type=\"text\"\n maxlength=\"500\"\n placeholder=\"Enter a name\"\n >\n </lib-form-field-container>\n <lib-form-field-container\n [title]=\"'Admin'\"\n [layout]=\"'row'\"\n class=\"form-field-advanced is-admin-container\"\n >\n <div class=\"config-item\">\n <div class=\"config-container toggle-container\">\n <div class=\"config-container-label\">IS ADMIN</div>\n <div\n (click)=\"toggleIsAdmin()\"\n [ngClass]=\"{ on: formData.isAdmin }\"\n class=\"toggle\"\n >\n <span [hidden]=\"!formData.isAdmin\" class=\"on-label\">YES</span>\n <span [hidden]=\"formData.isAdmin\" class=\"off-label\">NO</span>\n <div class=\"switch\"></div>\n </div>\n </div>\n </div>\n </lib-form-field-container>\n <lib-form-field-container\n [title]=\"'Hosting Cost'\"\n [title2]=\"'Precedence'\"\n [layout]=\"'row'\"\n class=\"form-field-advanced\"\n >\n <input class=\"form-field-input\" [(ngModel)]=\"formData.defaultHostingCost\" type=\"number\"/>\n <select\n [(ngModel)]=\"formData.defaultHostingPrecedence\"\n id=\"hostingPrecedence\"\n class=\"form-field-dropdown\"\n >\n <option value=\"default\">Default</option>\n <option value=\"required\">Required</option>\n <option value=\"failed\">Failed</option>\n </select>\n </lib-form-field-container>\n <lib-form-field-container *ngFor=\"let tagElement of tagElements\"\n [title]=\"tagElement.label\"\n [label]=\"'OPTIONAL'\"\n class=\"form-field-advanced\"\n >\n <div [innerHTML]=\"tagElement.content | safe\"></div>\n </lib-form-field-container>\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 <lib-form-field-container\n [title]=\"'App Data'\"\n [label]=\"'OPTIONAL'\"\n class=\"form-field-advanced\"\n >\n <lib-json-view [(data)]=\"formData.appData\"></lib-json-view>\n </lib-form-field-container>\n </div>\n </div>\n <div class=\"form-group-column two-fifths\">\n <ng-content select=\"[slot=column-2-slot-1]\"></ng-content>\n <lib-form-field-container\n *ngIf=\"hasEnrolmentToken || hasAuthenticator\"\n [showHeader]=\"false\"\n >\n <lib-qr-code\n [identity]=\"formData\"\n [jwt]=\"jwt\"\n [expiration]=\"enrollmentExpiration\"\n [authenticators]=\"formData.authenticators\"\n [type]=\"'identity'\"\n [canExpand]=\"true\"\n (doRefresh)=\"refreshIdentity()\"\n ></lib-qr-code>\n </lib-form-field-container>\n <lib-form-field-container\n *ngIf=\"formData.id\"\n [title]=\"'Associated Services'\"\n [count]=\"associatedServices.length\"\n [class]=\"'hide-overflow'\"\n [helpText]=\"'Preview list of all services that this Identity is associated with.'\"\n >\n <lib-preview-list\n (itemSelected)=\"serviceSelected($event)\"\n [clickable]=\"true\"\n [isLoading]=\"servicesLoading\"\n [allNames]=\"associatedServiceNames\"\n ></lib-preview-list>\n <div class=\"svc-test-result\" [ngClass]=\"{'test-result-open': testResultOpen}\">\n <div class=\"close icon-close\" (click)=\"closeTestResult()\"></div>\n <div class=\"result-container\" [innerHTML]=\"testResult\" ></div>\n </div>\n </lib-form-field-container>\n <lib-form-field-container\n *ngIf=\"formData.id\"\n [title]=\"'Associated Service Policies'\"\n [count]=\"associatedServicePolicies.length\"\n [helpText]=\"'Preview list of all service policies that this Identity is associated with.'\"\n >\n <lib-preview-list\n (itemSelected)=\"serviceSelected($event)\"\n [clickable]=\"false\"\n [isLoading]=\"servicePoliciesLoading\"\n [allNames]=\"associatedServicePolicyNames\"\n ></lib-preview-list>\n </lib-form-field-container>\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: [".identity-form-container{display:flex;flex-direction:column;height:100%;width:100%;align-items:center;gap:.9375rem}.disabled{opacity:.5;pointer-events:none}::ng-deep .admin-toggle{width:100%;width:35%;display:flex}::ng-deep .admin-toggle .form-field-line{display:none}::ng-deep .admin-toggle .toggle{width:100%}::ng-deep .is-admin-container .form-field-title-container.title-container-2{width:35%!important}.svc-test-result{position:absolute;transition:var(--transition);height:0;width:100%;background-color:var(--background);bottom:0;font-weight:600;padding-left:.625rem;padding-right:.625rem;border-color:var(--inputBorder);border-style:solid;border-width:var(--inputBorderWidth);border-bottom-right-radius:var(--inputBorderRadius);border-bottom-left-radius:var(--inputBorderRadius);border-top-style:none}.svc-test-result.test-result-open{height:-moz-fit-content;height:fit-content;box-shadow:0 -.125rem .6875rem 0 var(--boxShadow);padding-bottom:.9375rem;padding-top:.9375rem}.svc-test-result .close.icon-close{top:.625rem;right:.625rem;font-size:1.125rem;height:1.125rem;width:1.125rem;line-height:1.125rem}::ng-deep .admin-toggle .form-field-toggle-container:focus .form-field-label{color:var(--primaryColor)}::ng-deep .admin-toggle .form-field-toggle-container:focus .form-field-line{border-color:var(--primaryColor)}::ng-deep .admin-toggle .form-field-toggle-container:focus .toggle{border-color:var(--primaryColor);border-style:solid;border-width:var(--inputBorderWidth)}::ng-deep .admin-toggle .form-field-toggle-container:focus .toggle .switch{top:.0625rem}::ng-deep .copy.icon-copy.url-copy{background-color:var(--navigation)}\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.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { 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", "badges", "title", "moreActions", "formView", "saveDisabled", "saveTooltip", "actionButtonText", "moreActionsText", "showHeaderToggle", "showHeaderButton"], 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", "contentClass", "showHeader", "showToggle", "headerActions", "headerToggle"], outputs: ["actionRequested", "headerToggleChange"] }, { kind: "component", type: PreviewListComponent, selector: "lib-preview-list", inputs: ["label", "clickable", "isLoading", "allNames", "items", "allowRemove", "tooltip", "showfilter"], outputs: ["itemSelected", "itemRemoved"] }, { 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", "showLineNumbers"], outputs: ["dataChange", "jsonChange", "jsonInvalidChange"] }, { kind: "component", type: TagSelectorComponent, selector: "lib-tag-selector", inputs: ["placeholder", "disableField", "disableCreate", "hideOption", "isLoading", "errorMessage", "focusOnInit", "selectedRoleAttributes", "selectedNamedAttributes", "hasError", "availableRoleAttributes", "availableNamedAttributes"], outputs: ["addRoleAttribute", "addNamedAttribute", "roleAttributeRemoved", "namedAttributeRemoved", "selectedRoleAttributesChange", "selectedNamedAttributesChange", "filterChange"] }, { kind: "component", type: QrCodeComponent, selector: "lib-qr-code", inputs: ["jwt", "token", "expiration", "identity", "type", "authenticators", "qrOnly", "canExpand"], outputs: ["doRefresh"] }, { kind: "component", type: CustomTagsComponent, selector: "lib-custom-tags", inputs: ["tags"], outputs: ["tagsChange"] }, { kind: "pipe", type: SafePipe, name: "safe" }] }); }
13436
13497
  }
13437
13498
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: IdentityFormComponent, decorators: [{
13438
13499
  type: Component,
@@ -16900,7 +16961,7 @@ class EdgeRouterFormComponent extends ProjectableForm {
16900
16961
  provide: MatDialogRef,
16901
16962
  useValue: {}
16902
16963
  }
16903
- ], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div class=\"projectable-form-wrapper\"\n (keyup.enter)=\"save($event)\"\n (keyup.escape)=\"closeModal(false)\"\n>\n <lib-form-header\n [data]=\"formData\"\n [title]=\"formData.id ? 'Edit Edge Router: ' : 'Create New Edge Router'\"\n [moreActions]=\"moreActions\"\n (actionRequested)=\"headerActionRequested($event)\"\n [(formView)]=\"formView\"\n ></lib-form-header>\n <div class=\"edge-router-form-container projectable-form-container\">\n <div class=\"projectable-form-main-column form-group-row\" *ngIf=\"formView === 'simple'\">\n <div class=\"form-group-column three-fifths\">\n <lib-form-field-container [title]=\"'Edge Router Name'\" [label]=\"'REQUIRED'\">\n <input\n class=\"form-field-input\"\n placeholder=\"Name this edge router\"\n [ngClass]=\"{error: errors['name']}\"\n [(ngModel)]=\"formData.name\"\n autofocus\n #nameFieldInput\n />\n </lib-form-field-container>\n <lib-form-field-container\n [title]=\"'Select or create Edge Router attributes'\"\n [label]=\"'OPTIONAL'\"\n [contentStyle]=\"'z-index: 99999999'\"\n [helpText]=\"'Attributes are tags applied to an resource. Apply the same tag to other Edge Routers to form a group of Edge Routers.'\"\n >\n <lib-tag-selector\n [(selectedRoleAttributes)]=\"formData.roleAttributes\"\n [availableRoleAttributes]=\"edgeRouterRoleAttributes\"\n [placeholder]=\"'Add attributes to group Edge Routers'\"\n ></lib-tag-selector>\n </lib-form-field-container>\n <ng-content select=\"[slot=column-1-slot-1]\"></ng-content>\n <lib-form-field-toggle [(toggleOn)]=\"showMore\" style=\"margin: 0px 10px\"></lib-form-field-toggle>\n <div *ngIf=\"showMore\" class=\"form-group-column\">\n <lib-form-field-container\n [title]=\"'TUNNELER'\"\n [title2]=\"'TRAVERSAL'\"\n [layout]=\"'row'\"\n class=\"form-field-advanced\"\n >\n <div class=\"config-item\">\n <div class=\"config-container toggle-container\">\n <div class=\"config-container-label\">TUNNELER ENABLED</div>\n <div\n (click)=\"toggleTunnelerEnabled()\"\n [ngClass]=\"{ on: formData.isTunnelerEnabled }\"\n class=\"toggle\"\n >\n <span [hidden]=\"!formData.isTunnelerEnabled\" class=\"on-label\">YES</span>\n <span [hidden]=\"formData.isTunnelerEnabled\" class=\"off-label\">NO</span>\n <div class=\"switch\"></div>\n </div>\n </div>\n </div>\n\n <div class=\"config-item\">\n <div class=\"config-container toggle-container\">\n <div class=\"config-container-label\">ALLOW TRAVERSAL</div>\n <div\n (click)=\"toggleNoTraversal()\"\n [ngClass]=\"{ on: !formData.noTraversal }\"\n class=\"toggle\"\n >\n <span [hidden]=\"formData.noTraversal\" class=\"on-label\">YES</span>\n <span [hidden]=\"!formData.noTraversal\" class=\"off-label\">NO</span>\n <div class=\"switch\"></div>\n </div>\n </div>\n </div>\n </lib-form-field-container>\n <lib-form-field-container\n [title]=\"'Custom Tags'\"\n [label]=\"'OPTIONAL'\"\n class=\"form-field-advanced\"\n >\n <lib-custom-tags [(tags)]=\"formData.tags\"></lib-custom-tags>\n </lib-form-field-container>\n <lib-form-field-container\n [title]=\"'App Data'\"\n [label]=\"'OPTIONAL'\"\n class=\"form-field-advanced\"\n >\n <lib-json-view [(data)]=\"formData.appData\"></lib-json-view>\n </lib-form-field-container>\n </div>\n </div>\n <div class=\"form-group-column two-fifths\">\n <ng-content select=\"[slot=column-2-slot-1]\"></ng-content>\n <lib-form-field-container\n *ngIf=\"hasEnrolmentToken && !extService['hideZitiRegistration']\"\n [showHeader]=\"false\"\n >\n <lib-qr-code\n [identity]=\"formData\"\n [jwt]=\"formData.enrollmentJwt\"\n [token]=\"formData.enrollmentToken\"\n [expiration]=\"formData.enrollmentExpiresAt\"\n (doRefresh)=\"refreshEdgeRouter()\"\n [type]=\"'router'\"\n ></lib-qr-code>\n </lib-form-field-container>\n <lib-form-field-container\n *ngIf=\"formData.id\"\n [title]=\"'Associated Services'\"\n [count]=\"svc.associatedServices.length\"\n [class]=\"'hide-overflow'\"\n [helpText]=\"'Preview list of all services that this Edge Router is associated with.'\"\n >\n <lib-preview-list\n [clickable]=\"false\"\n [isLoading]=\"servicesLoading\"\n [allNames]=\"svc.associatedServiceNames\"\n ></lib-preview-list>\n </lib-form-field-container>\n <lib-form-field-container\n *ngIf=\"formData.id\"\n [title]=\"'Associated Identities'\"\n [count]=\"svc.associatedIdentities.length\"\n [helpText]=\"'Preview list of all Identities that this Edge Router is associated with.'\"\n >\n <lib-preview-list\n [clickable]=\"false\"\n [isLoading]=\"identitiesLoading\"\n [allNames]=\"svc.associatedIdentityNames\"\n ></lib-preview-list>\n </lib-form-field-container>\n <lib-form-field-container\n [title]=\"'API Calls'\"\n [label]=\"'OPTIONAL'\"\n >\n <div class=\"form-row\">\n <input class=\"form-field-input\" [value]=\"apiCallURL\"/>\n <div class=\"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>", styles: [".edge-router-form-container{display:flex;flex-direction:column;height:100%;width:100%;align-items:center;gap:.9375rem}.form-field-dropdown{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'Stroke_Color' style%3D'enable-background%3Anew 0 0 20.2 10.8%3B' version%3D'1.1' viewBox%3D'0 0 20.2 10.8' 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 %23668291%3B %7D%3C%2Fstyle%3E %3Cg%3E%09%3Cpath class%3D'st0' d%3D'M19.8%2C1.7c0%2C0.4-0.1%2C0.7-0.4%2C0.9l-8.5%2C7.3c-0.5%2C0.4-1.2%2C0.4-1.6%2C0L0.7%2C2.7C0.2%2C2.2%2C0.2%2C1.5%2C0.6%2C0.9%09%09c0.5-0.5%2C1.2-0.6%2C1.8-0.1l7.7%2C6.6l7.7-6.6c0.5-0.5%2C1.3-0.4%2C1.8%2C0.1C19.7%2C1.2%2C19.8%2C1.5%2C19.8%2C1.7z'%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E\");background-position:center right .625rem;background-repeat:no-repeat;background-size:1.125rem;padding-right:1.75rem}.disabled{opacity:.5;pointer-events:none}::ng-deep .admin-toggle{width:100%;width:35%;display:flex}::ng-deep .admin-toggle .form-field-line{display:none}::ng-deep .admin-toggle .toggle{width:100%}::ng-deep .is-admin-container .form-field-title-container.title-container-2{width:35%!important}.svc-test-result{position:absolute;transition:var(--transition);height:0;width:100%;background-color:var(--background);bottom:0;font-weight:600;padding-left:.625rem;padding-right:.625rem;border-color:var(--inputBorder);border-style:solid;border-width:var(--inputBorderWidth);border-bottom-right-radius:var(--inputBorderRadius);border-bottom-left-radius:var(--inputBorderRadius);border-top-style:none}.svc-test-result.test-result-open{height:-moz-fit-content;height:fit-content;box-shadow:0 -.125rem .6875rem 0 var(--boxShadow);padding-bottom:.9375rem;padding-top:.9375rem}.svc-test-result .close.icon-close{top:.625rem;right:.625rem;font-size:1.125rem;height:1.125rem;width:1.125rem;line-height:1.125rem}::ng-deep .admin-toggle .form-field-toggle-container:focus .form-field-label{color:var(--primaryColor)}::ng-deep .admin-toggle .form-field-toggle-container:focus .form-field-line{border-color:var(--primaryColor)}::ng-deep .admin-toggle .form-field-toggle-container:focus .toggle{border-color:var(--primaryColor);border-style:solid;border-width:var(--inputBorderWidth)}::ng-deep .admin-toggle .form-field-toggle-container:focus .toggle .switch{top:.0625rem}\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: 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: "component", type: FormHeaderComponent, selector: "lib-form-header", inputs: ["data", "badges", "title", "moreActions", "formView", "saveDisabled", "saveTooltip", "actionButtonText", "moreActionsText", "showHeaderToggle", "showHeaderButton"], 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", "contentClass", "showHeader", "showToggle", "headerActions", "headerToggle"], outputs: ["actionRequested", "headerToggleChange"] }, { kind: "component", type: PreviewListComponent, selector: "lib-preview-list", inputs: ["label", "clickable", "isLoading", "allNames", "items", "allowRemove", "tooltip", "showfilter"], outputs: ["itemSelected", "itemRemoved"] }, { 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: TagSelectorComponent, selector: "lib-tag-selector", inputs: ["placeholder", "disableField", "disableCreate", "hideOption", "isLoading", "errorMessage", "focusOnInit", "selectedRoleAttributes", "selectedNamedAttributes", "hasError", "availableRoleAttributes", "availableNamedAttributes"], outputs: ["addRoleAttribute", "addNamedAttribute", "roleAttributeRemoved", "namedAttributeRemoved", "selectedRoleAttributesChange", "selectedNamedAttributesChange", "filterChange"] }, { kind: "component", type: QrCodeComponent, selector: "lib-qr-code", inputs: ["jwt", "token", "expiration", "identity", "type", "authenticators", "qrOnly", "canExpand"], outputs: ["doRefresh"] }, { kind: "component", type: CustomTagsComponent, selector: "lib-custom-tags", inputs: ["tags"], outputs: ["tagsChange"] }] }); }
16964
+ ], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div class=\"projectable-form-wrapper\"\n (keyup.enter)=\"save($event)\"\n (keyup.escape)=\"closeModal(false)\"\n>\n <lib-form-header\n [data]=\"formData\"\n [title]=\"formData.id ? 'Edit Edge Router: ' : 'Create New Edge Router'\"\n [moreActions]=\"moreActions\"\n (actionRequested)=\"headerActionRequested($event)\"\n [(formView)]=\"formView\"\n ></lib-form-header>\n <div class=\"edge-router-form-container projectable-form-container\">\n <div class=\"projectable-form-main-column form-group-row\" *ngIf=\"formView === 'simple'\">\n <div class=\"form-group-column three-fifths\">\n <lib-form-field-container [title]=\"'Edge Router Name'\" [label]=\"'REQUIRED'\">\n <input\n class=\"form-field-input\"\n placeholder=\"Name this edge router\"\n [ngClass]=\"{error: errors['name']}\"\n [(ngModel)]=\"formData.name\"\n autofocus\n #nameFieldInput\n />\n </lib-form-field-container>\n <lib-form-field-container\n [title]=\"'Select or create Edge Router attributes'\"\n [label]=\"'OPTIONAL'\"\n [contentStyle]=\"'z-index: 99999999'\"\n [helpText]=\"'Attributes are tags applied to an resource. Apply the same tag to other Edge Routers to form a group of Edge Routers.'\"\n >\n <lib-tag-selector\n [(selectedRoleAttributes)]=\"formData.roleAttributes\"\n [availableRoleAttributes]=\"edgeRouterRoleAttributes\"\n [placeholder]=\"'Add attributes to group Edge Routers'\"\n ></lib-tag-selector>\n </lib-form-field-container>\n <ng-content select=\"[slot=column-1-slot-1]\"></ng-content>\n <lib-form-field-toggle [(toggleOn)]=\"showMore\" style=\"margin: 0px 10px\"></lib-form-field-toggle>\n <div *ngIf=\"showMore\" class=\"form-group-column\">\n <lib-form-field-container\n [title]=\"'TUNNELER'\"\n [title2]=\"'TRAVERSAL'\"\n [layout]=\"'row'\"\n class=\"form-field-advanced\"\n >\n <div class=\"config-item\">\n <div class=\"config-container toggle-container\">\n <div class=\"config-container-label\">TUNNELER ENABLED</div>\n <div\n (click)=\"toggleTunnelerEnabled()\"\n [ngClass]=\"{ on: formData.isTunnelerEnabled }\"\n class=\"toggle\"\n >\n <span [hidden]=\"!formData.isTunnelerEnabled\" class=\"on-label\">YES</span>\n <span [hidden]=\"formData.isTunnelerEnabled\" class=\"off-label\">NO</span>\n <div class=\"switch\"></div>\n </div>\n </div>\n </div>\n\n <div class=\"config-item\">\n <div class=\"config-container toggle-container\">\n <div class=\"config-container-label\">ALLOW TRAVERSAL</div>\n <div\n (click)=\"toggleNoTraversal()\"\n [ngClass]=\"{ on: !formData.noTraversal }\"\n class=\"toggle\"\n >\n <span [hidden]=\"formData.noTraversal\" class=\"on-label\">YES</span>\n <span [hidden]=\"!formData.noTraversal\" class=\"off-label\">NO</span>\n <div class=\"switch\"></div>\n </div>\n </div>\n </div>\n </lib-form-field-container>\n <lib-form-field-container\n [title]=\"'Custom Tags'\"\n [label]=\"'OPTIONAL'\"\n class=\"form-field-advanced\"\n >\n <lib-custom-tags [(tags)]=\"formData.tags\"></lib-custom-tags>\n </lib-form-field-container>\n <lib-form-field-container\n [title]=\"'App Data'\"\n [label]=\"'OPTIONAL'\"\n class=\"form-field-advanced\"\n >\n <lib-json-view [(data)]=\"formData.appData\"></lib-json-view>\n </lib-form-field-container>\n </div>\n </div>\n <div class=\"form-group-column two-fifths\">\n <ng-content select=\"[slot=column-2-slot-1]\"></ng-content>\n <lib-form-field-container\n *ngIf=\"hasEnrolmentToken && !extService['hideZitiRegistration']\"\n [showHeader]=\"false\"\n >\n <lib-qr-code\n [identity]=\"formData\"\n [jwt]=\"formData.enrollmentJwt\"\n [token]=\"formData.enrollmentToken\"\n [expiration]=\"formData.enrollmentExpiresAt\"\n (doRefresh)=\"refreshEdgeRouter()\"\n [type]=\"'router'\"\n ></lib-qr-code>\n </lib-form-field-container>\n <lib-form-field-container\n *ngIf=\"formData.id\"\n [title]=\"'Associated Services'\"\n [count]=\"svc.associatedServices.length\"\n [class]=\"'hide-overflow'\"\n [helpText]=\"'Preview list of all services that this Edge Router is associated with.'\"\n >\n <lib-preview-list\n [clickable]=\"false\"\n [isLoading]=\"servicesLoading\"\n [allNames]=\"svc.associatedServiceNames\"\n ></lib-preview-list>\n </lib-form-field-container>\n <lib-form-field-container\n *ngIf=\"formData.id\"\n [title]=\"'Associated Identities'\"\n [count]=\"svc.associatedIdentities.length\"\n [helpText]=\"'Preview list of all Identities that this Edge Router is associated with.'\"\n >\n <lib-preview-list\n [clickable]=\"false\"\n [isLoading]=\"identitiesLoading\"\n [allNames]=\"svc.associatedIdentityNames\"\n ></lib-preview-list>\n </lib-form-field-container>\n <lib-form-field-container\n [title]=\"'API Calls'\"\n [label]=\"'OPTIONAL'\"\n >\n <div class=\"form-row\">\n <input class=\"form-field-input\" [value]=\"apiCallURL\"/>\n <div class=\"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>", styles: [".edge-router-form-container{display:flex;flex-direction:column;height:100%;width:100%;align-items:center;gap:.9375rem}.form-field-dropdown{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'Stroke_Color' style%3D'enable-background%3Anew 0 0 20.2 10.8%3B' version%3D'1.1' viewBox%3D'0 0 20.2 10.8' 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 %23668291%3B %7D%3C%2Fstyle%3E %3Cg%3E%09%3Cpath class%3D'st0' d%3D'M19.8%2C1.7c0%2C0.4-0.1%2C0.7-0.4%2C0.9l-8.5%2C7.3c-0.5%2C0.4-1.2%2C0.4-1.6%2C0L0.7%2C2.7C0.2%2C2.2%2C0.2%2C1.5%2C0.6%2C0.9%09%09c0.5-0.5%2C1.2-0.6%2C1.8-0.1l7.7%2C6.6l7.7-6.6c0.5-0.5%2C1.3-0.4%2C1.8%2C0.1C19.7%2C1.2%2C19.8%2C1.5%2C19.8%2C1.7z'%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E\");background-position:center right .625rem;background-repeat:no-repeat;background-size:1.125rem;padding-right:1.75rem}.disabled{opacity:.5;pointer-events:none}::ng-deep .admin-toggle{width:100%;width:35%;display:flex}::ng-deep .admin-toggle .form-field-line{display:none}::ng-deep .admin-toggle .toggle{width:100%}::ng-deep .is-admin-container .form-field-title-container.title-container-2{width:35%!important}.svc-test-result{position:absolute;transition:var(--transition);height:0;width:100%;background-color:var(--background);bottom:0;font-weight:600;padding-left:.625rem;padding-right:.625rem;border-color:var(--inputBorder);border-style:solid;border-width:var(--inputBorderWidth);border-bottom-right-radius:var(--inputBorderRadius);border-bottom-left-radius:var(--inputBorderRadius);border-top-style:none}.svc-test-result.test-result-open{height:-moz-fit-content;height:fit-content;box-shadow:0 -.125rem .6875rem 0 var(--boxShadow);padding-bottom:.9375rem;padding-top:.9375rem}.svc-test-result .close.icon-close{top:.625rem;right:.625rem;font-size:1.125rem;height:1.125rem;width:1.125rem;line-height:1.125rem}::ng-deep .admin-toggle .form-field-toggle-container:focus .form-field-label{color:var(--primaryColor)}::ng-deep .admin-toggle .form-field-toggle-container:focus .form-field-line{border-color:var(--primaryColor)}::ng-deep .admin-toggle .form-field-toggle-container:focus .toggle{border-color:var(--primaryColor);border-style:solid;border-width:var(--inputBorderWidth)}::ng-deep .admin-toggle .form-field-toggle-container:focus .toggle .switch{top:.0625rem}\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: 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: "component", type: FormHeaderComponent, selector: "lib-form-header", inputs: ["data", "badges", "title", "moreActions", "formView", "saveDisabled", "saveTooltip", "actionButtonText", "moreActionsText", "showHeaderToggle", "showHeaderButton"], 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", "contentClass", "showHeader", "showToggle", "headerActions", "headerToggle"], outputs: ["actionRequested", "headerToggleChange"] }, { kind: "component", type: PreviewListComponent, selector: "lib-preview-list", inputs: ["label", "clickable", "isLoading", "allNames", "items", "allowRemove", "tooltip", "showfilter"], outputs: ["itemSelected", "itemRemoved"] }, { 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", "showLineNumbers"], outputs: ["dataChange", "jsonChange", "jsonInvalidChange"] }, { kind: "component", type: TagSelectorComponent, selector: "lib-tag-selector", inputs: ["placeholder", "disableField", "disableCreate", "hideOption", "isLoading", "errorMessage", "focusOnInit", "selectedRoleAttributes", "selectedNamedAttributes", "hasError", "availableRoleAttributes", "availableNamedAttributes"], outputs: ["addRoleAttribute", "addNamedAttribute", "roleAttributeRemoved", "namedAttributeRemoved", "selectedRoleAttributesChange", "selectedNamedAttributesChange", "filterChange"] }, { kind: "component", type: QrCodeComponent, selector: "lib-qr-code", inputs: ["jwt", "token", "expiration", "identity", "type", "authenticators", "qrOnly", "canExpand"], outputs: ["doRefresh"] }, { kind: "component", type: CustomTagsComponent, selector: "lib-custom-tags", inputs: ["tags"], outputs: ["tagsChange"] }] }); }
16904
16965
  }
16905
16966
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: EdgeRouterFormComponent, decorators: [{
16906
16967
  type: Component,
@@ -17209,7 +17270,7 @@ class TransitRouterFormComponent extends ProjectableForm {
17209
17270
  provide: MatDialogRef,
17210
17271
  useValue: {}
17211
17272
  }
17212
- ], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div class=\"projectable-form-wrapper\"\n (keyup.enter)=\"save($event)\"\n (keyup.escape)=\"closeModal(false)\"\n>\n <lib-form-header\n [data]=\"formData\"\n [title]=\"formData.id ? 'Edit Transit Router: ' : 'Create New Transit Router'\"\n [moreActions]=\"moreActions\"\n (actionRequested)=\"headerActionRequested($event)\"\n [(formView)]=\"formView\"\n ></lib-form-header>\n <div class=\"edge-router-form-container projectable-form-container\">\n <div class=\"projectable-form-main-column form-group-row\" *ngIf=\"formView === 'simple'\">\n <div class=\"form-group-column three-fifths\">\n <lib-form-field-container [title]=\"'Edge Router Name'\" [label]=\"'REQUIRED'\">\n <input\n class=\"form-field-input\"\n placeholder=\"Name this edge router\"\n [ngClass]=\"{error: errors['name']}\"\n [(ngModel)]=\"formData.name\"\n autofocus\n #nameFieldInput\n />\n </lib-form-field-container>\n <lib-form-field-container\n [showHeader]=\"false\"\n [layout]=\"'row'\"\n >\n <div class=\"form-field-label-container\">\n <div class=\"form-field-title-container\">\n <span class=\"form-field-title\">Cost</span>\n </div>\n <input\n type=\"number\"\n class=\"form-field-input\"\n placeholder=\"Name this edge router\"\n [ngClass]=\"{error: errors['cost']}\"\n [(ngModel)]=\"formData.cost\"\n />\n </div>\n <div class=\"config-item\">\n <div class=\"config-container toggle-container\">\n <div class=\"config-container-label\">ENABLED</div>\n <div\n (click)=\"toggleDisabled()\"\n [ngClass]=\"{ on: !formData.disabled }\"\n class=\"toggle\"\n >\n <span [hidden]=\"formData.disabled\" class=\"on-label\">YES</span>\n <span [hidden]=\"!formData.disabled\" class=\"off-label\">NO</span>\n <div class=\"switch\"></div>\n </div>\n </div>\n </div>\n <div class=\"config-item\">\n <div class=\"config-container toggle-container\">\n <div class=\"config-container-label\">ALLOW TRAVERSAL</div>\n <div\n (click)=\"toggleNoTraversal()\"\n [ngClass]=\"{ on: !formData.noTraversal }\"\n class=\"toggle\"\n >\n <span [hidden]=\"formData.noTraversal\" class=\"on-label\">YES</span>\n <span [hidden]=\"!formData.noTraversal\" class=\"off-label\">NO</span>\n <div class=\"switch\"></div>\n </div>\n </div>\n </div>\n </lib-form-field-container>\n <ng-content select=\"[slot=column-1-slot-1]\"></ng-content>\n <lib-form-field-toggle [(toggleOn)]=\"showMore\" style=\"margin: 0px 10px\"></lib-form-field-toggle>\n <div *ngIf=\"showMore\" class=\"form-group-column\">\n <lib-form-field-container\n [title]=\"'Custom Tags'\"\n [label]=\"'OPTIONAL'\"\n class=\"form-field-advanced\"\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 <ng-content select=\"[slot=column-2-slot-1]\"></ng-content>\n <lib-form-field-container\n *ngIf=\"hasEnrolmentToken && !extService['hideZitiRegistration']\"\n [showHeader]=\"false\"\n >\n <lib-qr-code\n [identity]=\"formData\"\n [jwt]=\"formData.enrollmentJwt\"\n [token]=\"formData.enrollmentToken\"\n [expiration]=\"formData.enrollmentExpiresAt\"\n (doRefresh)=\"refreshEdgeRouter()\"\n [type]=\"'router'\"\n ></lib-qr-code>\n </lib-form-field-container>\n <lib-form-field-container\n [title]=\"'API Calls'\"\n [label]=\"'OPTIONAL'\"\n >\n <div class=\"form-row\">\n <input class=\"form-field-input\" [value]=\"apiCallURL\"/>\n <div class=\"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>", styles: [".edge-router-form-container{display:flex;flex-direction:column;height:100%;width:100%;align-items:center;gap:.9375rem}.form-field-dropdown{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'Stroke_Color' style%3D'enable-background%3Anew 0 0 20.2 10.8%3B' version%3D'1.1' viewBox%3D'0 0 20.2 10.8' 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 %23668291%3B %7D%3C%2Fstyle%3E %3Cg%3E%09%3Cpath class%3D'st0' d%3D'M19.8%2C1.7c0%2C0.4-0.1%2C0.7-0.4%2C0.9l-8.5%2C7.3c-0.5%2C0.4-1.2%2C0.4-1.6%2C0L0.7%2C2.7C0.2%2C2.2%2C0.2%2C1.5%2C0.6%2C0.9%09%09c0.5-0.5%2C1.2-0.6%2C1.8-0.1l7.7%2C6.6l7.7-6.6c0.5-0.5%2C1.3-0.4%2C1.8%2C0.1C19.7%2C1.2%2C19.8%2C1.5%2C19.8%2C1.7z'%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E\");background-position:center right .625rem;background-repeat:no-repeat;background-size:1.125rem;padding-right:1.75rem}.disabled{opacity:.5;pointer-events:none}.config-item{max-height:var(--defaultInputHeight);margin-top:1.15rem}::ng-deep .admin-toggle{width:100%;width:35%;display:flex}::ng-deep .admin-toggle .form-field-line{display:none}::ng-deep .admin-toggle .toggle{width:100%}::ng-deep .is-admin-container .form-field-title-container.title-container-2{width:35%!important}.svc-test-result{position:absolute;transition:var(--transition);height:0;width:100%;background-color:var(--background);bottom:0;font-weight:600;padding-left:.625rem;padding-right:.625rem;border-color:var(--inputBorder);border-style:solid;border-width:var(--inputBorderWidth);border-bottom-right-radius:var(--inputBorderRadius);border-bottom-left-radius:var(--inputBorderRadius);border-top-style:none}.svc-test-result.test-result-open{height:-moz-fit-content;height:fit-content;box-shadow:0 -.125rem .6875rem 0 var(--boxShadow);padding-bottom:.9375rem;padding-top:.9375rem}.svc-test-result .close.icon-close{top:.625rem;right:.625rem;font-size:1.125rem;height:1.125rem;width:1.125rem;line-height:1.125rem}::ng-deep .admin-toggle .form-field-toggle-container:focus .form-field-label{color:var(--primaryColor)}::ng-deep .admin-toggle .form-field-toggle-container:focus .form-field-line{border-color:var(--primaryColor)}::ng-deep .admin-toggle .form-field-toggle-container:focus .toggle{border-color:var(--primaryColor);border-style:solid;border-width:var(--inputBorderWidth)}::ng-deep .admin-toggle .form-field-toggle-container:focus .toggle .switch{top:.0625rem}\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: 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"] }, { kind: "component", type: FormHeaderComponent, selector: "lib-form-header", inputs: ["data", "badges", "title", "moreActions", "formView", "saveDisabled", "saveTooltip", "actionButtonText", "moreActionsText", "showHeaderToggle", "showHeaderButton"], 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", "contentClass", "showHeader", "showToggle", "headerActions", "headerToggle"], outputs: ["actionRequested", "headerToggleChange"] }, { 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: QrCodeComponent, selector: "lib-qr-code", inputs: ["jwt", "token", "expiration", "identity", "type", "authenticators", "qrOnly", "canExpand"], outputs: ["doRefresh"] }, { kind: "component", type: CustomTagsComponent, selector: "lib-custom-tags", inputs: ["tags"], outputs: ["tagsChange"] }] }); }
17273
+ ], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div class=\"projectable-form-wrapper\"\n (keyup.enter)=\"save($event)\"\n (keyup.escape)=\"closeModal(false)\"\n>\n <lib-form-header\n [data]=\"formData\"\n [title]=\"formData.id ? 'Edit Transit Router: ' : 'Create New Transit Router'\"\n [moreActions]=\"moreActions\"\n (actionRequested)=\"headerActionRequested($event)\"\n [(formView)]=\"formView\"\n ></lib-form-header>\n <div class=\"edge-router-form-container projectable-form-container\">\n <div class=\"projectable-form-main-column form-group-row\" *ngIf=\"formView === 'simple'\">\n <div class=\"form-group-column three-fifths\">\n <lib-form-field-container [title]=\"'Edge Router Name'\" [label]=\"'REQUIRED'\">\n <input\n class=\"form-field-input\"\n placeholder=\"Name this edge router\"\n [ngClass]=\"{error: errors['name']}\"\n [(ngModel)]=\"formData.name\"\n autofocus\n #nameFieldInput\n />\n </lib-form-field-container>\n <lib-form-field-container\n [showHeader]=\"false\"\n [layout]=\"'row'\"\n >\n <div class=\"form-field-label-container\">\n <div class=\"form-field-title-container\">\n <span class=\"form-field-title\">Cost</span>\n </div>\n <input\n type=\"number\"\n class=\"form-field-input\"\n placeholder=\"Name this edge router\"\n [ngClass]=\"{error: errors['cost']}\"\n [(ngModel)]=\"formData.cost\"\n />\n </div>\n <div class=\"config-item\">\n <div class=\"config-container toggle-container\">\n <div class=\"config-container-label\">ENABLED</div>\n <div\n (click)=\"toggleDisabled()\"\n [ngClass]=\"{ on: !formData.disabled }\"\n class=\"toggle\"\n >\n <span [hidden]=\"formData.disabled\" class=\"on-label\">YES</span>\n <span [hidden]=\"!formData.disabled\" class=\"off-label\">NO</span>\n <div class=\"switch\"></div>\n </div>\n </div>\n </div>\n <div class=\"config-item\">\n <div class=\"config-container toggle-container\">\n <div class=\"config-container-label\">ALLOW TRAVERSAL</div>\n <div\n (click)=\"toggleNoTraversal()\"\n [ngClass]=\"{ on: !formData.noTraversal }\"\n class=\"toggle\"\n >\n <span [hidden]=\"formData.noTraversal\" class=\"on-label\">YES</span>\n <span [hidden]=\"!formData.noTraversal\" class=\"off-label\">NO</span>\n <div class=\"switch\"></div>\n </div>\n </div>\n </div>\n </lib-form-field-container>\n <ng-content select=\"[slot=column-1-slot-1]\"></ng-content>\n <lib-form-field-toggle [(toggleOn)]=\"showMore\" style=\"margin: 0px 10px\"></lib-form-field-toggle>\n <div *ngIf=\"showMore\" class=\"form-group-column\">\n <lib-form-field-container\n [title]=\"'Custom Tags'\"\n [label]=\"'OPTIONAL'\"\n class=\"form-field-advanced\"\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 <ng-content select=\"[slot=column-2-slot-1]\"></ng-content>\n <lib-form-field-container\n *ngIf=\"hasEnrolmentToken && !extService['hideZitiRegistration']\"\n [showHeader]=\"false\"\n >\n <lib-qr-code\n [identity]=\"formData\"\n [jwt]=\"formData.enrollmentJwt\"\n [token]=\"formData.enrollmentToken\"\n [expiration]=\"formData.enrollmentExpiresAt\"\n (doRefresh)=\"refreshEdgeRouter()\"\n [type]=\"'router'\"\n ></lib-qr-code>\n </lib-form-field-container>\n <lib-form-field-container\n [title]=\"'API Calls'\"\n [label]=\"'OPTIONAL'\"\n >\n <div class=\"form-row\">\n <input class=\"form-field-input\" [value]=\"apiCallURL\"/>\n <div class=\"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>", styles: [".edge-router-form-container{display:flex;flex-direction:column;height:100%;width:100%;align-items:center;gap:.9375rem}.form-field-dropdown{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'Stroke_Color' style%3D'enable-background%3Anew 0 0 20.2 10.8%3B' version%3D'1.1' viewBox%3D'0 0 20.2 10.8' 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 %23668291%3B %7D%3C%2Fstyle%3E %3Cg%3E%09%3Cpath class%3D'st0' d%3D'M19.8%2C1.7c0%2C0.4-0.1%2C0.7-0.4%2C0.9l-8.5%2C7.3c-0.5%2C0.4-1.2%2C0.4-1.6%2C0L0.7%2C2.7C0.2%2C2.2%2C0.2%2C1.5%2C0.6%2C0.9%09%09c0.5-0.5%2C1.2-0.6%2C1.8-0.1l7.7%2C6.6l7.7-6.6c0.5-0.5%2C1.3-0.4%2C1.8%2C0.1C19.7%2C1.2%2C19.8%2C1.5%2C19.8%2C1.7z'%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E\");background-position:center right .625rem;background-repeat:no-repeat;background-size:1.125rem;padding-right:1.75rem}.disabled{opacity:.5;pointer-events:none}.config-item{max-height:var(--defaultInputHeight);margin-top:1.15rem}::ng-deep .admin-toggle{width:100%;width:35%;display:flex}::ng-deep .admin-toggle .form-field-line{display:none}::ng-deep .admin-toggle .toggle{width:100%}::ng-deep .is-admin-container .form-field-title-container.title-container-2{width:35%!important}.svc-test-result{position:absolute;transition:var(--transition);height:0;width:100%;background-color:var(--background);bottom:0;font-weight:600;padding-left:.625rem;padding-right:.625rem;border-color:var(--inputBorder);border-style:solid;border-width:var(--inputBorderWidth);border-bottom-right-radius:var(--inputBorderRadius);border-bottom-left-radius:var(--inputBorderRadius);border-top-style:none}.svc-test-result.test-result-open{height:-moz-fit-content;height:fit-content;box-shadow:0 -.125rem .6875rem 0 var(--boxShadow);padding-bottom:.9375rem;padding-top:.9375rem}.svc-test-result .close.icon-close{top:.625rem;right:.625rem;font-size:1.125rem;height:1.125rem;width:1.125rem;line-height:1.125rem}::ng-deep .admin-toggle .form-field-toggle-container:focus .form-field-label{color:var(--primaryColor)}::ng-deep .admin-toggle .form-field-toggle-container:focus .form-field-line{border-color:var(--primaryColor)}::ng-deep .admin-toggle .form-field-toggle-container:focus .toggle{border-color:var(--primaryColor);border-style:solid;border-width:var(--inputBorderWidth)}::ng-deep .admin-toggle .form-field-toggle-container:focus .toggle .switch{top:.0625rem}\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: 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"] }, { kind: "component", type: FormHeaderComponent, selector: "lib-form-header", inputs: ["data", "badges", "title", "moreActions", "formView", "saveDisabled", "saveTooltip", "actionButtonText", "moreActionsText", "showHeaderToggle", "showHeaderButton"], 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", "contentClass", "showHeader", "showToggle", "headerActions", "headerToggle"], outputs: ["actionRequested", "headerToggleChange"] }, { 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", "showLineNumbers"], outputs: ["dataChange", "jsonChange", "jsonInvalidChange"] }, { kind: "component", type: QrCodeComponent, selector: "lib-qr-code", inputs: ["jwt", "token", "expiration", "identity", "type", "authenticators", "qrOnly", "canExpand"], outputs: ["doRefresh"] }, { kind: "component", type: CustomTagsComponent, selector: "lib-custom-tags", inputs: ["tags"], outputs: ["tagsChange"] }] }); }
17213
17274
  }
17214
17275
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TransitRouterFormComponent, decorators: [{
17215
17276
  type: Component,
@@ -17534,7 +17595,7 @@ class ConfigEditorComponent {
17534
17595
  return data;
17535
17596
  }
17536
17597
  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 }); }
17537
- 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)\" (clickOutside)=\"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: "directive", type: i2.ClickOutsideDirective, selector: "[clickOutside]", inputs: ["clickOutsideEnabled", "attachOutsideOnClick", "delayClickOutsideInit", "emitOnBlur", "exclude", "excludeBeforeClick", "clickOutsideEvents"], outputs: ["clickOutside"] }, { kind: "component", type: JsonViewComponent, selector: "lib-json-view", inputs: ["data", "schema", "readOnly", "jsonInvalid", "showCopy"], outputs: ["dataChange", "jsonChange", "jsonInvalidChange"] }] }); }
17598
+ 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)\" (clickOutside)=\"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: "directive", type: i2.ClickOutsideDirective, selector: "[clickOutside]", inputs: ["clickOutsideEnabled", "attachOutsideOnClick", "delayClickOutsideInit", "emitOnBlur", "exclude", "excludeBeforeClick", "clickOutsideEvents"], outputs: ["clickOutside"] }, { kind: "component", type: JsonViewComponent, selector: "lib-json-view", inputs: ["data", "schema", "readOnly", "jsonInvalid", "showCopy", "showLineNumbers"], outputs: ["dataChange", "jsonChange", "jsonInvalidChange"] }] }); }
17538
17599
  }
17539
17600
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ConfigEditorComponent, decorators: [{
17540
17601
  type: Component,
@@ -17817,7 +17878,7 @@ class ServiceFormComponent extends ProjectableForm {
17817
17878
  provide: MatDialogRef,
17818
17879
  useValue: {}
17819
17880
  }
17820
- ], viewQueries: [{ propertyName: "configEditor", first: true, predicate: ["configEditor"], descendants: true, read: ConfigEditorComponent }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div class=\"projectable-form-wrapper\"\n (keyup.enter)=\"save($event)\"\n (keyup.escape)=\"returnToListPage()\"\n tabindex=\"0\"\n>\n <lib-form-header\n [data]=\"formData\"\n [title]=\"(formData.id ? 'Edit Service' : 'Create Service')\"\n [moreActions]=\"moreActions\"\n (actionRequested)=\"headerActionRequested($event)\"\n [(formView)]=\"formView\"\n [saveDisabled]=\"svc.saveDisabled || formDataInvalid\"\n [saveTooltip]=\"saveButtonTooltip\"\n ></lib-form-header>\n <div class=\"edge-router-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]=\"'Service Name'\" [label]=\"'Required'\">\n <input\n class=\"form-field-input\"\n placeholder=\"Name this Service\"\n [ngClass]=\"{error: svc.errors['name']}\"\n [(ngModel)]=\"formData.name\"\n autofocus\n #nameFieldInput\n />\n </lib-form-field-container>\n <lib-form-field-container\n [title]=\"'Select or create Service attributes'\"\n [label]=\"'Optional'\"\n [contentStyle]=\"'z-index: 99999999'\"\n [helpText]=\"'Attributes are tags applied to a resource. Apply the same tag to other Services to form a group of Services.'\"\n >\n <lib-tag-selector\n [(selectedRoleAttributes)]=\"formData.roleAttributes\"\n [availableRoleAttributes]=\"serviceRoleAttributes\"\n [placeholder]=\"'Add attributes to group Services'\"\n ></lib-tag-selector>\n </lib-form-field-container>\n <lib-form-field-container\n [title]=\"'Add Configurations'\"\n (actionRequested)=\"attachConfig()\"\n (keyup.enter)=\"captureConfigEnterEvent($event)\"\n [helpText]=\"'Configurations are used to define how to intercept and host a service. Ziti Networks come with built-in configuration types (ie. intercept.v1 and host.v1)'\"\n >\n <div class=\"form-field-input-group\">\n <div class=\"config-title-row\">\n <span class=\"form-field-title\">Select a Config</span>\n </div>\n <select\n [(ngModel)]=\"svc.selectedConfigTypeId\"\n (change)=\"configTypeChanged($event)\"\n id=\"SelectedConfigType\"\n class=\"form-field-dropdown\"\n >\n <option value=\"\">Select configuration type...</option>\n <option\n *ngFor=\"let type of svc.configTypes\"\n [value]=\"type.id\"\n >\n {{ type.name }}\n </option>\n </select>\n <div class=\"dropdown-container\" [ngClass]=\"{'dropdown-loading': svc.configsLoading}\">\n <p-dropdown\n placeholder=\"Select configuration...\"\n optionLabel=\"name\"\n optionValue=\"id\"\n filterBy=\"name\"\n [options]=\"svc.filteredConfigs\"\n [filter]=\"true\"\n [showClear]=\"true\"\n [disabled]=\"!svc.selectedConfigTypeId || svc.selectedConfigTypeId === ''\"\n (onChange)=\"configChanged($event)\"\n [(ngModel)]=\"svc.selectedConfigId\"\n >\n <ng-template pTemplate=\"filter\" let-options=\"options\">\n <div class=\"dropdown-filter-container\">\n <div class=\"p-inputgroup\" (click)=\"$event.stopPropagation()\">\n <span class=\"p-inputgroup-addon\"><i class=\"pi pi-search\"></i></span>\n <input\n type=\"text\"\n pInputText\n placeholder=\"Filter\"\n (keyup)=\"configFilterChangedDebounced($event)\" />\n </div>\n <button pButton\n icon=\"pi pi-times\"\n [ngClass]=\"{'configs-loading': svc.configsLoading}\"\n (click)=\"clearConfigFilter($event)\"\n severity=\"secondary\">\n </button>\n <div class=\"spinner\" *ngIf=\"svc.configsLoading\"></div>\n </div>\n </ng-template>\n </p-dropdown>\n </div>\n <div *ngIf=\"!showConfigData && svc.selectedConfigId && svc.selectedConfigId !== '' && svc.selectedConfigId !== 'preview'\" class=\"button-row-right\" >\n <div class=\"save-button\" (click)=\"svc.attachConfig(svc.selectedConfigId)\">\n {{svc.attachLabel}}\n </div>\n </div>\n <div [hidden]=\"!showConfigData\" class=\"form-field-extended-fields\" [ngClass]=\"{'cfg-preview': svc.selectedConfigId === 'preview'}\">\n <div *ngIf=\"showConfigData\" class=\"config-title-row\" style=\"margin-bottom: 10px;\">\n <span class=\"form-field-title\">Config Name</span>\n <div\n class=\"save-button\"\n (click)=\"attachConfig()\"\n *ngIf=\"svc.selectedConfigId !== 'preview'\"\n >{{svc.attachLabel}}\n </div>\n </div>\n <input\n *ngIf=\"showConfigData\"\n [(ngModel)]=\"svc.newConfigName\"\n class=\"form-field-input\"\n [placeholder]=\"'New Config Name'\"\n [ngClass]=\"{error: svc.configErrors['name']}\"\n style=\"margin-bottom: 20px;\"\n />\n <div class=\"config-title-row\" style=\"margin-bottom: 10px;\">\n <span class=\"form-field-title\">Configuration Data</span>\n <div class=\"form-header-toggle-container\" *ngIf=\"svc.selectedConfigId !== 'preview'\">\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 <lib-config-editor\n [(configData)]=\"svc.configData\"\n [schema]=\"svc.selectedSchema\"\n [showJsonView]=\"svc.configJsonView\"\n [(configErrors)]=\"svc.configErrors\"\n #configEditor\n ></lib-config-editor>\n </div>\n </div>\n </lib-form-field-container>\n <lib-form-field-toggle [(toggleOn)]=\"showMore\" style=\"margin: 0px 10px\"></lib-form-field-toggle>\n <div *ngIf=\"showMore\" class=\"form-group-column\">\n <lib-form-field-container\n [title]=\"'Terminator Strategy'\"\n [title2]=\"'Encryption'\"\n [layout]=\"'row'\"\n [helpText]=\"'Pick a strategy to determine how to rank available terminators for a service'\"\n [helpText2]=\"'Encrypts packets when entering or leaving the network.'\"\n class=\"form-field-advanced\"\n >\n <select\n [(ngModel)]=\"formData.terminatorStrategy\"\n id=\"authPolicyId\"\n class=\"form-field-dropdown\"\n >\n <option value=\"\">Select a Strategy....</option>\n <option\n *ngFor=\"let strat of strategies\"\n [value]=\"strat.id\"\n >\n {{ strat.label }}\n </option>\n </select>\n <div class=\"config-item\">\n <div class=\"config-container toggle-container\">\n <div class=\"config-container-label\">Require Encryption</div>\n <div\n (click)=\"toggleEncryptionRequired()\"\n [ngClass]=\"{ on: formData.encryptionRequired }\"\n class=\"toggle\"\n >\n <span [hidden]=\"!formData.encryptionRequired\" class=\"on-label\">YES</span>\n <span [hidden]=\"formData.encryptionRequired\" class=\"off-label\">NO</span>\n <div class=\"switch\"></div>\n </div>\n </div>\n </div>\n </lib-form-field-container>\n <lib-form-field-container\n [title]=\"'Custom Tags'\"\n [label]=\"'OPTIONAL'\"\n class=\"form-field-advanced\"\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]=\"'Associated Entities'\"\n [label]=\"'Click for detailed view'\"\n [helpText]=\"'List the configs, policies, and terminators that are associated with this service. Click on the entity name to navigate to the entity\\'s detailed view.'\"\n [class]=\"'no-gap'\"\n >\n <div class=\"form-row space-between\" style=\"margin-top: 0;\">\n <div class=\"config-title-row\">\n <span class=\"form-field-title\">Configurations</span>\n </div>\n <span class=\"form-field-count\">{{svc.addedConfigs ? svc.addedConfigs.length : 0}}</span>\n </div>\n <lib-preview-list\n [isLoading]=\"svc.associatedConfigsLoading\"\n [allNames]=\"svc.addedConfigs\"\n [allowRemove]=\"true\"\n [clickable]=\"true\"\n [showfilter]=\"false\"\n [tooltip]=\"'View Config'\"\n (itemRemoved)=\"svc.removeConfig($event)\"\n (itemSelected)=\"svc.previewConfig($event, router)\"\n ></lib-preview-list>\n <div class=\"form-row space-between\">\n <div class=\"config-title-row\">\n <span class=\"form-field-title\">Service Policies</span>\n </div>\n <span class=\"form-field-count\">{{svc.associatedServicePoliciesTotal}}</span>\n </div>\n <lib-preview-list\n [isLoading]=\"svc.associatedServicePoliciesLoading\"\n [clickable]=\"true\"\n (itemSelected)=\"svc.previewPolicy($event, router)\"\n [tooltip]=\"'View Service Policy'\"\n [allNames]=\"svc.associatedServicePolicies\"\n [showfilter]=\"false\"\n ></lib-preview-list>\n <div class=\"form-row space-between\">\n <div class=\"config-title-row\">\n <span class=\"form-field-title\">Terminators</span>\n </div>\n <span class=\"form-field-count\">{{svc.associatedTerminators ? svc.associatedTerminators.length : 0}}</span>\n </div>\n <lib-preview-list\n [isLoading]=\"svc.associatedTerminatorsLoading\"\n [clickable]=\"true\"\n (itemSelected)=\"svc.previewTerminator($event, router)\"\n [tooltip]=\"'View Terminator'\"\n [allNames]=\"svc.associatedTerminators\"\n [showfilter]=\"false\"\n ></lib-preview-list>\n </lib-form-field-container>\n<!-- <lib-form-field-container\n *ngIf=\"formData.id\"\n [title]=\"'Associated Service Policies'\"\n [count]=\"svc.associatedServicePolicies.length\"\n [helpText]=\"'Preview list of all service policies that this service is associated with.'\"\n >\n </lib-form-field-container>-->\n <lib-form-field-container\n [title]=\"'API Calls'\"\n [label]=\"''\"\n [class]=\"'api-call-container'\"\n [helpText]=\"'Preview of the API URL and data model that is used to create/update this service'\"\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)]=\"svc.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\" [(jsonInvalid)]=\"formDataInvalid\"></lib-json-view>\n </div>\n </div>\n</div>\n<lib-loading-indicator *ngIf=\"isLoading\" [isLoading]=\"isLoading\"></lib-loading-indicator>", styles: [".edge-router-form-container{display:flex;flex-direction:column;height:100%;width:100%;align-items:center;gap:.9375rem}.form-field-dropdown{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'Stroke_Color' style%3D'enable-background%3Anew 0 0 20.2 10.8%3B' version%3D'1.1' viewBox%3D'0 0 20.2 10.8' 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 %23668291%3B %7D%3C%2Fstyle%3E %3Cg%3E%09%3Cpath class%3D'st0' d%3D'M19.8%2C1.7c0%2C0.4-0.1%2C0.7-0.4%2C0.9l-8.5%2C7.3c-0.5%2C0.4-1.2%2C0.4-1.6%2C0L0.7%2C2.7C0.2%2C2.2%2C0.2%2C1.5%2C0.6%2C0.9%09%09c0.5-0.5%2C1.2-0.6%2C1.8-0.1l7.7%2C6.6l7.7-6.6c0.5-0.5%2C1.3-0.4%2C1.8%2C0.1C19.7%2C1.2%2C19.8%2C1.5%2C19.8%2C1.7z'%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E\");background-position:center right .625rem;background-repeat:no-repeat;background-size:1.125rem;padding-right:1.75rem}.form-field-extended-fields{position:relative;display:flex;flex-direction:column}.form-field-extended-fields.cfg-preview{opacity:.8;filter:grayscale(.4);pointer-events:none}.form-header-toggle-container{display:flex;flex-direction:row;align-items:center}.form-header-toggle-container .form-header-toggle{display:flex;flex-direction:row;width:1.875rem;height:1.125rem;border-radius:.625rem;border-color:var(--inputBorder);border-style:solid;border-width:var(--inputBorderWidth);margin-left:.3125rem;cursor:pointer;position:relative;margin-right:.3125rem}.form-header-toggle-container .form-header-toggle:hover{filter:brightness(90%)}.form-header-toggle-container .form-header-toggle:active{transform:translateY(.0625rem);filter:brightness(80%)}.form-header-toggle-container .form-header-toggle .form-toggle-switch{display:flex;flex-direction:row;justify-content:flex-start;align-items:center;height:100%;margin-left:.1875rem;position:absolute;transition:.5s;left:0}.form-header-toggle-container .form-header-toggle .form-toggle-switch.toggle-right{left:.625rem}.form-header-toggle-container .form-header-toggle .form-toggle-switch.toggle-right .form-toggle-indicator{border-color:var(--red)}.form-header-toggle-container .form-header-toggle .form-toggle-switch .form-toggle-indicator{height:.625rem;border-color:var(--green);border-style:solid;border-left-width:.0625rem;border-right-width:.0625rem;position:relative;margin-left:.125rem}.form-header-toggle-container .toggle-option-text{font-size:.8125rem;font-weight:600;color:var(--placeholder);cursor:pointer}.form-header-toggle-container .toggle-option-text:hover{filter:brightness(90%)}.form-header-toggle-container .toggle-option-text:hover.toggle-option-selected{filter:unset}.form-header-toggle-container .toggle-option-text.toggle-option-selected{color:var(--tableText);cursor:default}.jsonButton{position:relative;top:0;margin:0;padding:.625rem;height:1.875rem}.disabled{opacity:.5;pointer-events:none}.attach-config{display:flex;align-items:center;justify-content:center;font-weight:600;font-size:.875rem;background:var(--primary);padding:.4375rem;border-radius:var(--inputBorderRadius);color:var(--white);cursor:pointer;box-shadow:0 .1875rem .5625rem 0 var(--primaryColorOpaque);border:none;width:-moz-fit-content;width:fit-content}.attach-config:active{background:#648293;box-shadow:none;transform:translateY(.0625rem)}.attach-config:hover{outline:0;filter:brightness(90%);box-shadow:0 .125rem .1875rem 0 var(--primaryColorOpaque)}::ng-deep .admin-toggle{width:100%;width:35%;display:flex}::ng-deep .admin-toggle .form-field-line{display:none}::ng-deep .admin-toggle .toggle{width:100%}::ng-deep .is-admin-container .form-field-title-container.title-container-2{width:35%!important}.svc-test-result{position:absolute;transition:var(--transition);height:0;width:100%;background-color:var(--background);bottom:0;font-weight:600;padding-left:.625rem;padding-right:.625rem;border-color:var(--inputBorder);border-style:solid;border-width:var(--inputBorderWidth);border-bottom-right-radius:var(--inputBorderRadius);border-bottom-left-radius:var(--inputBorderRadius);border-top-style:none}.svc-test-result.test-result-open{height:-moz-fit-content;height:fit-content;box-shadow:0 -.125rem .6875rem 0 var(--boxShadow);padding-bottom:.9375rem;padding-top:.9375rem}.svc-test-result .close.icon-close{top:.625rem;right:.625rem;font-size:1.125rem;height:1.125rem;width:1.125rem;line-height:1.125rem}.dropdown-container{display:flex;flex-direction:column;position:relative}::ng-deep .admin-toggle .form-field-toggle-container:focus .form-field-label{color:var(--primaryColor)}::ng-deep .admin-toggle .form-field-toggle-container:focus .form-field-line{border-color:var(--primaryColor)}::ng-deep .admin-toggle .form-field-toggle-container:focus .toggle{border-color:var(--primaryColor);border-style:solid;border-width:var(--inputBorderWidth)}::ng-deep .admin-toggle .form-field-toggle-container:focus .toggle .switch{top:.0625rem}::ng-deep .form-field-extended-fields .form-field-extended-fields{padding:0}\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.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i6$1.InputText, selector: "[pInputText]" }, { kind: "directive", type: i9.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "directive", type: i8.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading"] }, { kind: "component", type: i4$2.Dropdown, selector: "p-dropdown", inputs: ["id", "scrollHeight", "filter", "name", "style", "panelStyle", "styleClass", "panelStyleClass", "readonly", "required", "editable", "appendTo", "tabindex", "placeholder", "filterPlaceholder", "filterLocale", "inputId", "dataKey", "filterBy", "filterFields", "autofocus", "resetFilterOnHide", "dropdownIcon", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "autoDisplayFirst", "group", "showClear", "emptyFilterMessage", "emptyMessage", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "ariaLabel", "ariaLabelledBy", "filterMatchMode", "maxlength", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "focusOnHover", "selectOnFocus", "autoOptionFocus", "autofocusFilter", "disabled", "itemSize", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "filterValue", "options"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onShow", "onHide", "onClear", "onLazyLoad"] }, { kind: "component", type: FormHeaderComponent, selector: "lib-form-header", inputs: ["data", "badges", "title", "moreActions", "formView", "saveDisabled", "saveTooltip", "actionButtonText", "moreActionsText", "showHeaderToggle", "showHeaderButton"], 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", "contentClass", "showHeader", "showToggle", "headerActions", "headerToggle"], outputs: ["actionRequested", "headerToggleChange"] }, { kind: "component", type: PreviewListComponent, selector: "lib-preview-list", inputs: ["label", "clickable", "isLoading", "allNames", "items", "allowRemove", "tooltip", "showfilter"], outputs: ["itemSelected", "itemRemoved"] }, { 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: TagSelectorComponent, selector: "lib-tag-selector", inputs: ["placeholder", "disableField", "disableCreate", "hideOption", "isLoading", "errorMessage", "focusOnInit", "selectedRoleAttributes", "selectedNamedAttributes", "hasError", "availableRoleAttributes", "availableNamedAttributes"], outputs: ["addRoleAttribute", "addNamedAttribute", "roleAttributeRemoved", "namedAttributeRemoved", "selectedRoleAttributesChange", "selectedNamedAttributesChange", "filterChange"] }, { 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"] }] }); }
17881
+ ], viewQueries: [{ propertyName: "configEditor", first: true, predicate: ["configEditor"], descendants: true, read: ConfigEditorComponent }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div class=\"projectable-form-wrapper\"\n (keyup.enter)=\"save($event)\"\n (keyup.escape)=\"returnToListPage()\"\n tabindex=\"0\"\n>\n <lib-form-header\n [data]=\"formData\"\n [title]=\"(formData.id ? 'Edit Service' : 'Create Service')\"\n [moreActions]=\"moreActions\"\n (actionRequested)=\"headerActionRequested($event)\"\n [(formView)]=\"formView\"\n [saveDisabled]=\"svc.saveDisabled || formDataInvalid\"\n [saveTooltip]=\"saveButtonTooltip\"\n ></lib-form-header>\n <div class=\"edge-router-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]=\"'Service Name'\" [label]=\"'Required'\">\n <input\n class=\"form-field-input\"\n placeholder=\"Name this Service\"\n [ngClass]=\"{error: svc.errors['name']}\"\n [(ngModel)]=\"formData.name\"\n autofocus\n #nameFieldInput\n />\n </lib-form-field-container>\n <lib-form-field-container\n [title]=\"'Select or create Service attributes'\"\n [label]=\"'Optional'\"\n [contentStyle]=\"'z-index: 99999999'\"\n [helpText]=\"'Attributes are tags applied to a resource. Apply the same tag to other Services to form a group of Services.'\"\n >\n <lib-tag-selector\n [(selectedRoleAttributes)]=\"formData.roleAttributes\"\n [availableRoleAttributes]=\"serviceRoleAttributes\"\n [placeholder]=\"'Add attributes to group Services'\"\n ></lib-tag-selector>\n </lib-form-field-container>\n <lib-form-field-container\n [title]=\"'Add Configurations'\"\n (actionRequested)=\"attachConfig()\"\n (keyup.enter)=\"captureConfigEnterEvent($event)\"\n [helpText]=\"'Configurations are used to define how to intercept and host a service. Ziti Networks come with built-in configuration types (ie. intercept.v1 and host.v1)'\"\n >\n <div class=\"form-field-input-group\">\n <div class=\"config-title-row\">\n <span class=\"form-field-title\">Select a Config</span>\n </div>\n <select\n [(ngModel)]=\"svc.selectedConfigTypeId\"\n (change)=\"configTypeChanged($event)\"\n id=\"SelectedConfigType\"\n class=\"form-field-dropdown\"\n >\n <option value=\"\">Select configuration type...</option>\n <option\n *ngFor=\"let type of svc.configTypes\"\n [value]=\"type.id\"\n >\n {{ type.name }}\n </option>\n </select>\n <div class=\"dropdown-container\" [ngClass]=\"{'dropdown-loading': svc.configsLoading}\">\n <p-dropdown\n placeholder=\"Select configuration...\"\n optionLabel=\"name\"\n optionValue=\"id\"\n filterBy=\"name\"\n [options]=\"svc.filteredConfigs\"\n [filter]=\"true\"\n [showClear]=\"true\"\n [disabled]=\"!svc.selectedConfigTypeId || svc.selectedConfigTypeId === ''\"\n (onChange)=\"configChanged($event)\"\n [(ngModel)]=\"svc.selectedConfigId\"\n >\n <ng-template pTemplate=\"filter\" let-options=\"options\">\n <div class=\"dropdown-filter-container\">\n <div class=\"p-inputgroup\" (click)=\"$event.stopPropagation()\">\n <span class=\"p-inputgroup-addon\"><i class=\"pi pi-search\"></i></span>\n <input\n type=\"text\"\n pInputText\n placeholder=\"Filter\"\n (keyup)=\"configFilterChangedDebounced($event)\" />\n </div>\n <button pButton\n icon=\"pi pi-times\"\n [ngClass]=\"{'configs-loading': svc.configsLoading}\"\n (click)=\"clearConfigFilter($event)\"\n severity=\"secondary\">\n </button>\n <div class=\"spinner\" *ngIf=\"svc.configsLoading\"></div>\n </div>\n </ng-template>\n </p-dropdown>\n </div>\n <div *ngIf=\"!showConfigData && svc.selectedConfigId && svc.selectedConfigId !== '' && svc.selectedConfigId !== 'preview'\" class=\"button-row-right\" >\n <div class=\"save-button\" (click)=\"svc.attachConfig(svc.selectedConfigId)\">\n {{svc.attachLabel}}\n </div>\n </div>\n <div [hidden]=\"!showConfigData\" class=\"form-field-extended-fields\" [ngClass]=\"{'cfg-preview': svc.selectedConfigId === 'preview'}\">\n <div *ngIf=\"showConfigData\" class=\"config-title-row\" style=\"margin-bottom: 10px;\">\n <span class=\"form-field-title\">Config Name</span>\n <div\n class=\"save-button\"\n (click)=\"attachConfig()\"\n *ngIf=\"svc.selectedConfigId !== 'preview'\"\n >{{svc.attachLabel}}\n </div>\n </div>\n <input\n *ngIf=\"showConfigData\"\n [(ngModel)]=\"svc.newConfigName\"\n class=\"form-field-input\"\n [placeholder]=\"'New Config Name'\"\n [ngClass]=\"{error: svc.configErrors['name']}\"\n style=\"margin-bottom: 20px;\"\n />\n <div class=\"config-title-row\" style=\"margin-bottom: 10px;\">\n <span class=\"form-field-title\">Configuration Data</span>\n <div class=\"form-header-toggle-container\" *ngIf=\"svc.selectedConfigId !== 'preview'\">\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 <lib-config-editor\n [(configData)]=\"svc.configData\"\n [schema]=\"svc.selectedSchema\"\n [showJsonView]=\"svc.configJsonView\"\n [(configErrors)]=\"svc.configErrors\"\n #configEditor\n ></lib-config-editor>\n </div>\n </div>\n </lib-form-field-container>\n <lib-form-field-toggle [(toggleOn)]=\"showMore\" style=\"margin: 0px 10px\"></lib-form-field-toggle>\n <div *ngIf=\"showMore\" class=\"form-group-column\">\n <lib-form-field-container\n [title]=\"'Terminator Strategy'\"\n [title2]=\"'Encryption'\"\n [layout]=\"'row'\"\n [helpText]=\"'Pick a strategy to determine how to rank available terminators for a service'\"\n [helpText2]=\"'Encrypts packets when entering or leaving the network.'\"\n class=\"form-field-advanced\"\n >\n <select\n [(ngModel)]=\"formData.terminatorStrategy\"\n id=\"authPolicyId\"\n class=\"form-field-dropdown\"\n >\n <option value=\"\">Select a Strategy....</option>\n <option\n *ngFor=\"let strat of strategies\"\n [value]=\"strat.id\"\n >\n {{ strat.label }}\n </option>\n </select>\n <div class=\"config-item\">\n <div class=\"config-container toggle-container\">\n <div class=\"config-container-label\">Require Encryption</div>\n <div\n (click)=\"toggleEncryptionRequired()\"\n [ngClass]=\"{ on: formData.encryptionRequired }\"\n class=\"toggle\"\n >\n <span [hidden]=\"!formData.encryptionRequired\" class=\"on-label\">YES</span>\n <span [hidden]=\"formData.encryptionRequired\" class=\"off-label\">NO</span>\n <div class=\"switch\"></div>\n </div>\n </div>\n </div>\n </lib-form-field-container>\n <lib-form-field-container\n [title]=\"'Custom Tags'\"\n [label]=\"'OPTIONAL'\"\n class=\"form-field-advanced\"\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]=\"'Associated Entities'\"\n [label]=\"'Click for detailed view'\"\n [helpText]=\"'List the configs, policies, and terminators that are associated with this service. Click on the entity name to navigate to the entity\\'s detailed view.'\"\n [class]=\"'no-gap'\"\n >\n <div class=\"form-row space-between\" style=\"margin-top: 0;\">\n <div class=\"config-title-row\">\n <span class=\"form-field-title\">Configurations</span>\n </div>\n <span class=\"form-field-count\">{{svc.addedConfigs ? svc.addedConfigs.length : 0}}</span>\n </div>\n <lib-preview-list\n [isLoading]=\"svc.associatedConfigsLoading\"\n [allNames]=\"svc.addedConfigs\"\n [allowRemove]=\"true\"\n [clickable]=\"true\"\n [showfilter]=\"false\"\n [tooltip]=\"'View Config'\"\n (itemRemoved)=\"svc.removeConfig($event)\"\n (itemSelected)=\"svc.previewConfig($event, router)\"\n ></lib-preview-list>\n <div class=\"form-row space-between\">\n <div class=\"config-title-row\">\n <span class=\"form-field-title\">Service Policies</span>\n </div>\n <span class=\"form-field-count\">{{svc.associatedServicePoliciesTotal}}</span>\n </div>\n <lib-preview-list\n [isLoading]=\"svc.associatedServicePoliciesLoading\"\n [clickable]=\"true\"\n (itemSelected)=\"svc.previewPolicy($event, router)\"\n [tooltip]=\"'View Service Policy'\"\n [allNames]=\"svc.associatedServicePolicies\"\n [showfilter]=\"false\"\n ></lib-preview-list>\n <div class=\"form-row space-between\">\n <div class=\"config-title-row\">\n <span class=\"form-field-title\">Terminators</span>\n </div>\n <span class=\"form-field-count\">{{svc.associatedTerminators ? svc.associatedTerminators.length : 0}}</span>\n </div>\n <lib-preview-list\n [isLoading]=\"svc.associatedTerminatorsLoading\"\n [clickable]=\"true\"\n (itemSelected)=\"svc.previewTerminator($event, router)\"\n [tooltip]=\"'View Terminator'\"\n [allNames]=\"svc.associatedTerminators\"\n [showfilter]=\"false\"\n ></lib-preview-list>\n </lib-form-field-container>\n<!-- <lib-form-field-container\n *ngIf=\"formData.id\"\n [title]=\"'Associated Service Policies'\"\n [count]=\"svc.associatedServicePolicies.length\"\n [helpText]=\"'Preview list of all service policies that this service is associated with.'\"\n >\n </lib-form-field-container>-->\n <lib-form-field-container\n [title]=\"'API Calls'\"\n [label]=\"''\"\n [class]=\"'api-call-container'\"\n [helpText]=\"'Preview of the API URL and data model that is used to create/update this service'\"\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)]=\"svc.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\" [(jsonInvalid)]=\"formDataInvalid\"></lib-json-view>\n </div>\n </div>\n</div>\n<lib-loading-indicator *ngIf=\"isLoading\" [isLoading]=\"isLoading\"></lib-loading-indicator>", styles: [".edge-router-form-container{display:flex;flex-direction:column;height:100%;width:100%;align-items:center;gap:.9375rem}.form-field-dropdown{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'Stroke_Color' style%3D'enable-background%3Anew 0 0 20.2 10.8%3B' version%3D'1.1' viewBox%3D'0 0 20.2 10.8' 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 %23668291%3B %7D%3C%2Fstyle%3E %3Cg%3E%09%3Cpath class%3D'st0' d%3D'M19.8%2C1.7c0%2C0.4-0.1%2C0.7-0.4%2C0.9l-8.5%2C7.3c-0.5%2C0.4-1.2%2C0.4-1.6%2C0L0.7%2C2.7C0.2%2C2.2%2C0.2%2C1.5%2C0.6%2C0.9%09%09c0.5-0.5%2C1.2-0.6%2C1.8-0.1l7.7%2C6.6l7.7-6.6c0.5-0.5%2C1.3-0.4%2C1.8%2C0.1C19.7%2C1.2%2C19.8%2C1.5%2C19.8%2C1.7z'%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E\");background-position:center right .625rem;background-repeat:no-repeat;background-size:1.125rem;padding-right:1.75rem}.form-field-extended-fields{position:relative;display:flex;flex-direction:column}.form-field-extended-fields.cfg-preview{opacity:.8;filter:grayscale(.4);pointer-events:none}.form-header-toggle-container{display:flex;flex-direction:row;align-items:center}.form-header-toggle-container .form-header-toggle{display:flex;flex-direction:row;width:1.875rem;height:1.125rem;border-radius:.625rem;border-color:var(--inputBorder);border-style:solid;border-width:var(--inputBorderWidth);margin-left:.3125rem;cursor:pointer;position:relative;margin-right:.3125rem}.form-header-toggle-container .form-header-toggle:hover{filter:brightness(90%)}.form-header-toggle-container .form-header-toggle:active{transform:translateY(.0625rem);filter:brightness(80%)}.form-header-toggle-container .form-header-toggle .form-toggle-switch{display:flex;flex-direction:row;justify-content:flex-start;align-items:center;height:100%;margin-left:.1875rem;position:absolute;transition:.5s;left:0}.form-header-toggle-container .form-header-toggle .form-toggle-switch.toggle-right{left:.625rem}.form-header-toggle-container .form-header-toggle .form-toggle-switch.toggle-right .form-toggle-indicator{border-color:var(--red)}.form-header-toggle-container .form-header-toggle .form-toggle-switch .form-toggle-indicator{height:.625rem;border-color:var(--green);border-style:solid;border-left-width:.0625rem;border-right-width:.0625rem;position:relative;margin-left:.125rem}.form-header-toggle-container .toggle-option-text{font-size:.8125rem;font-weight:600;color:var(--placeholder);cursor:pointer}.form-header-toggle-container .toggle-option-text:hover{filter:brightness(90%)}.form-header-toggle-container .toggle-option-text:hover.toggle-option-selected{filter:unset}.form-header-toggle-container .toggle-option-text.toggle-option-selected{color:var(--tableText);cursor:default}.jsonButton{position:relative;top:0;margin:0;padding:.625rem;height:1.875rem}.disabled{opacity:.5;pointer-events:none}.attach-config{display:flex;align-items:center;justify-content:center;font-weight:600;font-size:.875rem;background:var(--primary);padding:.4375rem;border-radius:var(--inputBorderRadius);color:var(--white);cursor:pointer;box-shadow:0 .1875rem .5625rem 0 var(--primaryColorOpaque);border:none;width:-moz-fit-content;width:fit-content}.attach-config:active{background:#648293;box-shadow:none;transform:translateY(.0625rem)}.attach-config:hover{outline:0;filter:brightness(90%);box-shadow:0 .125rem .1875rem 0 var(--primaryColorOpaque)}::ng-deep .admin-toggle{width:100%;width:35%;display:flex}::ng-deep .admin-toggle .form-field-line{display:none}::ng-deep .admin-toggle .toggle{width:100%}::ng-deep .is-admin-container .form-field-title-container.title-container-2{width:35%!important}.svc-test-result{position:absolute;transition:var(--transition);height:0;width:100%;background-color:var(--background);bottom:0;font-weight:600;padding-left:.625rem;padding-right:.625rem;border-color:var(--inputBorder);border-style:solid;border-width:var(--inputBorderWidth);border-bottom-right-radius:var(--inputBorderRadius);border-bottom-left-radius:var(--inputBorderRadius);border-top-style:none}.svc-test-result.test-result-open{height:-moz-fit-content;height:fit-content;box-shadow:0 -.125rem .6875rem 0 var(--boxShadow);padding-bottom:.9375rem;padding-top:.9375rem}.svc-test-result .close.icon-close{top:.625rem;right:.625rem;font-size:1.125rem;height:1.125rem;width:1.125rem;line-height:1.125rem}.dropdown-container{display:flex;flex-direction:column;position:relative}::ng-deep .admin-toggle .form-field-toggle-container:focus .form-field-label{color:var(--primaryColor)}::ng-deep .admin-toggle .form-field-toggle-container:focus .form-field-line{border-color:var(--primaryColor)}::ng-deep .admin-toggle .form-field-toggle-container:focus .toggle{border-color:var(--primaryColor);border-style:solid;border-width:var(--inputBorderWidth)}::ng-deep .admin-toggle .form-field-toggle-container:focus .toggle .switch{top:.0625rem}::ng-deep .form-field-extended-fields .form-field-extended-fields{padding:0}\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.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i6$1.InputText, selector: "[pInputText]" }, { kind: "directive", type: i9.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "directive", type: i8.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading"] }, { kind: "component", type: i4$2.Dropdown, selector: "p-dropdown", inputs: ["id", "scrollHeight", "filter", "name", "style", "panelStyle", "styleClass", "panelStyleClass", "readonly", "required", "editable", "appendTo", "tabindex", "placeholder", "filterPlaceholder", "filterLocale", "inputId", "dataKey", "filterBy", "filterFields", "autofocus", "resetFilterOnHide", "dropdownIcon", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "autoDisplayFirst", "group", "showClear", "emptyFilterMessage", "emptyMessage", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "ariaLabel", "ariaLabelledBy", "filterMatchMode", "maxlength", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "focusOnHover", "selectOnFocus", "autoOptionFocus", "autofocusFilter", "disabled", "itemSize", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "filterValue", "options"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onShow", "onHide", "onClear", "onLazyLoad"] }, { kind: "component", type: FormHeaderComponent, selector: "lib-form-header", inputs: ["data", "badges", "title", "moreActions", "formView", "saveDisabled", "saveTooltip", "actionButtonText", "moreActionsText", "showHeaderToggle", "showHeaderButton"], 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", "contentClass", "showHeader", "showToggle", "headerActions", "headerToggle"], outputs: ["actionRequested", "headerToggleChange"] }, { kind: "component", type: PreviewListComponent, selector: "lib-preview-list", inputs: ["label", "clickable", "isLoading", "allNames", "items", "allowRemove", "tooltip", "showfilter"], outputs: ["itemSelected", "itemRemoved"] }, { 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", "showLineNumbers"], outputs: ["dataChange", "jsonChange", "jsonInvalidChange"] }, { kind: "component", type: TagSelectorComponent, selector: "lib-tag-selector", inputs: ["placeholder", "disableField", "disableCreate", "hideOption", "isLoading", "errorMessage", "focusOnInit", "selectedRoleAttributes", "selectedNamedAttributes", "hasError", "availableRoleAttributes", "availableNamedAttributes"], outputs: ["addRoleAttribute", "addNamedAttribute", "roleAttributeRemoved", "namedAttributeRemoved", "selectedRoleAttributesChange", "selectedNamedAttributesChange", "filterChange"] }, { 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"] }] }); }
17821
17882
  }
17822
17883
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ServiceFormComponent, decorators: [{
17823
17884
  type: Component,
@@ -20057,7 +20118,7 @@ class ServicePolicyFormComponent extends ProjectableForm {
20057
20118
  provide: MatDialogRef,
20058
20119
  useValue: {}
20059
20120
  }
20060
- ], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div class=\"projectable-form-wrapper\"\n (keyup.enter)=\"save($event)\"\n (keyup.escape)=\"closeModal(false)\"\n>\n <lib-form-header\n [data]=\"formData\"\n [title]=\"formData.id ? 'Edit Service Policy: ' : 'Create New Service Policy'\"\n [moreActions]=\"moreActions\"\n (actionRequested)=\"headerActionRequested($event)\"\n [(formView)]=\"formView\"\n ></lib-form-header>\n <div class=\"service-policy-form-container projectable-form-container\">\n <div class=\"projectable-form-main-column form-group-row\" *ngIf=\"formView === 'simple'\">\n <div class=\"form-group-column three-fifths\">\n <lib-form-field-container [title]=\"'Service Policy Name'\" [label]=\"'REQUIRED'\">\n <input\n class=\"form-field-input\"\n placeholder=\"Name this service policy\"\n [ngClass]=\"{error: errors['name']}\"\n [(ngModel)]=\"formData.name\"\n autofocus\n #nameFieldInput\n />\n </lib-form-field-container>\n <lib-form-field-container\n [title]=\"'Select Service Attributes'\"\n [label]=\"'OPTIONAL'\"\n [contentStyle]=\"'z-index: 100003'\"\n [helpText]=\"'Choose which services to associate to this policy by picking from the list of available attributes'\"\n >\n <lib-tag-selector\n [(selectedRoleAttributes)]=\"selectedServiceRoleAttributes\"\n [(selectedNamedAttributes)]=\"selectedServiceNamedAttributes\"\n [availableRoleAttributes]=\"svc.serviceRoleAttributes\"\n [availableNamedAttributes]=\"svc.serviceNamedAttributes\"\n (selectedNamedAttributesChange)=\"svc.getAssociatedServicesByAttribute(selectedServiceRoleAttributes, selectedServiceNamedAttributes)\"\n (selectedRoleAttributesChange)=\"svc.getAssociatedServicesByAttribute(selectedServiceRoleAttributes, selectedServiceNamedAttributes)\"\n [placeholder]=\"'Select service attributes'\"\n ></lib-tag-selector>\n </lib-form-field-container>\n <lib-form-field-container\n [title]=\"'Select Identity Attributes'\"\n [label]=\"'OPTIONAL'\"\n [contentStyle]=\"'z-index: 100002'\"\n [helpText]=\"'Choose which identities to associate to this policy by picking from the list of available attributes'\"\n >\n <lib-tag-selector\n [(selectedRoleAttributes)]=\"selectedIdentityRoleAttributes\"\n [(selectedNamedAttributes)]=\"selectedIdentityNamedAttributes\"\n [availableRoleAttributes]=\"svc.identityRoleAttributes\"\n [availableNamedAttributes]=\"svc.identityNamedAttributes\"\n (selectedNamedAttributesChange)=\"svc.getAssociatedIdentitiesByAttribute(selectedIdentityRoleAttributes, selectedIdentityNamedAttributes)\"\n (selectedRoleAttributesChange)=\"svc.getAssociatedIdentitiesByAttribute(selectedIdentityRoleAttributes, selectedIdentityNamedAttributes)\"\n [placeholder]=\"'Select identity attributes'\"\n ></lib-tag-selector>\n </lib-form-field-container>\n <lib-form-field-container\n [title]=\"'Select Posture Check Attributes'\"\n [label]=\"'OPTIONAL'\"\n [contentStyle]=\"'z-index: 100001'\"\n [helpText]=\"'Choose which posture checks to associate to this policy by picking from the list of available attributes'\"\n >\n <lib-tag-selector\n [(selectedRoleAttributes)]=\"selectedPostureRoleAttributes\"\n [(selectedNamedAttributes)]=\"selectedPostureNamedAttributes\"\n [(selectedRoleAttributes)]=\"svc.postureRoleAttributes\"\n [availableNamedAttributes]=\"svc.postureNamedAttributes\"\n (selectedNamedAttributesChange)=\"svc.getAssociatedPostureChecksByAttribute(selectedPostureRoleAttributes, selectedPostureNamedAttributes)\"\n (selectedRoleAttributesChange)=\"svc.getAssociatedPostureChecksByAttribute(selectedPostureRoleAttributes, selectedPostureNamedAttributes)\"\n [placeholder]=\"'Select posture check attributes'\"\n ></lib-tag-selector>\n </lib-form-field-container>\n <lib-form-field-container\n [title]=\"'Type'\"\n [title2]=\"'Semantic'\"\n [layout]=\"'row'\"\n >\n <select\n [(ngModel)]=\"formData.type\"\n id=\"PolicyType\"\n class=\"form-field-dropdown\"\n >\n <option value=\"Bind\">Bind</option>\n <option value=\"Dial\">Dial</option>\n </select>\n <select\n [(ngModel)]=\"formData.semantic\"\n id=\"PolicySemantic\"\n class=\"form-field-dropdown\"\n >\n <option value=\"AnyOf\">AnyOf</option>\n <option value=\"AllOf\">AllOf</option>\n </select>\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]=\"'Associated Services'\"\n [count]=\"svc.associatedServiceNames.length\"\n [class]=\"'hide-overflow'\"\n [helpText]=\"'Preview list of all services that this Service Policy is associated with.'\"\n >\n <lib-preview-list\n [clickable]=\"false\"\n [isLoading]=\"servicesLoading\"\n [allNames]=\"svc.associatedServiceNames\"\n ></lib-preview-list>\n </lib-form-field-container>\n <lib-form-field-container\n [title]=\"'Associated Identities'\"\n [count]=\"svc.associatedIdentityNames.length\"\n [helpText]=\"'Preview list of all Identities that this Service Policy is associated with.'\"\n >\n <lib-preview-list\n [clickable]=\"false\"\n [isLoading]=\"identitiesLoading\"\n [allNames]=\"svc.associatedIdentityNames\"\n ></lib-preview-list>\n </lib-form-field-container>\n <lib-form-field-container\n [title]=\"'Associated Posture Checks'\"\n [count]=\"svc.associatedPostureCheckNames.length\"\n [helpText]=\"'Preview list of all Posture Checks that this Service Policy is associated with.'\"\n >\n <lib-preview-list\n [clickable]=\"false\"\n [isLoading]=\"postureChecksLoading\"\n [allNames]=\"svc.associatedPostureCheckNames\"\n ></lib-preview-list>\n </lib-form-field-container>\n <lib-form-field-container\n [title]=\"'API Calls'\"\n [headerActions]=\"apiOptions\"\n (actionRequested)=\"apiActionRequested($event)\"\n >\n <div class=\"form-row\">\n <input class=\"form-field-input\" [value]=\"apiCallURL\"/>\n <div class=\"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>", styles: [""], 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: 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.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", "badges", "title", "moreActions", "formView", "saveDisabled", "saveTooltip", "actionButtonText", "moreActionsText", "showHeaderToggle", "showHeaderButton"], 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", "contentClass", "showHeader", "showToggle", "headerActions", "headerToggle"], outputs: ["actionRequested", "headerToggleChange"] }, { kind: "component", type: PreviewListComponent, selector: "lib-preview-list", inputs: ["label", "clickable", "isLoading", "allNames", "items", "allowRemove", "tooltip", "showfilter"], outputs: ["itemSelected", "itemRemoved"] }, { 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: TagSelectorComponent, selector: "lib-tag-selector", inputs: ["placeholder", "disableField", "disableCreate", "hideOption", "isLoading", "errorMessage", "focusOnInit", "selectedRoleAttributes", "selectedNamedAttributes", "hasError", "availableRoleAttributes", "availableNamedAttributes"], outputs: ["addRoleAttribute", "addNamedAttribute", "roleAttributeRemoved", "namedAttributeRemoved", "selectedRoleAttributesChange", "selectedNamedAttributesChange", "filterChange"] }, { kind: "component", type: CustomTagsComponent, selector: "lib-custom-tags", inputs: ["tags"], outputs: ["tagsChange"] }] }); }
20121
+ ], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div class=\"projectable-form-wrapper\"\n (keyup.enter)=\"save($event)\"\n (keyup.escape)=\"closeModal(false)\"\n>\n <lib-form-header\n [data]=\"formData\"\n [title]=\"formData.id ? 'Edit Service Policy: ' : 'Create New Service Policy'\"\n [moreActions]=\"moreActions\"\n (actionRequested)=\"headerActionRequested($event)\"\n [(formView)]=\"formView\"\n ></lib-form-header>\n <div class=\"service-policy-form-container projectable-form-container\">\n <div class=\"projectable-form-main-column form-group-row\" *ngIf=\"formView === 'simple'\">\n <div class=\"form-group-column three-fifths\">\n <lib-form-field-container [title]=\"'Service Policy Name'\" [label]=\"'REQUIRED'\">\n <input\n class=\"form-field-input\"\n placeholder=\"Name this service policy\"\n [ngClass]=\"{error: errors['name']}\"\n [(ngModel)]=\"formData.name\"\n autofocus\n #nameFieldInput\n />\n </lib-form-field-container>\n <lib-form-field-container\n [title]=\"'Select Service Attributes'\"\n [label]=\"'OPTIONAL'\"\n [contentStyle]=\"'z-index: 100003'\"\n [helpText]=\"'Choose which services to associate to this policy by picking from the list of available attributes'\"\n >\n <lib-tag-selector\n [(selectedRoleAttributes)]=\"selectedServiceRoleAttributes\"\n [(selectedNamedAttributes)]=\"selectedServiceNamedAttributes\"\n [availableRoleAttributes]=\"svc.serviceRoleAttributes\"\n [availableNamedAttributes]=\"svc.serviceNamedAttributes\"\n (selectedNamedAttributesChange)=\"svc.getAssociatedServicesByAttribute(selectedServiceRoleAttributes, selectedServiceNamedAttributes)\"\n (selectedRoleAttributesChange)=\"svc.getAssociatedServicesByAttribute(selectedServiceRoleAttributes, selectedServiceNamedAttributes)\"\n [placeholder]=\"'Select service attributes'\"\n ></lib-tag-selector>\n </lib-form-field-container>\n <lib-form-field-container\n [title]=\"'Select Identity Attributes'\"\n [label]=\"'OPTIONAL'\"\n [contentStyle]=\"'z-index: 100002'\"\n [helpText]=\"'Choose which identities to associate to this policy by picking from the list of available attributes'\"\n >\n <lib-tag-selector\n [(selectedRoleAttributes)]=\"selectedIdentityRoleAttributes\"\n [(selectedNamedAttributes)]=\"selectedIdentityNamedAttributes\"\n [availableRoleAttributes]=\"svc.identityRoleAttributes\"\n [availableNamedAttributes]=\"svc.identityNamedAttributes\"\n (selectedNamedAttributesChange)=\"svc.getAssociatedIdentitiesByAttribute(selectedIdentityRoleAttributes, selectedIdentityNamedAttributes)\"\n (selectedRoleAttributesChange)=\"svc.getAssociatedIdentitiesByAttribute(selectedIdentityRoleAttributes, selectedIdentityNamedAttributes)\"\n [placeholder]=\"'Select identity attributes'\"\n ></lib-tag-selector>\n </lib-form-field-container>\n <lib-form-field-container\n [title]=\"'Select Posture Check Attributes'\"\n [label]=\"'OPTIONAL'\"\n [contentStyle]=\"'z-index: 100001'\"\n [helpText]=\"'Choose which posture checks to associate to this policy by picking from the list of available attributes'\"\n >\n <lib-tag-selector\n [(selectedRoleAttributes)]=\"selectedPostureRoleAttributes\"\n [(selectedNamedAttributes)]=\"selectedPostureNamedAttributes\"\n [(selectedRoleAttributes)]=\"svc.postureRoleAttributes\"\n [availableNamedAttributes]=\"svc.postureNamedAttributes\"\n (selectedNamedAttributesChange)=\"svc.getAssociatedPostureChecksByAttribute(selectedPostureRoleAttributes, selectedPostureNamedAttributes)\"\n (selectedRoleAttributesChange)=\"svc.getAssociatedPostureChecksByAttribute(selectedPostureRoleAttributes, selectedPostureNamedAttributes)\"\n [placeholder]=\"'Select posture check attributes'\"\n ></lib-tag-selector>\n </lib-form-field-container>\n <lib-form-field-container\n [title]=\"'Type'\"\n [title2]=\"'Semantic'\"\n [layout]=\"'row'\"\n >\n <select\n [(ngModel)]=\"formData.type\"\n id=\"PolicyType\"\n class=\"form-field-dropdown\"\n >\n <option value=\"Bind\">Bind</option>\n <option value=\"Dial\">Dial</option>\n </select>\n <select\n [(ngModel)]=\"formData.semantic\"\n id=\"PolicySemantic\"\n class=\"form-field-dropdown\"\n >\n <option value=\"AnyOf\">AnyOf</option>\n <option value=\"AllOf\">AllOf</option>\n </select>\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]=\"'Associated Services'\"\n [count]=\"svc.associatedServiceNames.length\"\n [class]=\"'hide-overflow'\"\n [helpText]=\"'Preview list of all services that this Service Policy is associated with.'\"\n >\n <lib-preview-list\n [clickable]=\"false\"\n [isLoading]=\"servicesLoading\"\n [allNames]=\"svc.associatedServiceNames\"\n ></lib-preview-list>\n </lib-form-field-container>\n <lib-form-field-container\n [title]=\"'Associated Identities'\"\n [count]=\"svc.associatedIdentityNames.length\"\n [helpText]=\"'Preview list of all Identities that this Service Policy is associated with.'\"\n >\n <lib-preview-list\n [clickable]=\"false\"\n [isLoading]=\"identitiesLoading\"\n [allNames]=\"svc.associatedIdentityNames\"\n ></lib-preview-list>\n </lib-form-field-container>\n <lib-form-field-container\n [title]=\"'Associated Posture Checks'\"\n [count]=\"svc.associatedPostureCheckNames.length\"\n [helpText]=\"'Preview list of all Posture Checks that this Service Policy is associated with.'\"\n >\n <lib-preview-list\n [clickable]=\"false\"\n [isLoading]=\"postureChecksLoading\"\n [allNames]=\"svc.associatedPostureCheckNames\"\n ></lib-preview-list>\n </lib-form-field-container>\n <lib-form-field-container\n [title]=\"'API Calls'\"\n [headerActions]=\"apiOptions\"\n (actionRequested)=\"apiActionRequested($event)\"\n >\n <div class=\"form-row\">\n <input class=\"form-field-input\" [value]=\"apiCallURL\"/>\n <div class=\"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>", styles: [""], 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: 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.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", "badges", "title", "moreActions", "formView", "saveDisabled", "saveTooltip", "actionButtonText", "moreActionsText", "showHeaderToggle", "showHeaderButton"], 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", "contentClass", "showHeader", "showToggle", "headerActions", "headerToggle"], outputs: ["actionRequested", "headerToggleChange"] }, { kind: "component", type: PreviewListComponent, selector: "lib-preview-list", inputs: ["label", "clickable", "isLoading", "allNames", "items", "allowRemove", "tooltip", "showfilter"], outputs: ["itemSelected", "itemRemoved"] }, { 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", "showLineNumbers"], outputs: ["dataChange", "jsonChange", "jsonInvalidChange"] }, { kind: "component", type: TagSelectorComponent, selector: "lib-tag-selector", inputs: ["placeholder", "disableField", "disableCreate", "hideOption", "isLoading", "errorMessage", "focusOnInit", "selectedRoleAttributes", "selectedNamedAttributes", "hasError", "availableRoleAttributes", "availableNamedAttributes"], outputs: ["addRoleAttribute", "addNamedAttribute", "roleAttributeRemoved", "namedAttributeRemoved", "selectedRoleAttributesChange", "selectedNamedAttributesChange", "filterChange"] }, { kind: "component", type: CustomTagsComponent, selector: "lib-custom-tags", inputs: ["tags"], outputs: ["tagsChange"] }] }); }
20061
20122
  }
20062
20123
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ServicePolicyFormComponent, decorators: [{
20063
20124
  type: Component,
@@ -20482,7 +20543,7 @@ ${this.formData.id ? '--request PATCH \\' : ''}
20482
20543
  provide: MatDialogRef,
20483
20544
  useValue: {}
20484
20545
  }
20485
- ], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div class=\"projectable-form-wrapper\"\n (keyup.enter)=\"save($event)\"\n (keyup.escape)=\"closeModal(false)\"\n>\n <lib-form-header\n [data]=\"formData\"\n [title]=\"formData.id ? 'Edit Edge Router Policy: ' : 'Create New Edge Router Policy'\"\n [moreActions]=\"moreActions\"\n (actionRequested)=\"headerActionRequested($event)\"\n [(formView)]=\"formView\"\n ></lib-form-header>\n <div class=\"edge-router-policy-form-container projectable-form-container\">\n <div class=\"projectable-form-main-column form-group-row\" *ngIf=\"formView === 'simple'\">\n <div class=\"form-group-column three-fifths\">\n <lib-form-field-container [title]=\"'Edge Router Policy Name'\" [label]=\"'REQUIRED'\">\n <input\n class=\"form-field-input\"\n placeholder=\"Name this edge router policy\"\n [ngClass]=\"{error: errors['name']}\"\n [(ngModel)]=\"formData.name\"\n autofocus\n #nameFieldInput\n />\n </lib-form-field-container>\n <lib-form-field-container\n [title]=\"'Select Edge Router Attributes'\"\n [label]=\"'OPTIONAL'\"\n [contentStyle]=\"'z-index: 100003'\"\n [helpText]=\"'Choose which edge router to associate to this policy by picking from the list of available attributes'\"\n >\n <lib-tag-selector\n [(selectedRoleAttributes)]=\"selectedEdgeRouterRoleAttributes\"\n [(selectedNamedAttributes)]=\"selectedEdgeRouterNamedAttributes\"\n [availableRoleAttributes]=\"svc.edgeRouterRoleAttributes\"\n [availableNamedAttributes]=\"svc.edgeRouterNamedAttributes\"\n (selectedNamedAttributesChange)=\"svc.getAssociatedEdgeRoutersByAttribute(selectedEdgeRouterRoleAttributes, selectedEdgeRouterNamedAttributes)\"\n (selectedRoleAttributesChange)=\"svc.getAssociatedEdgeRoutersByAttribute(selectedEdgeRouterRoleAttributes, selectedEdgeRouterNamedAttributes)\"\n [placeholder]=\"'Select edge router attributes'\"\n ></lib-tag-selector>\n </lib-form-field-container>\n <lib-form-field-container\n [title]=\"'Select Identity Attributes'\"\n [label]=\"'OPTIONAL'\"\n [contentStyle]=\"'z-index: 100002'\"\n [helpText]=\"'Choose which identities to associate to this policy by picking from the list of available attributes'\"\n >\n <lib-tag-selector\n [(selectedRoleAttributes)]=\"selectedIdentityRoleAttributes\"\n [(selectedNamedAttributes)]=\"selectedIdentityNamedAttributes\"\n [availableRoleAttributes]=\"svc.identityRoleAttributes\"\n [availableNamedAttributes]=\"svc.identityNamedAttributes\"\n (selectedNamedAttributesChange)=\"svc.getAssociatedIdentitiesByAttribute(selectedIdentityRoleAttributes, selectedIdentityNamedAttributes)\"\n (selectedRoleAttributesChange)=\"svc.getAssociatedIdentitiesByAttribute(selectedIdentityRoleAttributes, selectedIdentityNamedAttributes)\"\n [placeholder]=\"'Select identity attributes'\"\n ></lib-tag-selector>\n </lib-form-field-container>\n <lib-form-field-container\n [title]=\"'Semantic'\"\n [layout]=\"'row'\"\n >\n <select\n [(ngModel)]=\"formData.semantic\"\n id=\"PolicySemantic\"\n class=\"form-field-dropdown\"\n >\n <option value=\"AnyOf\">AnyOf</option>\n <option value=\"AllOf\">AllOf</option>\n </select>\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]=\"'Associated Edge Routers'\"\n [count]=\"svc.associatedEdgeRouterNames.length\"\n [class]=\"'hide-overflow'\"\n [helpText]=\"'Preview list of all Edge Routers that this Edge Router Policy is associated with.'\"\n >\n <lib-preview-list\n [clickable]=\"false\"\n [isLoading]=\"edgeRoutersLoading\"\n [allNames]=\"svc.associatedEdgeRouterNames\"\n ></lib-preview-list>\n </lib-form-field-container>\n <lib-form-field-container\n [title]=\"'Associated Identities'\"\n [count]=\"svc.associatedIdentityNames.length\"\n [helpText]=\"'Preview list of all Identities that this Edge Router Policy is associated with.'\"\n >\n <lib-preview-list\n [clickable]=\"false\"\n [isLoading]=\"identitiesLoading\"\n [allNames]=\"svc.associatedIdentityNames\"\n ></lib-preview-list>\n </lib-form-field-container>\n <lib-form-field-container\n [title]=\"'API Calls'\"\n [headerActions]=\"apiOptions\"\n (actionRequested)=\"apiActionRequested($event)\"\n >\n <div class=\"form-row\">\n <input class=\"form-field-input\" [value]=\"apiCallURL\"/>\n <div class=\"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>", styles: [""], 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: 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.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", "badges", "title", "moreActions", "formView", "saveDisabled", "saveTooltip", "actionButtonText", "moreActionsText", "showHeaderToggle", "showHeaderButton"], 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", "contentClass", "showHeader", "showToggle", "headerActions", "headerToggle"], outputs: ["actionRequested", "headerToggleChange"] }, { kind: "component", type: PreviewListComponent, selector: "lib-preview-list", inputs: ["label", "clickable", "isLoading", "allNames", "items", "allowRemove", "tooltip", "showfilter"], outputs: ["itemSelected", "itemRemoved"] }, { 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: TagSelectorComponent, selector: "lib-tag-selector", inputs: ["placeholder", "disableField", "disableCreate", "hideOption", "isLoading", "errorMessage", "focusOnInit", "selectedRoleAttributes", "selectedNamedAttributes", "hasError", "availableRoleAttributes", "availableNamedAttributes"], outputs: ["addRoleAttribute", "addNamedAttribute", "roleAttributeRemoved", "namedAttributeRemoved", "selectedRoleAttributesChange", "selectedNamedAttributesChange", "filterChange"] }, { kind: "component", type: CustomTagsComponent, selector: "lib-custom-tags", inputs: ["tags"], outputs: ["tagsChange"] }] }); }
20546
+ ], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div class=\"projectable-form-wrapper\"\n (keyup.enter)=\"save($event)\"\n (keyup.escape)=\"closeModal(false)\"\n>\n <lib-form-header\n [data]=\"formData\"\n [title]=\"formData.id ? 'Edit Edge Router Policy: ' : 'Create New Edge Router Policy'\"\n [moreActions]=\"moreActions\"\n (actionRequested)=\"headerActionRequested($event)\"\n [(formView)]=\"formView\"\n ></lib-form-header>\n <div class=\"edge-router-policy-form-container projectable-form-container\">\n <div class=\"projectable-form-main-column form-group-row\" *ngIf=\"formView === 'simple'\">\n <div class=\"form-group-column three-fifths\">\n <lib-form-field-container [title]=\"'Edge Router Policy Name'\" [label]=\"'REQUIRED'\">\n <input\n class=\"form-field-input\"\n placeholder=\"Name this edge router policy\"\n [ngClass]=\"{error: errors['name']}\"\n [(ngModel)]=\"formData.name\"\n autofocus\n #nameFieldInput\n />\n </lib-form-field-container>\n <lib-form-field-container\n [title]=\"'Select Edge Router Attributes'\"\n [label]=\"'OPTIONAL'\"\n [contentStyle]=\"'z-index: 100003'\"\n [helpText]=\"'Choose which edge router to associate to this policy by picking from the list of available attributes'\"\n >\n <lib-tag-selector\n [(selectedRoleAttributes)]=\"selectedEdgeRouterRoleAttributes\"\n [(selectedNamedAttributes)]=\"selectedEdgeRouterNamedAttributes\"\n [availableRoleAttributes]=\"svc.edgeRouterRoleAttributes\"\n [availableNamedAttributes]=\"svc.edgeRouterNamedAttributes\"\n (selectedNamedAttributesChange)=\"svc.getAssociatedEdgeRoutersByAttribute(selectedEdgeRouterRoleAttributes, selectedEdgeRouterNamedAttributes)\"\n (selectedRoleAttributesChange)=\"svc.getAssociatedEdgeRoutersByAttribute(selectedEdgeRouterRoleAttributes, selectedEdgeRouterNamedAttributes)\"\n [placeholder]=\"'Select edge router attributes'\"\n ></lib-tag-selector>\n </lib-form-field-container>\n <lib-form-field-container\n [title]=\"'Select Identity Attributes'\"\n [label]=\"'OPTIONAL'\"\n [contentStyle]=\"'z-index: 100002'\"\n [helpText]=\"'Choose which identities to associate to this policy by picking from the list of available attributes'\"\n >\n <lib-tag-selector\n [(selectedRoleAttributes)]=\"selectedIdentityRoleAttributes\"\n [(selectedNamedAttributes)]=\"selectedIdentityNamedAttributes\"\n [availableRoleAttributes]=\"svc.identityRoleAttributes\"\n [availableNamedAttributes]=\"svc.identityNamedAttributes\"\n (selectedNamedAttributesChange)=\"svc.getAssociatedIdentitiesByAttribute(selectedIdentityRoleAttributes, selectedIdentityNamedAttributes)\"\n (selectedRoleAttributesChange)=\"svc.getAssociatedIdentitiesByAttribute(selectedIdentityRoleAttributes, selectedIdentityNamedAttributes)\"\n [placeholder]=\"'Select identity attributes'\"\n ></lib-tag-selector>\n </lib-form-field-container>\n <lib-form-field-container\n [title]=\"'Semantic'\"\n [layout]=\"'row'\"\n >\n <select\n [(ngModel)]=\"formData.semantic\"\n id=\"PolicySemantic\"\n class=\"form-field-dropdown\"\n >\n <option value=\"AnyOf\">AnyOf</option>\n <option value=\"AllOf\">AllOf</option>\n </select>\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]=\"'Associated Edge Routers'\"\n [count]=\"svc.associatedEdgeRouterNames.length\"\n [class]=\"'hide-overflow'\"\n [helpText]=\"'Preview list of all Edge Routers that this Edge Router Policy is associated with.'\"\n >\n <lib-preview-list\n [clickable]=\"false\"\n [isLoading]=\"edgeRoutersLoading\"\n [allNames]=\"svc.associatedEdgeRouterNames\"\n ></lib-preview-list>\n </lib-form-field-container>\n <lib-form-field-container\n [title]=\"'Associated Identities'\"\n [count]=\"svc.associatedIdentityNames.length\"\n [helpText]=\"'Preview list of all Identities that this Edge Router Policy is associated with.'\"\n >\n <lib-preview-list\n [clickable]=\"false\"\n [isLoading]=\"identitiesLoading\"\n [allNames]=\"svc.associatedIdentityNames\"\n ></lib-preview-list>\n </lib-form-field-container>\n <lib-form-field-container\n [title]=\"'API Calls'\"\n [headerActions]=\"apiOptions\"\n (actionRequested)=\"apiActionRequested($event)\"\n >\n <div class=\"form-row\">\n <input class=\"form-field-input\" [value]=\"apiCallURL\"/>\n <div class=\"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>", styles: [""], 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: 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.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", "badges", "title", "moreActions", "formView", "saveDisabled", "saveTooltip", "actionButtonText", "moreActionsText", "showHeaderToggle", "showHeaderButton"], 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", "contentClass", "showHeader", "showToggle", "headerActions", "headerToggle"], outputs: ["actionRequested", "headerToggleChange"] }, { kind: "component", type: PreviewListComponent, selector: "lib-preview-list", inputs: ["label", "clickable", "isLoading", "allNames", "items", "allowRemove", "tooltip", "showfilter"], outputs: ["itemSelected", "itemRemoved"] }, { 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", "showLineNumbers"], outputs: ["dataChange", "jsonChange", "jsonInvalidChange"] }, { kind: "component", type: TagSelectorComponent, selector: "lib-tag-selector", inputs: ["placeholder", "disableField", "disableCreate", "hideOption", "isLoading", "errorMessage", "focusOnInit", "selectedRoleAttributes", "selectedNamedAttributes", "hasError", "availableRoleAttributes", "availableNamedAttributes"], outputs: ["addRoleAttribute", "addNamedAttribute", "roleAttributeRemoved", "namedAttributeRemoved", "selectedRoleAttributesChange", "selectedNamedAttributesChange", "filterChange"] }, { kind: "component", type: CustomTagsComponent, selector: "lib-custom-tags", inputs: ["tags"], outputs: ["tagsChange"] }] }); }
20486
20547
  }
20487
20548
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: EdgeRouterPolicyFormComponent, decorators: [{
20488
20549
  type: Component,
@@ -21362,7 +21423,7 @@ ${this.formData.id ? '--request PATCH \\' : ''}
21362
21423
  provide: MatDialogRef,
21363
21424
  useValue: {}
21364
21425
  }
21365
- ], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div class=\"projectable-form-wrapper\"\n (keyup.enter)=\"save($event)\"\n (keyup.escape)=\"closeModal(false)\"\n>\n <lib-form-header\n [data]=\"formData\"\n [title]=\"formData.id ? 'Edit Service Edge Router Policy: ' : 'Create New Service Edge Router Policy'\"\n [moreActions]=\"moreActions\"\n (actionRequested)=\"headerActionRequested($event)\"\n [(formView)]=\"formView\"\n ></lib-form-header>\n <div class=\"service-edge-router-policy-form-container projectable-form-container\">\n <div class=\"projectable-form-main-column form-group-row\" *ngIf=\"formView === 'simple'\">\n <div class=\"form-group-column three-fifths\">\n <lib-form-field-container [title]=\"'Service Edge Router Policy Name'\" [label]=\"'REQUIRED'\">\n <input\n class=\"form-field-input\"\n placeholder=\"Name this service edge router policy\"\n [ngClass]=\"{error: errors['name']}\"\n [(ngModel)]=\"formData.name\"\n autofocus\n #nameFieldInput\n />\n </lib-form-field-container>\n <lib-form-field-container\n [title]=\"'Select Edge Router Attributes'\"\n [label]=\"'OPTIONAL'\"\n [contentStyle]=\"'z-index: 100003'\"\n [helpText]=\"'Choose which edge router to associate to this policy by picking from the list of available attributes'\"\n >\n <lib-tag-selector\n [(selectedRoleAttributes)]=\"selectedEdgeRouterRoleAttributes\"\n [(selectedNamedAttributes)]=\"selectedEdgeRouterNamedAttributes\"\n [availableRoleAttributes]=\"svc.edgeRouterRoleAttributes\"\n [availableNamedAttributes]=\"svc.edgeRouterNamedAttributes\"\n (selectedNamedAttributesChange)=\"svc.getAssociatedEdgeRoutersByAttribute(selectedEdgeRouterRoleAttributes, selectedEdgeRouterNamedAttributes)\"\n (selectedRoleAttributesChange)=\"svc.getAssociatedEdgeRoutersByAttribute(selectedEdgeRouterRoleAttributes, selectedEdgeRouterNamedAttributes)\"\n [placeholder]=\"'Select edge router attributes'\"\n ></lib-tag-selector>\n </lib-form-field-container>\n <lib-form-field-container\n [title]=\"'Select Service Attributes'\"\n [label]=\"'OPTIONAL'\"\n [contentStyle]=\"'z-index: 100002'\"\n [helpText]=\"'Choose which services to associate to this policy by picking from the list of available attributes'\"\n >\n <lib-tag-selector\n [(selectedRoleAttributes)]=\"selectedServiceRoleAttributes\"\n [(selectedNamedAttributes)]=\"selectedServiceNamedAttributes\"\n [availableRoleAttributes]=\"svc.serviceRoleAttributes\"\n [availableNamedAttributes]=\"svc.serviceNamedAttributes\"\n (selectedNamedAttributesChange)=\"svc.getAssociatedServicesByAttribute(selectedServiceRoleAttributes, selectedServiceNamedAttributes)\"\n (selectedRoleAttributesChange)=\"svc.getAssociatedServicesByAttribute(selectedServiceRoleAttributes, selectedServiceNamedAttributes)\"\n [placeholder]=\"'Select service attributes'\"\n ></lib-tag-selector>\n </lib-form-field-container>\n <lib-form-field-container\n [title]=\"'Semantic'\"\n [layout]=\"'row'\"\n >\n <select\n [(ngModel)]=\"formData.semantic\"\n id=\"PolicySemantic\"\n class=\"form-field-dropdown\"\n >\n <option value=\"AnyOf\">AnyOf</option>\n <option value=\"AllOf\">AllOf</option>\n </select>\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]=\"'Associated Edge Routers'\"\n [count]=\"svc.associatedEdgeRouterNames.length\"\n [class]=\"'hide-overflow'\"\n [helpText]=\"'Preview list of all Edge Routers that this Service Edge Router Policy is associated with.'\"\n >\n <lib-preview-list\n [clickable]=\"false\"\n [isLoading]=\"edgeRoutersLoading\"\n [allNames]=\"svc.associatedEdgeRouterNames\"\n ></lib-preview-list>\n </lib-form-field-container>\n <lib-form-field-container\n [title]=\"'Associated Services'\"\n [count]=\"svc.associatedServiceNames.length\"\n [helpText]=\"'Preview list of all Services that this Service Edge Router Policy is associated with.'\"\n >\n <lib-preview-list\n [clickable]=\"false\"\n [isLoading]=\"servicesLoading\"\n [allNames]=\"svc.associatedServiceNames\"\n ></lib-preview-list>\n </lib-form-field-container>\n <lib-form-field-container\n [title]=\"'API Calls'\"\n [headerActions]=\"apiOptions\"\n (actionRequested)=\"apiActionRequested($event)\"\n >\n <div class=\"form-row\">\n <input class=\"form-field-input\" [value]=\"apiCallURL\"/>\n <div class=\"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>", styles: [""], 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: 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.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", "badges", "title", "moreActions", "formView", "saveDisabled", "saveTooltip", "actionButtonText", "moreActionsText", "showHeaderToggle", "showHeaderButton"], 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", "contentClass", "showHeader", "showToggle", "headerActions", "headerToggle"], outputs: ["actionRequested", "headerToggleChange"] }, { kind: "component", type: PreviewListComponent, selector: "lib-preview-list", inputs: ["label", "clickable", "isLoading", "allNames", "items", "allowRemove", "tooltip", "showfilter"], outputs: ["itemSelected", "itemRemoved"] }, { 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: TagSelectorComponent, selector: "lib-tag-selector", inputs: ["placeholder", "disableField", "disableCreate", "hideOption", "isLoading", "errorMessage", "focusOnInit", "selectedRoleAttributes", "selectedNamedAttributes", "hasError", "availableRoleAttributes", "availableNamedAttributes"], outputs: ["addRoleAttribute", "addNamedAttribute", "roleAttributeRemoved", "namedAttributeRemoved", "selectedRoleAttributesChange", "selectedNamedAttributesChange", "filterChange"] }, { kind: "component", type: CustomTagsComponent, selector: "lib-custom-tags", inputs: ["tags"], outputs: ["tagsChange"] }] }); }
21426
+ ], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div class=\"projectable-form-wrapper\"\n (keyup.enter)=\"save($event)\"\n (keyup.escape)=\"closeModal(false)\"\n>\n <lib-form-header\n [data]=\"formData\"\n [title]=\"formData.id ? 'Edit Service Edge Router Policy: ' : 'Create New Service Edge Router Policy'\"\n [moreActions]=\"moreActions\"\n (actionRequested)=\"headerActionRequested($event)\"\n [(formView)]=\"formView\"\n ></lib-form-header>\n <div class=\"service-edge-router-policy-form-container projectable-form-container\">\n <div class=\"projectable-form-main-column form-group-row\" *ngIf=\"formView === 'simple'\">\n <div class=\"form-group-column three-fifths\">\n <lib-form-field-container [title]=\"'Service Edge Router Policy Name'\" [label]=\"'REQUIRED'\">\n <input\n class=\"form-field-input\"\n placeholder=\"Name this service edge router policy\"\n [ngClass]=\"{error: errors['name']}\"\n [(ngModel)]=\"formData.name\"\n autofocus\n #nameFieldInput\n />\n </lib-form-field-container>\n <lib-form-field-container\n [title]=\"'Select Edge Router Attributes'\"\n [label]=\"'OPTIONAL'\"\n [contentStyle]=\"'z-index: 100003'\"\n [helpText]=\"'Choose which edge router to associate to this policy by picking from the list of available attributes'\"\n >\n <lib-tag-selector\n [(selectedRoleAttributes)]=\"selectedEdgeRouterRoleAttributes\"\n [(selectedNamedAttributes)]=\"selectedEdgeRouterNamedAttributes\"\n [availableRoleAttributes]=\"svc.edgeRouterRoleAttributes\"\n [availableNamedAttributes]=\"svc.edgeRouterNamedAttributes\"\n (selectedNamedAttributesChange)=\"svc.getAssociatedEdgeRoutersByAttribute(selectedEdgeRouterRoleAttributes, selectedEdgeRouterNamedAttributes)\"\n (selectedRoleAttributesChange)=\"svc.getAssociatedEdgeRoutersByAttribute(selectedEdgeRouterRoleAttributes, selectedEdgeRouterNamedAttributes)\"\n [placeholder]=\"'Select edge router attributes'\"\n ></lib-tag-selector>\n </lib-form-field-container>\n <lib-form-field-container\n [title]=\"'Select Service Attributes'\"\n [label]=\"'OPTIONAL'\"\n [contentStyle]=\"'z-index: 100002'\"\n [helpText]=\"'Choose which services to associate to this policy by picking from the list of available attributes'\"\n >\n <lib-tag-selector\n [(selectedRoleAttributes)]=\"selectedServiceRoleAttributes\"\n [(selectedNamedAttributes)]=\"selectedServiceNamedAttributes\"\n [availableRoleAttributes]=\"svc.serviceRoleAttributes\"\n [availableNamedAttributes]=\"svc.serviceNamedAttributes\"\n (selectedNamedAttributesChange)=\"svc.getAssociatedServicesByAttribute(selectedServiceRoleAttributes, selectedServiceNamedAttributes)\"\n (selectedRoleAttributesChange)=\"svc.getAssociatedServicesByAttribute(selectedServiceRoleAttributes, selectedServiceNamedAttributes)\"\n [placeholder]=\"'Select service attributes'\"\n ></lib-tag-selector>\n </lib-form-field-container>\n <lib-form-field-container\n [title]=\"'Semantic'\"\n [layout]=\"'row'\"\n >\n <select\n [(ngModel)]=\"formData.semantic\"\n id=\"PolicySemantic\"\n class=\"form-field-dropdown\"\n >\n <option value=\"AnyOf\">AnyOf</option>\n <option value=\"AllOf\">AllOf</option>\n </select>\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]=\"'Associated Edge Routers'\"\n [count]=\"svc.associatedEdgeRouterNames.length\"\n [class]=\"'hide-overflow'\"\n [helpText]=\"'Preview list of all Edge Routers that this Service Edge Router Policy is associated with.'\"\n >\n <lib-preview-list\n [clickable]=\"false\"\n [isLoading]=\"edgeRoutersLoading\"\n [allNames]=\"svc.associatedEdgeRouterNames\"\n ></lib-preview-list>\n </lib-form-field-container>\n <lib-form-field-container\n [title]=\"'Associated Services'\"\n [count]=\"svc.associatedServiceNames.length\"\n [helpText]=\"'Preview list of all Services that this Service Edge Router Policy is associated with.'\"\n >\n <lib-preview-list\n [clickable]=\"false\"\n [isLoading]=\"servicesLoading\"\n [allNames]=\"svc.associatedServiceNames\"\n ></lib-preview-list>\n </lib-form-field-container>\n <lib-form-field-container\n [title]=\"'API Calls'\"\n [headerActions]=\"apiOptions\"\n (actionRequested)=\"apiActionRequested($event)\"\n >\n <div class=\"form-row\">\n <input class=\"form-field-input\" [value]=\"apiCallURL\"/>\n <div class=\"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>", styles: [""], 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: 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.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", "badges", "title", "moreActions", "formView", "saveDisabled", "saveTooltip", "actionButtonText", "moreActionsText", "showHeaderToggle", "showHeaderButton"], 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", "contentClass", "showHeader", "showToggle", "headerActions", "headerToggle"], outputs: ["actionRequested", "headerToggleChange"] }, { kind: "component", type: PreviewListComponent, selector: "lib-preview-list", inputs: ["label", "clickable", "isLoading", "allNames", "items", "allowRemove", "tooltip", "showfilter"], outputs: ["itemSelected", "itemRemoved"] }, { 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", "showLineNumbers"], outputs: ["dataChange", "jsonChange", "jsonInvalidChange"] }, { kind: "component", type: TagSelectorComponent, selector: "lib-tag-selector", inputs: ["placeholder", "disableField", "disableCreate", "hideOption", "isLoading", "errorMessage", "focusOnInit", "selectedRoleAttributes", "selectedNamedAttributes", "hasError", "availableRoleAttributes", "availableNamedAttributes"], outputs: ["addRoleAttribute", "addNamedAttribute", "roleAttributeRemoved", "namedAttributeRemoved", "selectedRoleAttributesChange", "selectedNamedAttributesChange", "filterChange"] }, { kind: "component", type: CustomTagsComponent, selector: "lib-custom-tags", inputs: ["tags"], outputs: ["tagsChange"] }] }); }
21366
21427
  }
21367
21428
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ServiceEdgeRouterPolicyFormComponent, decorators: [{
21368
21429
  type: Component,
@@ -21459,7 +21520,27 @@ class TerminatorsPageService extends ListPageServiceClass {
21459
21520
  {
21460
21521
  colId: 'router.name',
21461
21522
  field: 'router.name',
21462
- headerName: 'Router',
21523
+ headerName: 'Router Name',
21524
+ headerComponent: TableColumnDefaultComponent,
21525
+ headerComponentParams: this.headerComponentParams,
21526
+ cellRenderer: TableCellNameComponent,
21527
+ cellRendererParams: { pathRoot: this.basePath },
21528
+ onCellClicked: (data) => {
21529
+ if (this.hasSelectedText()) {
21530
+ return;
21531
+ }
21532
+ this.openEditForm(data?.data?.id);
21533
+ },
21534
+ resizable: true,
21535
+ cellClass: 'nf-cell-vert-align tCol',
21536
+ sortable: false,
21537
+ filter: true,
21538
+ sortColumn: this.sort.bind(this)
21539
+ },
21540
+ {
21541
+ colId: 'router',
21542
+ field: 'router.id',
21543
+ headerName: 'Router ID',
21463
21544
  headerComponent: TableColumnDefaultComponent,
21464
21545
  headerComponentParams: this.headerComponentParams,
21465
21546
  cellRenderer: TableCellNameComponent,
@@ -21479,7 +21560,27 @@ class TerminatorsPageService extends ListPageServiceClass {
21479
21560
  {
21480
21561
  colId: 'service.name',
21481
21562
  field: 'service.name',
21482
- headerName: 'Service',
21563
+ headerName: 'Service Name',
21564
+ headerComponent: TableColumnDefaultComponent,
21565
+ headerComponentParams: this.headerComponentParams,
21566
+ cellRenderer: TableCellNameComponent,
21567
+ cellRendererParams: { pathRoot: this.basePath },
21568
+ onCellClicked: (data) => {
21569
+ if (this.hasSelectedText()) {
21570
+ return;
21571
+ }
21572
+ this.openEditForm(data?.data?.id);
21573
+ },
21574
+ resizable: true,
21575
+ cellClass: 'nf-cell-vert-align tCol',
21576
+ sortable: false,
21577
+ filter: true,
21578
+ sortColumn: this.sort.bind(this)
21579
+ },
21580
+ {
21581
+ colId: 'service',
21582
+ field: 'service.id',
21583
+ headerName: 'Service ID',
21483
21584
  headerComponent: TableColumnDefaultComponent,
21484
21585
  headerComponentParams: this.headerComponentParams,
21485
21586
  cellRenderer: TableCellNameComponent,
@@ -21645,11 +21746,11 @@ class TerminatorsPageComponent extends ListPageComponent {
21645
21746
  this.formDataChanged = event;
21646
21747
  }
21647
21748
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TerminatorsPageComponent, deps: [{ token: TerminatorsPageService }, { token: DataTableFilterService }, { token: TabNameService }, { token: ConsoleEventsService }, { token: i5$1.MatDialog }], target: i0.ɵɵFactoryTarget.Component }); }
21648
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: TerminatorsPageComponent, selector: "lib-configurations", usesInheritance: true, ngImport: i0, template: "<div class=\"ziti-page-container ziti-terminators-container\">\n <lib-list-page-header [title]=\"title\"\n [tabs]=\"tabs\"\n [hideAction]=\"true\"\n (actionClicked)=\"headerActionClicked($event)\"></lib-list-page-header>\n <lib-data-table [tableId]=\"'terminators'\"\n [rowData]=\"rowData\"\n [columnDefinitions]=\"columnDefs\"\n (actionRequested)=\"tableAction($event)\"\n [startCount]=\"startCount\"\n [endCount]=\"endCount\"\n [totalCount]=\"totalCount\"\n [emptyMsg]=\"'No terminators defined, Click the plus to add a terminator.'\"\n [filterApplied]=\"filterApplied\"\n [filterName]=\"'Address'\"\n [filterColumn]=\"'address'\"\n [menuItems]=\"svc.menuItems\"\n (gridReady)=\"gridReady($event)\"\n [options]=\"{noSelect: true, noMenu: true}\"\n >\n </lib-data-table>\n</div>\n", styles: [""], dependencies: [{ kind: "component", type: ListPageHeaderComponent, selector: "lib-list-page-header", inputs: ["title", "tabs", "showAdd", "hideAction"], outputs: ["actionClicked"] }, { kind: "component", type: DataTableComponent, selector: "lib-data-table", inputs: ["rowData", "expandRowData", "collapseRowData", "rowValidation", "isTimeSearchAvailable", "isLoading", "tableId", "options", "validateService", "rowsToggled", "tableRefreshCount", "view", "serverSideDataSource", "allowDownload", "startCount", "endCount", "totalCount", "emptyMsg", "filterApplied", "menuItems", "headerActions", "noItemsClass", "entityTypeName", "showNoItemsAdd", "currentPage", "noItemsImage", "rowHeight", "filterName", "filterColumn", "columnDefinitions", "refreshCount"], outputs: ["actionRequested", "gridReady", "dragStart", "dragLeave", "pageChanged"] }] }); }
21749
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: TerminatorsPageComponent, selector: "lib-configurations", usesInheritance: true, ngImport: i0, template: "<div class=\"ziti-page-container ziti-terminators-container\">\n <lib-list-page-header [title]=\"title\"\n [tabs]=\"tabs\"\n [hideAction]=\"true\"\n (actionClicked)=\"headerActionClicked($event)\"></lib-list-page-header>\n <lib-data-table [tableId]=\"'terminators'\"\n [rowData]=\"rowData\"\n [columnDefinitions]=\"columnDefs\"\n (actionRequested)=\"tableAction($event)\"\n [startCount]=\"startCount\"\n [endCount]=\"endCount\"\n [totalCount]=\"totalCount\"\n [emptyMsg]=\"'No terminators defined, Click the plus to add a terminator.'\"\n [filterApplied]=\"filterApplied\"\n [filterName]=\"'Address'\"\n [filterColumn]=\"'address'\"\n [menuItems]=\"svc.menuItems\"\n (gridReady)=\"gridReady($event)\"\n [options]=\"{noSelect: true, noMenu: false}\"\n >\n </lib-data-table>\n</div>\n", styles: [""], dependencies: [{ kind: "component", type: ListPageHeaderComponent, selector: "lib-list-page-header", inputs: ["title", "tabs", "showAdd", "hideAction"], outputs: ["actionClicked"] }, { kind: "component", type: DataTableComponent, selector: "lib-data-table", inputs: ["rowData", "expandRowData", "collapseRowData", "rowValidation", "isTimeSearchAvailable", "isLoading", "tableId", "options", "validateService", "rowsToggled", "tableRefreshCount", "view", "serverSideDataSource", "allowDownload", "startCount", "endCount", "totalCount", "emptyMsg", "filterApplied", "menuItems", "headerActions", "noItemsClass", "entityTypeName", "showNoItemsAdd", "currentPage", "noItemsImage", "rowHeight", "filterName", "filterColumn", "columnDefinitions", "refreshCount"], outputs: ["actionRequested", "gridReady", "dragStart", "dragLeave", "pageChanged"] }] }); }
21649
21750
  }
21650
21751
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TerminatorsPageComponent, decorators: [{
21651
21752
  type: Component,
21652
- args: [{ selector: 'lib-configurations', template: "<div class=\"ziti-page-container ziti-terminators-container\">\n <lib-list-page-header [title]=\"title\"\n [tabs]=\"tabs\"\n [hideAction]=\"true\"\n (actionClicked)=\"headerActionClicked($event)\"></lib-list-page-header>\n <lib-data-table [tableId]=\"'terminators'\"\n [rowData]=\"rowData\"\n [columnDefinitions]=\"columnDefs\"\n (actionRequested)=\"tableAction($event)\"\n [startCount]=\"startCount\"\n [endCount]=\"endCount\"\n [totalCount]=\"totalCount\"\n [emptyMsg]=\"'No terminators defined, Click the plus to add a terminator.'\"\n [filterApplied]=\"filterApplied\"\n [filterName]=\"'Address'\"\n [filterColumn]=\"'address'\"\n [menuItems]=\"svc.menuItems\"\n (gridReady)=\"gridReady($event)\"\n [options]=\"{noSelect: true, noMenu: true}\"\n >\n </lib-data-table>\n</div>\n" }]
21753
+ args: [{ selector: 'lib-configurations', template: "<div class=\"ziti-page-container ziti-terminators-container\">\n <lib-list-page-header [title]=\"title\"\n [tabs]=\"tabs\"\n [hideAction]=\"true\"\n (actionClicked)=\"headerActionClicked($event)\"></lib-list-page-header>\n <lib-data-table [tableId]=\"'terminators'\"\n [rowData]=\"rowData\"\n [columnDefinitions]=\"columnDefs\"\n (actionRequested)=\"tableAction($event)\"\n [startCount]=\"startCount\"\n [endCount]=\"endCount\"\n [totalCount]=\"totalCount\"\n [emptyMsg]=\"'No terminators defined, Click the plus to add a terminator.'\"\n [filterApplied]=\"filterApplied\"\n [filterName]=\"'Address'\"\n [filterColumn]=\"'address'\"\n [menuItems]=\"svc.menuItems\"\n (gridReady)=\"gridReady($event)\"\n [options]=\"{noSelect: true, noMenu: false}\"\n >\n </lib-data-table>\n</div>\n" }]
21653
21754
  }], ctorParameters: function () { return [{ type: TerminatorsPageService }, { type: DataTableFilterService }, { type: TabNameService }, { type: ConsoleEventsService }, { type: i5$1.MatDialog }]; } });
21654
21755
 
21655
21756
  class Config {
@@ -21894,7 +21995,7 @@ class ConfigurationFormComponent extends ProjectableForm {
21894
21995
  }
21895
21996
  }
21896
21997
  copyCLICommand() {
21897
- 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)}'`;
21998
+ const command = `ziti edge ${this.formData.id ? 'update' : 'create'} config ${this.formData.id ? `'${this.formData.id}'` : ''} ${this.formData.id ? '--name' : ''} '${this.formData.name}' --data '${JSON.stringify(this.formData.data)}' --tags-json '${JSON.stringify(this.formData.tags)}'`;
21898
21999
  navigator.clipboard.writeText(command);
21899
22000
  const growlerData = new GrowlerModel('success', 'Success', `Text Copied`, `CLI command copied to clipboard`);
21900
22001
  this.growlerService.show(growlerData);
@@ -22015,7 +22116,7 @@ class ConfigurationFormComponent extends ProjectableForm {
22015
22116
  this._apiData = cloneDeep(this.apiData);
22016
22117
  }
22017
22118
  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 }); }
22018
- 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% - .9375rem);min-width:34.375rem;max-width:43.75rem}.form-group-column.two-fifths{max-width:43.75rem}\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", "badges", "title", "moreActions", "formView", "saveDisabled", "saveTooltip", "actionButtonText", "moreActionsText", "showHeaderToggle", "showHeaderButton"], 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", "contentClass", "showHeader", "showToggle", "headerActions", "headerToggle"], outputs: ["actionRequested", "headerToggleChange"] }, { 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"] }] }); }
22119
+ 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% - .9375rem);min-width:34.375rem;max-width:43.75rem}.form-group-column.two-fifths{max-width:43.75rem}\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", "badges", "title", "moreActions", "formView", "saveDisabled", "saveTooltip", "actionButtonText", "moreActionsText", "showHeaderToggle", "showHeaderButton"], 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", "contentClass", "showHeader", "showToggle", "headerActions", "headerToggle"], outputs: ["actionRequested", "headerToggleChange"] }, { 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", "showLineNumbers"], 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"] }] }); }
22019
22120
  }
22020
22121
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ConfigurationFormComponent, decorators: [{
22021
22122
  type: Component,
@@ -22341,11 +22442,11 @@ class JwtSignersPageComponent extends ListPageComponent {
22341
22442
  return filename;
22342
22443
  }
22343
22444
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: JwtSignersPageComponent, deps: [{ token: JwtSignersPageService }, { token: DataTableFilterService }, { token: TabNameService }, { token: ConsoleEventsService }, { token: i5$1.MatDialog }], target: i0.ɵɵFactoryTarget.Component }); }
22344
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: JwtSignersPageComponent, selector: "lib-jwt-signers", usesInheritance: true, ngImport: i0, template: "<div class=\"ziti-page-container ziti-configs-container\">\n <a\n *ngIf=\"_networkJwt\"\n class=\"network-jwt-link save-button\"\n href=\"data:application/ziti-jwt;charset=utf-8,{{networkJwt}}\"\n download=\"{{networkJwtFilename}}.jwt\"\n >\n Download Network JWT\n </a>\n <lib-list-page-header [title]=\"title\"\n [tabs]=\"tabs\"\n [showAdd]=\"!itemsSelected\"\n (actionClicked)=\"headerActionClicked($event)\"></lib-list-page-header>\n\n <lib-data-table [tableId]=\"'configurations'\"\n [rowData]=\"rowData\"\n [columnDefinitions]=\"columnDefs\"\n (actionRequested)=\"tableAction($event)\"\n [startCount]=\"startCount\"\n [endCount]=\"endCount\"\n [totalCount]=\"totalCount\"\n [emptyMsg]=\"'No Configurations defined, Click the plus to add a Configuration.'\"\n [filterApplied]=\"filterApplied\"\n [menuItems]=\"svc.menuItems\"\n (gridReady)=\"gridReady($event)\"\n >\n </lib-data-table>\n</div>\n<lib-loading-indicator *ngIf=\"isLoading\" [isLoading]=\"isLoading\"></lib-loading-indicator>\n", styles: [".configurations{width:100%;height:100%;display:flex;flex-direction:column;position:relative;flex:1 1 auto}.network-jwt-link{position:absolute;right:5.625rem;top:1.5625rem;z-index:10001;height:var(--buttonHeightSmall);padding-left:var(--buttonImagePaddingSmall);background-position:var(--buttonImagePositionSmall);background-image:url(/assets/svgs/DownloadKey.svg);background-repeat:no-repeat;background-size:var(--buttonImageSizeSmall);color:var(--white)}\n"], dependencies: [{ kind: "directive", type: i1$4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: ListPageHeaderComponent, selector: "lib-list-page-header", inputs: ["title", "tabs", "showAdd", "hideAction"], outputs: ["actionClicked"] }, { kind: "component", type: DataTableComponent, selector: "lib-data-table", inputs: ["rowData", "expandRowData", "collapseRowData", "rowValidation", "isTimeSearchAvailable", "isLoading", "tableId", "options", "validateService", "rowsToggled", "tableRefreshCount", "view", "serverSideDataSource", "allowDownload", "startCount", "endCount", "totalCount", "emptyMsg", "filterApplied", "menuItems", "headerActions", "noItemsClass", "entityTypeName", "showNoItemsAdd", "currentPage", "noItemsImage", "rowHeight", "filterName", "filterColumn", "columnDefinitions", "refreshCount"], outputs: ["actionRequested", "gridReady", "dragStart", "dragLeave", "pageChanged"] }, { kind: "component", type: LoadingIndicatorComponent, selector: "lib-loading-indicator", inputs: ["isLoading"] }] }); }
22445
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: JwtSignersPageComponent, selector: "lib-jwt-signers", usesInheritance: true, ngImport: i0, template: "<div class=\"ziti-page-container ziti-configs-container\">\n <a\n *ngIf=\"_networkJwt\"\n class=\"network-jwt-link save-button\"\n href=\"data:application/ziti-jwt;charset=utf-8,{{networkJwt}}\"\n download=\"{{networkJwtFilename}}.jwt\"\n >\n Download Network JWT\n </a>\n <lib-list-page-header [title]=\"title\"\n [tabs]=\"tabs\"\n [showAdd]=\"!itemsSelected\"\n (actionClicked)=\"headerActionClicked($event)\"></lib-list-page-header>\n\n <lib-data-table [tableId]=\"'ext-jwt-signers'\"\n [rowData]=\"rowData\"\n [columnDefinitions]=\"columnDefs\"\n (actionRequested)=\"tableAction($event)\"\n [startCount]=\"startCount\"\n [endCount]=\"endCount\"\n [totalCount]=\"totalCount\"\n [emptyMsg]=\"'No Configurations defined, Click the plus to add a Configuration.'\"\n [filterApplied]=\"filterApplied\"\n [menuItems]=\"svc.menuItems\"\n (gridReady)=\"gridReady($event)\"\n >\n </lib-data-table>\n</div>\n<lib-loading-indicator *ngIf=\"isLoading\" [isLoading]=\"isLoading\"></lib-loading-indicator>\n", styles: [".configurations{width:100%;height:100%;display:flex;flex-direction:column;position:relative;flex:1 1 auto}.network-jwt-link{position:absolute;right:5.625rem;top:1.5625rem;z-index:10001;height:var(--buttonHeightSmall);padding-left:var(--buttonImagePaddingSmall);background-position:var(--buttonImagePositionSmall);background-image:url(/assets/svgs/DownloadKey.svg);background-repeat:no-repeat;background-size:var(--buttonImageSizeSmall);color:var(--white)}\n"], dependencies: [{ kind: "directive", type: i1$4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: ListPageHeaderComponent, selector: "lib-list-page-header", inputs: ["title", "tabs", "showAdd", "hideAction"], outputs: ["actionClicked"] }, { kind: "component", type: DataTableComponent, selector: "lib-data-table", inputs: ["rowData", "expandRowData", "collapseRowData", "rowValidation", "isTimeSearchAvailable", "isLoading", "tableId", "options", "validateService", "rowsToggled", "tableRefreshCount", "view", "serverSideDataSource", "allowDownload", "startCount", "endCount", "totalCount", "emptyMsg", "filterApplied", "menuItems", "headerActions", "noItemsClass", "entityTypeName", "showNoItemsAdd", "currentPage", "noItemsImage", "rowHeight", "filterName", "filterColumn", "columnDefinitions", "refreshCount"], outputs: ["actionRequested", "gridReady", "dragStart", "dragLeave", "pageChanged"] }, { kind: "component", type: LoadingIndicatorComponent, selector: "lib-loading-indicator", inputs: ["isLoading"] }] }); }
22345
22446
  }
22346
22447
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: JwtSignersPageComponent, decorators: [{
22347
22448
  type: Component,
22348
- args: [{ selector: 'lib-jwt-signers', template: "<div class=\"ziti-page-container ziti-configs-container\">\n <a\n *ngIf=\"_networkJwt\"\n class=\"network-jwt-link save-button\"\n href=\"data:application/ziti-jwt;charset=utf-8,{{networkJwt}}\"\n download=\"{{networkJwtFilename}}.jwt\"\n >\n Download Network JWT\n </a>\n <lib-list-page-header [title]=\"title\"\n [tabs]=\"tabs\"\n [showAdd]=\"!itemsSelected\"\n (actionClicked)=\"headerActionClicked($event)\"></lib-list-page-header>\n\n <lib-data-table [tableId]=\"'configurations'\"\n [rowData]=\"rowData\"\n [columnDefinitions]=\"columnDefs\"\n (actionRequested)=\"tableAction($event)\"\n [startCount]=\"startCount\"\n [endCount]=\"endCount\"\n [totalCount]=\"totalCount\"\n [emptyMsg]=\"'No Configurations defined, Click the plus to add a Configuration.'\"\n [filterApplied]=\"filterApplied\"\n [menuItems]=\"svc.menuItems\"\n (gridReady)=\"gridReady($event)\"\n >\n </lib-data-table>\n</div>\n<lib-loading-indicator *ngIf=\"isLoading\" [isLoading]=\"isLoading\"></lib-loading-indicator>\n", styles: [".configurations{width:100%;height:100%;display:flex;flex-direction:column;position:relative;flex:1 1 auto}.network-jwt-link{position:absolute;right:5.625rem;top:1.5625rem;z-index:10001;height:var(--buttonHeightSmall);padding-left:var(--buttonImagePaddingSmall);background-position:var(--buttonImagePositionSmall);background-image:url(/assets/svgs/DownloadKey.svg);background-repeat:no-repeat;background-size:var(--buttonImageSizeSmall);color:var(--white)}\n"] }]
22449
+ args: [{ selector: 'lib-jwt-signers', template: "<div class=\"ziti-page-container ziti-configs-container\">\n <a\n *ngIf=\"_networkJwt\"\n class=\"network-jwt-link save-button\"\n href=\"data:application/ziti-jwt;charset=utf-8,{{networkJwt}}\"\n download=\"{{networkJwtFilename}}.jwt\"\n >\n Download Network JWT\n </a>\n <lib-list-page-header [title]=\"title\"\n [tabs]=\"tabs\"\n [showAdd]=\"!itemsSelected\"\n (actionClicked)=\"headerActionClicked($event)\"></lib-list-page-header>\n\n <lib-data-table [tableId]=\"'ext-jwt-signers'\"\n [rowData]=\"rowData\"\n [columnDefinitions]=\"columnDefs\"\n (actionRequested)=\"tableAction($event)\"\n [startCount]=\"startCount\"\n [endCount]=\"endCount\"\n [totalCount]=\"totalCount\"\n [emptyMsg]=\"'No Configurations defined, Click the plus to add a Configuration.'\"\n [filterApplied]=\"filterApplied\"\n [menuItems]=\"svc.menuItems\"\n (gridReady)=\"gridReady($event)\"\n >\n </lib-data-table>\n</div>\n<lib-loading-indicator *ngIf=\"isLoading\" [isLoading]=\"isLoading\"></lib-loading-indicator>\n", styles: [".configurations{width:100%;height:100%;display:flex;flex-direction:column;position:relative;flex:1 1 auto}.network-jwt-link{position:absolute;right:5.625rem;top:1.5625rem;z-index:10001;height:var(--buttonHeightSmall);padding-left:var(--buttonImagePaddingSmall);background-position:var(--buttonImagePositionSmall);background-image:url(/assets/svgs/DownloadKey.svg);background-repeat:no-repeat;background-size:var(--buttonImageSizeSmall);color:var(--white)}\n"] }]
22349
22450
  }], ctorParameters: function () { return [{ type: JwtSignersPageService }, { type: DataTableFilterService }, { type: TabNameService }, { type: ConsoleEventsService }, { type: i5$1.MatDialog }]; } });
22350
22451
 
22351
22452
  class JwtSigner {
@@ -22463,12 +22564,12 @@ class AuthService {
22463
22564
  this.oauthService.logOut();
22464
22565
  this.oauthService.configure({});
22465
22566
  }
22466
- configureOAuth(extJwtSigner, callbackParams, configKey, tokenTypeKey) {
22567
+ configureOAuth(extJwtSigner, callbackUrl = '/callback', configKey, tokenTypeKey) {
22467
22568
  let basePath = document.querySelector('base')?.getAttribute('href') || '/';
22468
22569
  basePath = basePath.endsWith('/') ? basePath.slice(0, -1) : basePath;
22469
22570
  const scopes = extJwtSigner.scopes || [];
22470
22571
  const scope = scopes.join(' ');
22471
- const redirectPath = basePath + `/callback${callbackParams ? `?${callbackParams}` : ''}`;
22572
+ const redirectPath = basePath + callbackUrl;
22472
22573
  const oauthConfig = {
22473
22574
  issuer: extJwtSigner.externalAuthUrl,
22474
22575
  redirectUri: window.location.origin + redirectPath,
@@ -22495,12 +22596,13 @@ class AuthService {
22495
22596
  const growlerData = new GrowlerModel('error', 'Error', `Login Error`, 'Unable to initialize OAuth login');
22496
22597
  this.growlerService.show(growlerData);
22497
22598
  }
22498
- return initSuccess;
22599
+ return { success: initSuccess, message: '' };
22499
22600
  }).catch((error) => {
22500
- const growlerData = new GrowlerModel('error', 'Error', `Login Error`, 'Unable to initialize OAuth login: ' + (error?.message ? error.message : error));
22601
+ const errorMessage = 'Unable to initialize OAuth login: ' + (error?.message ? error.message : error);
22602
+ const growlerData = new GrowlerModel('error', 'Error', `Login Error`, errorMessage);
22501
22603
  this.growlerService.show(growlerData);
22502
22604
  this.resetOAuthService();
22503
- return false;
22605
+ return { success: false, message: errorMessage };
22504
22606
  });
22505
22607
  }
22506
22608
  login() {
@@ -22538,7 +22640,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
22538
22640
  limitations under the License.
22539
22641
  */
22540
22642
  class JwtSignerFormComponent extends ProjectableForm {
22541
- constructor(svc, schemaSvc, growlerService, extService, settingsService, zitiService, router, route, location, validationService, authService, oauthService, loginService) {
22643
+ constructor(svc, schemaSvc, growlerService, extService, settingsService, zitiService, router, route, location, validationService, authService, oauthService, http, loginService) {
22542
22644
  super(growlerService, extService, zitiService, router, route, location, settingsService);
22543
22645
  this.svc = svc;
22544
22646
  this.schemaSvc = schemaSvc;
@@ -22549,6 +22651,7 @@ class JwtSignerFormComponent extends ProjectableForm {
22549
22651
  this.validationService = validationService;
22550
22652
  this.authService = authService;
22551
22653
  this.oauthService = oauthService;
22654
+ this.http = http;
22552
22655
  this.loginService = loginService;
22553
22656
  this.formData = {};
22554
22657
  this.errors = {};
@@ -22566,6 +22669,7 @@ class JwtSignerFormComponent extends ProjectableForm {
22566
22669
  this.configKey = 'oauth_test_callback_config';
22567
22670
  this.tokenTypeKey = 'oauth_test_callback_token_type';
22568
22671
  this.oidcVerified = false;
22672
+ this.usePreviousLocation = false;
22569
22673
  this.entityType = 'external-jwt-signers';
22570
22674
  this.entityClass = JwtSigner;
22571
22675
  this._apiData = {};
@@ -22870,50 +22974,137 @@ class JwtSignerFormComponent extends ProjectableForm {
22870
22974
  });
22871
22975
  }
22872
22976
  get callbackURL() {
22873
- return window.location.origin + this.baseHref + `callback`;
22977
+ return window.location.origin + (this.baseHref + this.loginService.callbackRoute).replace('//', '/');
22874
22978
  }
22875
22979
  copyCallbackURL() {
22876
22980
  navigator.clipboard.writeText(this.callbackURL);
22877
22981
  this.growlerService.show(new GrowlerModel('success', 'Success', 'Copied to clipboard', 'JWT based auth domain has been copied to your clipboard'));
22878
22982
  }
22879
- testOIDCAuthentication() {
22983
+ async testOIDCAuthentication() {
22880
22984
  this.oauthLoading = true;
22881
- const callbackParams = `redirectRoute=jwt-signers/${this.formData.id}/test-auth`;
22985
+ this.oidcAuthTokenClaims = undefined;
22986
+ this.oidcErrorMessageSource = undefined;
22987
+ this.oidcErrorMessageDetail = undefined;
22988
+ this.oidcErrorMessageDetail2 = undefined;
22989
+ this.oidcErrorMessageDetail3 = undefined;
22990
+ this.jwksValidationError = undefined;
22991
+ const jwksValid = await this.testJWKS();
22992
+ if (!jwksValid) {
22993
+ this.oidcVerified = false;
22994
+ this.oauthLoading = false;
22995
+ return;
22996
+ }
22997
+ const callbackParams = `${this.loginService.callbackRoute}?redirectRoute=jwt-signers/${this.formData.id}/test-auth`;
22882
22998
  localStorage.setItem('oidc_callback_test_config', JSON.stringify(this.formData));
22883
22999
  this.authService.configureOAuth(this.formData, callbackParams).then((result) => {
22884
- if (result) {
23000
+ if (result.success) {
22885
23001
  delay(() => {
22886
23002
  this.oauthLoading = false;
22887
23003
  }, 4000);
22888
23004
  }
22889
23005
  else {
22890
23006
  delay(() => {
23007
+ this.oidcErrorMessageDetail = result.message;
23008
+ this.oidcErrorMessageSource = 'OAuth Configuration Error';
23009
+ if (this.jwksValidationError) {
23010
+ this.oidcErrorMessageDetail2 = this.jwksValidationError;
23011
+ }
22891
23012
  this.oauthLoading = false;
23013
+ this.oidcVerified = false;
22892
23014
  }, 700);
22893
23015
  }
22894
23016
  });
22895
23017
  }
22896
23018
  handleOAuthCallback() {
22897
23019
  this.showMore = true;
22898
- const errorMessage = this.route.snapshot.queryParamMap.get('oidcAuthErrorMessage');
23020
+ const errorMessageDetail = this.route.snapshot.queryParamMap.get('oidcAuthErrorMessageDetail');
23021
+ const errorMessageSource = this.route.snapshot.queryParamMap.get('oidcAuthErrorMessageSource');
23022
+ const oidcAuthTokenClaims = this.route.snapshot.queryParamMap.get('oidcAuthTokenClaims');
22899
23023
  const result = this.route.snapshot.queryParamMap.get('oidcAuthResult');
23024
+ const formData = localStorage.getItem('oidc_callback_test_config');
23025
+ if (!isEmpty(formData)) {
23026
+ this.overrideFormData = JSON.parse(formData);
23027
+ }
22900
23028
  if (result === 'success') {
22901
23029
  this.oidcVerified = true;
23030
+ if (oidcAuthTokenClaims) {
23031
+ this.oidcAuthTokenClaims = JSON.parse(oidcAuthTokenClaims);
23032
+ }
22902
23033
  }
22903
23034
  else {
22904
- this.oidcErrorMessage = errorMessage;
23035
+ this.oidcErrorMessageDetail = errorMessageDetail;
23036
+ this.oidcErrorMessageSource = errorMessageSource;
23037
+ if (oidcAuthTokenClaims) {
23038
+ this.oidcAuthTokenClaims = JSON.parse(oidcAuthTokenClaims);
23039
+ this.oidcErrorMessageDetail3 = 'Check the list of auth token claims below to confirm if your provider is returning the correct details.';
23040
+ this.validateTokenClaims(this.oidcAuthTokenClaims, this.overrideFormData);
23041
+ }
22905
23042
  }
22906
- const formData = localStorage.getItem('oidc_callback_test_config');
22907
- if (!isEmpty(formData)) {
22908
- this.overrideFormData = JSON.parse(formData);
23043
+ }
23044
+ validateTokenClaims(token, formData) {
23045
+ if (!token.aud) {
23046
+ this.errors.audience = true;
23047
+ this.oidcErrorMessageDetail2 = 'Audience is missing from token claims';
23048
+ }
23049
+ else {
23050
+ let audError = true;
23051
+ token.aud.forEach((audItem) => {
23052
+ if (audItem === formData.audience) {
23053
+ audError = false;
23054
+ }
23055
+ });
23056
+ if (audError) {
23057
+ this.errors.audience = true;
23058
+ this.oidcErrorMessageDetail2 = 'Audience in token does not match External JWT Signer configuration.';
23059
+ }
22909
23060
  }
22910
23061
  }
22911
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: JwtSignerFormComponent, deps: [{ token: JwtSignerFormService }, { token: SchemaService }, { token: GrowlerService }, { token: SHAREDZ_EXTENSION }, { token: SETTINGS_SERVICE }, { token: ZITI_DATA_SERVICE }, { token: i4.Router }, { token: i4.ActivatedRoute }, { token: i1$4.Location }, { token: ValidationService }, { token: AuthService }, { token: i1$5.OAuthService }, { token: ZAC_LOGIN_SERVICE }], target: i0.ɵɵFactoryTarget.Component }); }
22912
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: JwtSignerFormComponent, selector: "lib-configuration", inputs: { formData: "formData", errors: "errors" }, outputs: { close: "close" }, viewQueries: [{ propertyName: "filterInput", first: true, predicate: ["fileSelect"], descendants: true }, { propertyName: "oidcVerification", first: true, predicate: ["oidcVerification"], descendants: true }], 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 ? 'JWT Signer Details' : 'Create JWT Signer')\"\n [moreActions]=\"formData.moreActions\"\n (actionRequested)=\"headerActionRequested($event)\"\n [(formView)]=\"formView\"\n [saveDisabled]=\"svc.saveDisabled || formDataInvalid\"\n ></lib-form-header>\n <div class=\"jwt-signer-form-container projectable-form-container\" #scrollContainer>\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\n [title]=\"'Name'\"\n [label]=\"'Required'\"\n >\n <input class=\"form-field-input read-only\" [(ngModel)]=\"formData.name\" [ngClass]=\"{error: errors['name']}\" placeholder=\"Name this JWT Signer\" #nameFieldInput/>\n </lib-form-field-container>\n <lib-form-field-container\n [layout]=\"'column'\"\n [showHeader]=\"false\"\n >\n <div class=\"form-field-label-container\">\n <div class=\"form-field-header\">\n <div class=\"form-field-title-container\">\n <span class=\"form-field-title\">Issuer</span>\n <div\n class=\"form-field-info infoicon\"\n matTooltip=\"The &quot;issuer&quot; field on the JWT Signer must match the &quot;iss&quot; field on the JWT\"\n matTooltipPosition=\"below\"\n ></div>\n </div>\n <span class=\"form-field-label\" >Required</span>\n </div>\n <input class=\"form-field-input\" placeholder=\"Enter issuer\" [(ngModel)]=\"formData.issuer\" [ngClass]=\"{error: errors['issuer']}\"/>\n </div>\n <div class=\"form-field-label-container\">\n <div class=\"form-field-title-container\">\n <span class=\"form-field-title\">Audience</span>\n <div\n class=\"form-field-info infoicon\"\n matTooltip=\"The expected &quot;aud&quot; (audience) field on the JWT\"\n matTooltipPosition=\"below\"\n ></div>\n </div>\n <input class=\"form-field-input\" placeholder=\"Enter audience\" [(ngModel)]=\"formData.audience\"/>\n </div>\n <div class=\"form-field-row\">\n <div class=\"form-field-label-container\">\n <div class=\"form-field-title-container\">\n <span class=\"form-field-title\">Claims Property</span>\n <div\n class=\"form-field-info infoicon\"\n matTooltip=\"The field on the JWT for mapping to an identity. Matches the identity's id or externalId if &quot;Use External Id&quot; is set to true. Defaults to &quot;sub&quot;\"\n matTooltipPosition=\"below\"\n ></div>\n </div>\n <input class=\"form-field-input\" placeholder=\"Enter claims property\" [(ngModel)]=\"formData.claimsProperty\" (keyup)=\"checkExternalIdToggle()\" [ngClass]=\"{error: errors['claimsProperty']}\"/>\n </div>\n <div class=\"form-field-label-container\">\n <div class=\"form-field-header\">\n <div class=\"form-field-title-container\">\n <div class=\"config-container-label\" style=\"font-weight: 600; font-size: 14px;\">External ID</div>\n <div\n class=\"form-field-info infoicon\"\n matTooltip=\"If enabled, will match the &quot;claimsProperty&quot; to an identity's &quot;externalId&quot; field. If false, it will match to the identity's id field.\"\n matTooltipPosition=\"below\"\n ></div>\n </div>\n </div>\n <div class=\"config-item\">\n <div class=\"config-container toggle-container\">\n <div class=\"form-field-title-container\">\n <div class=\"config-container-label\">Use External ID</div>\n </div>\n <div\n (click)=\"toggleUseExternalId()\"\n [ngClass]=\"{ on: formData.useExternalId }\"\n class=\"toggle\"\n >\n <span [hidden]=\"!formData.useExternalId\" class=\"on-label\">YES</span>\n <span [hidden]=\"formData.useExternalId\" class=\"off-label\">NO</span>\n <div class=\"switch\"></div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </lib-form-field-container>\n <lib-form-field-container\n [showHeader]=\"false\"\n >\n <div class=\"form-field-label-container\">\n <div class=\"form-field-title-container\">\n <span class=\"form-field-title\">Client ID</span>\n <div\n class=\"form-field-info infoicon\"\n matTooltip=\"The client id to use when authenticating to the IDP\"\n matTooltipPosition=\"below\"\n ></div>\n </div>\n <input class=\"form-field-input\" placeholder=\"Enter client ID\" [(ngModel)]=\"formData.clientId\"/>\n </div>\n <div class=\"form-field-label-container\">\n <div class=\"form-field-title-container\">\n <span class=\"form-field-title\">External Auth Url</span>\n <div\n class=\"form-field-info infoicon\"\n matTooltip=\"The URL that users are directed to, to obtain a JWT\"\n matTooltipPosition=\"below\"\n ></div>\n </div>\n <input class=\"form-field-input\" placeholder=\"Enter external auth URL\" [(ngModel)]=\"formData.externalAuthUrl\"/>\n </div>\n <div class=\"form-field-label-container\">\n <div class=\"form-field-title-container\">\n <span class=\"form-field-title\">Scopes</span>\n <div\n class=\"form-field-info infoicon\"\n matTooltip=\"Enter as a comma or space seperated list of claims/permissions\"\n matTooltipPosition=\"below\"\n ></div>\n </div>\n <p-chips (keyup)=\"scopesOnKeyup($event)\"\n [(ngModel)]=\"formData.scopes\"\n [allowDuplicate]=\"false\"\n placeholder=\"Enter scopes\"\n [addOnBlur]=\"true\"\n separator=\",\">\n </p-chips>\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 <lib-form-field-container\n *ngIf=\"showMore && showTokenType\"\n [title]=\"'Target Token Type'\"\n [label]=\"'Required'\"\n [helpText]=\"'The target token type. Can be either Access or ID'\"\n class=\"form-field-advanced\"\n >\n <select\n [(ngModel)]=\"targetToken\"\n id=\"authPolicyId\"\n class=\"form-field-dropdown\"\n >\n <option value=\"ACCESS\">Access</option>\n <option value=\"ID\">ID</option>\n </select>\n </lib-form-field-container>\n <div [hidden]=\"!showMore\" class=\"form-group-column\">\n <lib-form-field-container\n [title]=\"'Verify OIDC Authentication'\"\n class=\"form-field-advanced\"\n [ngClass]=\"{'formFieldError': !oidcVerified && oidcErrorMessage, 'formFieldSuccess': oidcVerified}\"\n >\n <div class=\"form-field-row\" #oidcVerification>\n <div class=\"form-field-label-container\">\n <div class=\"form-field-title-container\">\n <div class=\"form-field-title\">Callback URL</div>\n <div\n class=\"form-field-info infoicon\"\n matTooltip=\"This URL must be added to the list of allowed callback URLs in your OAuth provider configuration\"\n matTooltipPosition=\"below\"\n ></div>\n </div>\n <div class=\"copy-link-container\">\n <pre class=\"read-only-2\" (click)=\"copyCallbackURL()\">{{ callbackURL }}</pre>\n <div class=\"copy-button\" (click)=\"copyCallbackURL()\"></div>\n </div>\n </div>\n <div class=\"test-oauth-button\"\n [ngClass]=\"{'oidc-verified': oidcVerified}\"\n (click)=\"testOIDCAuthentication()\"\n >\n {{oidcVerified ? 'Verified' : 'Authenticate' }}\n <div class=\"spinner\" *ngIf=\"oauthLoading\"></div>\n <input type=\"checkbox\" [disabled]=\"true\" [checked]=\"true\" class=\"success-check\" *ngIf=\"oidcVerified\">\n </div>\n </div>\n <span class=\"oidc-error-message\" *ngIf=\"oidcErrorMessage\">{{oidcErrorMessage}}</span>\n </lib-form-field-container>\n <lib-form-field-container\n [title]=\"'Custom Tags'\"\n [label]=\"'OPTIONAL'\"\n class=\"form-field-advanced\"\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]=\"'Verification'\"\n [label]=\"'REQUIRED'\"\n >\n <div class=\"radio-group-container\" (keydown)=\"radioKeyDownHandler($event)\" tabindex=\"0\">\n <div class=\"radio-button-container\" [ngClass]=\"{'selected': signatureMethod === 'JWKS_ENDPOINT'}\" (click)=\"selectSignatureMethod('JWKS_ENDPOINT')\">\n <div class=\"radio-button-circle\">\n <div class=\"radio-button-inner-circle\"></div>\n </div>\n <span class=\"radio-button-label\">JWKS Endpoint</span>\n </div>\n <div class=\"radio-button-container\" [ngClass]=\"{'selected': signatureMethod === 'CERT_PEM'}\" (click)=\"selectSignatureMethod('CERT_PEM')\">\n <div class=\"radio-button-circle\">\n <div class=\"radio-button-inner-circle\"></div>\n </div>\n <span class=\"radio-button-label\">Cert PEM</span>\n </div>\n </div>\n <div *ngIf=\"signatureMethod === 'JWKS_ENDPOINT'\" class=\"form-field-input-group\">\n <div class=\"form-field-label-container select-file-label-container\">\n <div class=\"form-field-header\">\n <div class=\"form-field-title-container\">\n <span class=\"form-field-title\">JWKS Endpoint</span>\n </div>\n </div>\n <input class=\"form-field-input read-only\" placeholder=\"Enter endpoint URL\" [(ngModel)]=\"formData.jwksEndpoint\" [ngClass]=\"{error: errors['certPem']}\"/>\n </div>\n </div>\n <div *ngIf=\"signatureMethod === 'CERT_PEM'\" class=\"form-field-input-group\">\n <div class=\"form-field-label-container select-file-label-container\">\n <div class=\"form-field-header\">\n <div class=\"form-field-title-container\">\n <span class=\"form-field-title\">PEM</span>\n </div>\n <span class=\"select-file-button\" (click)=\"openFileSelect($event)\">\n Select File\n <div class=\"spinner\" *ngIf=\"fileSelectOpening\"></div>\n </span>\n <input #fileSelect type=\"file\" style=\"display:none\" (change)=\"selectPemFile($event)\">\n </div>\n <textarea placeholder=\"Paste pem contents or select file\" [(ngModel)]=\"formData.certPem\" [ngClass]=\"{error: errors['certPem']}\"></textarea>\n </div>\n <div class=\"form-field-label-container\">\n <div class=\"form-field-header\">\n <div class=\"form-field-title-container\">\n <span class=\"form-field-title\">KID</span>\n </div>\n <span class=\"form-field-label\" >Optional</span>\n </div>\n <input class=\"form-field-input\" placeholder=\"Enter KID\" [(ngModel)]=\"formData.kid\"/>\n </div>\n </div>\n </lib-form-field-container>\n <lib-form-field-container\n [showHeader]=\"false\"\n >\n <div class=\"config-item\">\n <div class=\"config-container toggle-container\">\n <div class=\"config-container-label\">ENABLED</div>\n <div\n (click)=\"toggleEnabled()\"\n [ngClass]=\"{ on: formData.enabled }\"\n class=\"toggle\"\n >\n <span [hidden]=\"!formData.enabled\" class=\"on-label\">YES</span>\n <span [hidden]=\"formData.enabled\" class=\"off-label\">NO</span>\n <div class=\"switch\"></div>\n </div>\n </div>\n </div>\n </lib-form-field-container>\n <lib-form-field-container\n [title]=\"'API Calls'\"\n [headerActions]=\"apiOptions\"\n (actionRequested)=\"apiActionRequested($event)\"\n [class]=\"'api-data-no-wrap'\"\n >\n <div class=\"form-row\">\n <input class=\"form-field-input\" [value]=\"apiCallURL\"/>\n <div class=\"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: ["@charset \"UTF-8\";.jwt-signer-form-container{display:flex;flex-direction:column;height:100%;width:100%;align-items:center;gap:var(--gapXL)}.jwt-signer-form-container .select-file-button{padding-left:var(--paddingMedium);padding-right:var(--paddingMedium);height:1.5625rem;width:-moz-fit-content;width:fit-content;white-space:nowrap;display:flex;align-items:center;justify-content:center;font-weight:600;font-size:.875rem;background:var(--primary);border-style:solid;border-width:.0625rem;border-color:var(--stroke);color:var(--white);cursor:pointer;border-radius:var(--inputBorderRadius);gap:var(--marginMedium);margin-top:-.3125rem}.jwt-signer-form-container .select-file-button:hover{filter:brightness(.8)}.jwt-signer-form-container .select-file-button:active{filter:grayscale(1);transform:translateY(.0625rem)}.jwt-signer-form-container .select-file-button .spinner{display:inline-block;width:.5rem;height:.5rem;border-radius:50%;background:transparent;border-top:.125rem solid white;border-right:.125rem solid white;border-bottom:.125rem solid transparent;border-left:.125rem solid transparent;animation:loading .5s infinite linear}.jwt-signer-form-container .select-file-label-container{gap:var(--marginMedium)}::ng-deep .jwt-signer-form-container select:disabled,::ng-deep .jwt-signer-form-container input:disabled{opacity:.75!important;cursor:text;background-color:var(--stroke)!important}::ng-deep .api-data-no-wrap .jse-text-mode{width:100%}::ng-deep .api-data-no-wrap .jse-text-mode .cm-editor{width:100%}::ng-deep .api-data-no-wrap .jse-text-mode .cm-editor .cm-scroller{width:100%}::ng-deep .api-data-no-wrap .jse-text-mode .cm-editor .cm-scroller .cm-content{width:100%;overflow:auto}::ng-deep .api-data-no-wrap .jse-text-mode .cm-editor .cm-scroller .cm-content .\\37cr{white-space:nowrap}.radio-group-container{display:flex;gap:var(--marginLarge)}.radio-group-container:focus .radio-button-container .radio-button-circle{border-color:var(--primaryColor)}.radio-group-container .radio-button-container{display:flex;flex-direction:row;align-items:center;background-color:var(--formGroup);border-radius:var(--inputBorderRadius);width:100%;padding-left:var(--paddingMedium);padding-right:var(--paddingMedium);padding-top:var(--paddingLarge);padding-bottom:var(--paddingLarge);cursor:pointer;gap:var(--marginMedium)}.radio-group-container .radio-button-container .radio-button-circle{display:flex;width:1.3125rem;height:1.3125rem;border-radius:1.3125rem;border-width:.125rem;border-style:solid;border-color:var(--offWhite_ALWAYS);align-items:center;justify-content:center;background-color:var(--offWhite)}.radio-group-container .radio-button-container .radio-button-circle .radio-button-inner-circle{display:none;width:.9375rem;height:.9375rem;border-radius:.9375rem;align-items:center;justify-content:center;background-color:var(--primaryColor)}.radio-group-container .radio-button-container.selected .radio-button-circle .radio-button-inner-circle{display:flex}.radio-group-container .radio-button-container:active .radio-button-circle .radio-button-inner-circle{display:flex;background-color:var(--menu)}.radio-group-container .radio-button-container .radio-button-label{color:var(--offWhite_ALWAYS);font-size:.875rem;font-weight:600}.test-oauth-button{color:var(--offWhite_ALWAYS);height:var(--defaultInputHeight);border-style:solid;border-color:var(--inputBorder);border-radius:var(--inputBorderRadius);vertical-align:middle;text-align:center;position:relative;display:flex;align-items:center;justify-content:center;overflow:hidden;transition:color .2s;font-size:.9375rem;font-weight:600;font-family:Open Sans,sans-serif;text-transform:uppercase;cursor:pointer;width:100%;background-color:var(--primaryColor);margin-top:1.5rem;max-width:15rem}.test-oauth-button.oidc-verified{filter:brightness(.95);color:var(--offWhite_ALWAYS);background-color:var(--green)}.test-oauth-button .spinner{display:inline-block;width:var(--spinnerSizeMedium);height:var(--spinnerSizeMedium);border-radius:50%;background:transparent;border-top:var(--spinnerBorderTopMedium);border-right:var(--spinnerBorderRightMedium);border-bottom:var(--spinnerBorderBottomMedium);border-left:var(--spinnerBorderLeftMedium);animation:loading .5s infinite linear;margin-left:var(--marginSmall)}.test-oauth-button:hover{filter:brightness(.95)}.test-oauth-button:active{transform:translateY(1px)}.success-check{width:1.0625rem;height:1.0625rem;cursor:pointer;background-color:var(--navigation);margin:0;margin-top:.25rem;border-radius:2rem;margin-left:var(--marginSmall)}.success-check:checked{background-color:var(--green)!important;background-image:url(../../assets/images/check.png);background-size:.675rem;background-position:center center;background-repeat:no-repeat;border:none}.success-check:checked:disabled{opacity:1!important}.oidc-error-message{background-color:var(--lightRed);height:var(--defaultInputHeight);display:flex;flex-direction:row;align-items:center;padding:var(--paddingMedium);border-radius:var(--inputBorderRadius);color:var(--red);font-weight:600}.read-only-2{display:flex;overflow:auto;white-space:nowrap;opacity:1!important;cursor:pointer;padding:var(--paddingMedium);padding-bottom:var(--paddingSmall)}.read-only-2::-webkit-scrollbar{height:6px;width:6px}.read-only-2::-webkit-scrollbar-thumb{background-color:var(--menu);border-radius:10px}.read-only-2:hover{text-decoration:underline}.read-only-2:hover::-webkit-scrollbar-thumb{background-clip:unset}.copy-link-container{display:flex;flex-direction:row;justify-content:space-between;align-items:center;opacity:1!important;cursor:text;border-radius:var(--inputBorderRadius);height:var(--defaultInputHeight);background-color:var(--backgroundMuted)!important}.copy-button{display:flex;align-items:center;justify-content:center;height:100%;width:2.575rem;margin-left:.125rem;background:url(/assets/svgs/copy.svg) no-repeat;background-size:1.125rem 1.125rem;background-position:center;cursor:pointer;border-top-right-radius:var(--inputBorderRadius);border-bottom-right-radius:var(--inputBorderRadius);background-color:#0000000f}.copy-button:hover{filter:brightness(.95);background-color:#0000001f}\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: 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.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"] }, { kind: "directive", type: i3.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "component", type: FormHeaderComponent, selector: "lib-form-header", inputs: ["data", "badges", "title", "moreActions", "formView", "saveDisabled", "saveTooltip", "actionButtonText", "moreActionsText", "showHeaderToggle", "showHeaderButton"], 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", "contentClass", "showHeader", "showToggle", "headerActions", "headerToggle"], outputs: ["actionRequested", "headerToggleChange"] }, { 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"] }] }); }
23062
+ async testJWKS() {
23063
+ this.errors.jwksEndpoint = false;
23064
+ try {
23065
+ const response = await this.http.get(this.formData.jwksEndpoint).toPromise().catch((error) => {
23066
+ this.oidcErrorMessageSource = 'JWKS Endpoint Error';
23067
+ this.oidcErrorMessageDetail = `HTTP error returned. Status: ${error.status}. Message: ${error.message}`;
23068
+ this.errors.jwksEndpoint = true;
23069
+ return false;
23070
+ });
23071
+ if (response) {
23072
+ // Basic structural validation
23073
+ if (!response?.keys || !Array.isArray(response?.keys)) {
23074
+ this.oidcErrorMessageSource = 'JWKS Endpoint Error';
23075
+ this.oidcErrorMessageDetail = `Invalid JWKS: "keys" property missing or not an array`;
23076
+ this.errors.jwksEndpoint = true;
23077
+ }
23078
+ else {
23079
+ const logError = get(this.oauthService, 'logger.error');
23080
+ this.oauthService['logger'].error = (...args) => {
23081
+ this.jwksValidationError = '';
23082
+ args.forEach((arg) => {
23083
+ this.jwksValidationError += arg + ' ';
23084
+ });
23085
+ logError.apply(this, args);
23086
+ };
23087
+ const result = invoke(this.oauthService, 'validateDiscoveryDocument', response);
23088
+ }
23089
+ }
23090
+ }
23091
+ catch (error) {
23092
+ this.oidcErrorMessageSource = 'JWKS Endpoint Error';
23093
+ this.oidcErrorMessageDetail = `${error.message}`;
23094
+ this.errors.jwksEndpoint = true;
23095
+ }
23096
+ const growlerData = new GrowlerModel('error', 'Invalid', this.oidcErrorMessageSource, this.oidcErrorMessageDetail);
23097
+ if (this.errors.jwksEndpoint) {
23098
+ this.growlerService.show(growlerData);
23099
+ }
23100
+ return !this.errors.jwksEndpoint;
23101
+ }
23102
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: JwtSignerFormComponent, deps: [{ token: JwtSignerFormService }, { token: SchemaService }, { token: GrowlerService }, { token: SHAREDZ_EXTENSION }, { token: SETTINGS_SERVICE }, { token: ZITI_DATA_SERVICE }, { token: i4.Router }, { token: i4.ActivatedRoute }, { token: i1$4.Location }, { token: ValidationService }, { token: AuthService }, { token: i1$5.OAuthService }, { token: i1$1.HttpClient }, { token: ZAC_LOGIN_SERVICE }], target: i0.ɵɵFactoryTarget.Component }); }
23103
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: JwtSignerFormComponent, selector: "lib-configuration", inputs: { formData: "formData", errors: "errors" }, outputs: { close: "close" }, viewQueries: [{ propertyName: "filterInput", first: true, predicate: ["fileSelect"], descendants: true }, { propertyName: "oidcVerification", first: true, predicate: ["oidcVerification"], descendants: true }], 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 ? 'JWT Signer Details' : 'Create JWT Signer')\"\n [moreActions]=\"formData.moreActions\"\n (actionRequested)=\"headerActionRequested($event)\"\n [(formView)]=\"formView\"\n [saveDisabled]=\"svc.saveDisabled || formDataInvalid\"\n ></lib-form-header>\n <div class=\"jwt-signer-form-container projectable-form-container\" #scrollContainer>\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\n [title]=\"'Name'\"\n [label]=\"'Required'\"\n >\n <input class=\"form-field-input read-only\" [(ngModel)]=\"formData.name\" [ngClass]=\"{error: errors['name']}\" placeholder=\"Name this JWT Signer\" #nameFieldInput/>\n </lib-form-field-container>\n <lib-form-field-container\n [layout]=\"'column'\"\n [showHeader]=\"false\"\n >\n <div class=\"form-field-label-container\">\n <div class=\"form-field-header\">\n <div class=\"form-field-title-container\">\n <span class=\"form-field-title\">Issuer</span>\n <div\n class=\"form-field-info infoicon\"\n matTooltip=\"The &quot;issuer&quot; field on the JWT Signer must match the &quot;iss&quot; field on the JWT\"\n matTooltipPosition=\"below\"\n ></div>\n </div>\n <span class=\"form-field-label\" >Required</span>\n </div>\n <input class=\"form-field-input\" placeholder=\"Enter issuer\" [(ngModel)]=\"formData.issuer\" [ngClass]=\"{error: errors['issuer']}\"/>\n </div>\n <div class=\"form-field-label-container\">\n <div class=\"form-field-title-container\">\n <span class=\"form-field-title\">Audience</span>\n <div\n class=\"form-field-info infoicon\"\n matTooltip=\"The expected &quot;aud&quot; (audience) field on the JWT\"\n matTooltipPosition=\"below\"\n ></div>\n </div>\n <input class=\"form-field-input\" placeholder=\"Enter audience\" [(ngModel)]=\"formData.audience\"/>\n </div>\n <div class=\"form-field-row\">\n <div class=\"form-field-label-container\">\n <div class=\"form-field-title-container\">\n <span class=\"form-field-title\">Claims Property</span>\n <div\n class=\"form-field-info infoicon\"\n matTooltip=\"The field on the JWT for mapping to an identity. Matches the identity's id or externalId if &quot;Use External Id&quot; is set to true. Defaults to &quot;sub&quot;\"\n matTooltipPosition=\"below\"\n ></div>\n </div>\n <input class=\"form-field-input\" placeholder=\"Enter claims property\" [(ngModel)]=\"formData.claimsProperty\" (keyup)=\"checkExternalIdToggle()\" [ngClass]=\"{error: errors['claimsProperty']}\"/>\n </div>\n <div class=\"form-field-label-container\">\n <div class=\"form-field-header\">\n <div class=\"form-field-title-container\">\n <div class=\"config-container-label\" style=\"font-weight: 600; font-size: 14px;\">External ID</div>\n <div\n class=\"form-field-info infoicon\"\n matTooltip=\"If enabled, will match the &quot;claimsProperty&quot; to an identity's &quot;externalId&quot; field. If false, it will match to the identity's id field.\"\n matTooltipPosition=\"below\"\n ></div>\n </div>\n </div>\n <div class=\"config-item\">\n <div class=\"config-container toggle-container\">\n <div class=\"form-field-title-container\">\n <div class=\"config-container-label\">Use External ID</div>\n </div>\n <div\n (click)=\"toggleUseExternalId()\"\n [ngClass]=\"{ on: formData.useExternalId }\"\n class=\"toggle\"\n >\n <span [hidden]=\"!formData.useExternalId\" class=\"on-label\">YES</span>\n <span [hidden]=\"formData.useExternalId\" class=\"off-label\">NO</span>\n <div class=\"switch\"></div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </lib-form-field-container>\n <lib-form-field-container\n [showHeader]=\"false\"\n >\n <div class=\"form-field-label-container\">\n <div class=\"form-field-title-container\">\n <span class=\"form-field-title\">Client ID</span>\n <div\n class=\"form-field-info infoicon\"\n matTooltip=\"The client id to use when authenticating to the IDP\"\n matTooltipPosition=\"below\"\n ></div>\n </div>\n <input class=\"form-field-input\" placeholder=\"Enter client ID\" [(ngModel)]=\"formData.clientId\"/>\n </div>\n <div class=\"form-field-label-container\">\n <div class=\"form-field-title-container\">\n <span class=\"form-field-title\">External Auth Url</span>\n <div\n class=\"form-field-info infoicon\"\n matTooltip=\"The URL that users are directed to, to obtain a JWT\"\n matTooltipPosition=\"below\"\n ></div>\n </div>\n <input class=\"form-field-input\" placeholder=\"Enter external auth URL\" [(ngModel)]=\"formData.externalAuthUrl\"/>\n </div>\n <div class=\"form-field-label-container\">\n <div class=\"form-field-title-container\">\n <span class=\"form-field-title\">Scopes</span>\n <div\n class=\"form-field-info infoicon\"\n matTooltip=\"Enter as a comma or space seperated list of claims/permissions\"\n matTooltipPosition=\"below\"\n ></div>\n </div>\n <p-chips (keyup)=\"scopesOnKeyup($event)\"\n [(ngModel)]=\"formData.scopes\"\n [allowDuplicate]=\"false\"\n placeholder=\"Enter scopes\"\n [addOnBlur]=\"true\"\n separator=\",\">\n </p-chips>\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 <lib-form-field-container\n *ngIf=\"showMore && showTokenType\"\n [title]=\"'Target Token Type'\"\n [label]=\"'Required'\"\n [helpText]=\"'The target token type. Can be either Access or ID'\"\n class=\"form-field-advanced\"\n >\n <select\n [(ngModel)]=\"targetToken\"\n id=\"authPolicyId\"\n class=\"form-field-dropdown\"\n >\n <option value=\"ACCESS\">Access</option>\n <option value=\"ID\">ID</option>\n </select>\n </lib-form-field-container>\n <div [hidden]=\"!showMore\" class=\"form-group-column\">\n <lib-form-field-container\n [title]=\"'Verify OIDC Authentication'\"\n class=\"form-field-advanced\"\n [ngClass]=\"{'formFieldError': !oidcVerified && oidcErrorMessageDetail, 'formFieldSuccess': oidcVerified}\"\n >\n <div class=\"form-field-row\" #oidcVerification>\n <div class=\"form-field-label-container\">\n <div class=\"form-field-title-container\">\n <div class=\"form-field-title\">Callback URL</div>\n <div\n class=\"form-field-info infoicon\"\n matTooltip=\"This URL must be added to the list of allowed callback URLs in your OAuth provider configuration\"\n matTooltipPosition=\"below\"\n ></div>\n </div>\n <div class=\"copy-link-container\">\n <pre class=\"read-only-2\" (click)=\"copyCallbackURL()\">{{ callbackURL }}</pre>\n <div class=\"copy-button\" (click)=\"copyCallbackURL()\"></div>\n </div>\n </div>\n <div class=\"test-oauth-button\"\n [ngClass]=\"{'oidc-verified': oidcVerified}\"\n (click)=\"testOIDCAuthentication()\"\n >\n {{oidcVerified ? 'Verified' : 'Authenticate' }}\n <div class=\"spinner\" *ngIf=\"oauthLoading\"></div>\n <input type=\"checkbox\" [disabled]=\"true\" [checked]=\"true\" class=\"success-check\" *ngIf=\"oidcVerified\">\n </div>\n </div>\n <div class=\"oidc-error-message-container\" *ngIf=\"oidcErrorMessageDetail\">\n <code class=\"oidc-error-message-source\">{{oidcErrorMessageSource}}: </code>\n <code class=\"oidc-error-message-detail\">{{oidcErrorMessageDetail}}</code>\n <code class=\"oidc-error-message-detail2\" *ngIf=\"oidcErrorMessageDetail2\">{{oidcErrorMessageDetail2}}</code>\n <code class=\"oidc-error-message-detail2\" *ngIf=\"oidcErrorMessageDetail3\">{{oidcErrorMessageDetail3}}</code>\n </div>\n <div class=\"oidc-token-claims-container\" *ngIf=\"oidcAuthTokenClaims\">\n <code class=\"oidc-token-claims-title\">OAuth Token Claims: </code>\n <lib-json-view [showLineNumbers]=\"false\" [(data)]=\"oidcAuthTokenClaims\"></lib-json-view>\n </div>\n </lib-form-field-container>\n <lib-form-field-container\n [title]=\"'Custom Tags'\"\n [label]=\"'OPTIONAL'\"\n class=\"form-field-advanced\"\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]=\"'Verification'\"\n [label]=\"'REQUIRED'\"\n >\n <div class=\"radio-group-container\" (keydown)=\"radioKeyDownHandler($event)\" tabindex=\"0\">\n <div class=\"radio-button-container\" [ngClass]=\"{'selected': signatureMethod === 'JWKS_ENDPOINT'}\" (click)=\"selectSignatureMethod('JWKS_ENDPOINT')\">\n <div class=\"radio-button-circle\">\n <div class=\"radio-button-inner-circle\"></div>\n </div>\n <span class=\"radio-button-label\">JWKS Endpoint</span>\n </div>\n <div class=\"radio-button-container\" [ngClass]=\"{'selected': signatureMethod === 'CERT_PEM'}\" (click)=\"selectSignatureMethod('CERT_PEM')\">\n <div class=\"radio-button-circle\">\n <div class=\"radio-button-inner-circle\"></div>\n </div>\n <span class=\"radio-button-label\">Cert PEM</span>\n </div>\n </div>\n <div *ngIf=\"signatureMethod === 'JWKS_ENDPOINT'\" class=\"form-field-input-group\">\n <div class=\"form-field-label-container select-file-label-container\">\n <div class=\"form-field-header\">\n <div class=\"form-field-title-container\">\n <span class=\"form-field-title\">JWKS Endpoint</span>\n </div>\n </div>\n <input class=\"form-field-input read-only\" placeholder=\"Enter endpoint URL\" [(ngModel)]=\"formData.jwksEndpoint\" [ngClass]=\"{error: errors['jwksEndpoint']}\"/>\n </div>\n </div>\n <div *ngIf=\"signatureMethod === 'CERT_PEM'\" class=\"form-field-input-group\">\n <div class=\"form-field-label-container select-file-label-container\">\n <div class=\"form-field-header\">\n <div class=\"form-field-title-container\">\n <span class=\"form-field-title\">PEM</span>\n </div>\n <span class=\"select-file-button\" (click)=\"openFileSelect($event)\">\n Select File\n <div class=\"spinner\" *ngIf=\"fileSelectOpening\"></div>\n </span>\n <input #fileSelect type=\"file\" style=\"display:none\" (change)=\"selectPemFile($event)\">\n </div>\n <textarea placeholder=\"Paste pem contents or select file\" [(ngModel)]=\"formData.certPem\" [ngClass]=\"{error: errors['certPem']}\"></textarea>\n </div>\n <div class=\"form-field-label-container\">\n <div class=\"form-field-header\">\n <div class=\"form-field-title-container\">\n <span class=\"form-field-title\">KID</span>\n </div>\n <span class=\"form-field-label\" >Optional</span>\n </div>\n <input class=\"form-field-input\" placeholder=\"Enter KID\" [(ngModel)]=\"formData.kid\"/>\n </div>\n </div>\n </lib-form-field-container>\n <lib-form-field-container\n [showHeader]=\"false\"\n >\n <div class=\"config-item\">\n <div class=\"config-container toggle-container\">\n <div class=\"config-container-label\">ENABLED</div>\n <div\n (click)=\"toggleEnabled()\"\n [ngClass]=\"{ on: formData.enabled }\"\n class=\"toggle\"\n >\n <span [hidden]=\"!formData.enabled\" class=\"on-label\">YES</span>\n <span [hidden]=\"formData.enabled\" class=\"off-label\">NO</span>\n <div class=\"switch\"></div>\n </div>\n </div>\n </div>\n </lib-form-field-container>\n <lib-form-field-container\n [title]=\"'API Calls'\"\n [headerActions]=\"apiOptions\"\n (actionRequested)=\"apiActionRequested($event)\"\n [class]=\"'api-data-no-wrap'\"\n >\n <div class=\"form-row\">\n <input class=\"form-field-input\" [value]=\"apiCallURL\"/>\n <div class=\"icon-copy copy\" (click)=\"copyToClipboard(apiCallURL)\"></div>\n </div>\n <lib-json-view *ngIf=\"formData\" [showLineNumbers]=\"false\" [(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: ["@charset \"UTF-8\";.jwt-signer-form-container{display:flex;flex-direction:column;height:100%;width:100%;align-items:center;gap:var(--gapXL)}.jwt-signer-form-container .select-file-button{padding-left:var(--paddingMedium);padding-right:var(--paddingMedium);height:1.5625rem;width:-moz-fit-content;width:fit-content;white-space:nowrap;display:flex;align-items:center;justify-content:center;font-weight:600;font-size:.875rem;background:var(--primary);border-style:solid;border-width:.0625rem;border-color:var(--stroke);color:var(--white);cursor:pointer;border-radius:var(--inputBorderRadius);gap:var(--marginMedium);margin-top:-.3125rem}.jwt-signer-form-container .select-file-button:hover{filter:brightness(.8)}.jwt-signer-form-container .select-file-button:active{filter:grayscale(1);transform:translateY(.0625rem)}.jwt-signer-form-container .select-file-button .spinner{display:inline-block;width:.5rem;height:.5rem;border-radius:50%;background:transparent;border-top:.125rem solid white;border-right:.125rem solid white;border-bottom:.125rem solid transparent;border-left:.125rem solid transparent;animation:loading .5s infinite linear}.jwt-signer-form-container .select-file-label-container{gap:var(--marginMedium)}::ng-deep .jwt-signer-form-container select:disabled,::ng-deep .jwt-signer-form-container input:disabled{opacity:.75!important;cursor:text;background-color:var(--stroke)!important}::ng-deep .api-data-no-wrap .jse-text-mode{width:100%}::ng-deep .api-data-no-wrap .jse-text-mode .cm-editor{width:100%}::ng-deep .api-data-no-wrap .jse-text-mode .cm-editor .cm-scroller{width:100%}::ng-deep .api-data-no-wrap .jse-text-mode .cm-editor .cm-scroller .cm-content{width:100%;overflow:auto}::ng-deep .api-data-no-wrap .jse-text-mode .cm-editor .cm-scroller .cm-content .\\37cr{white-space:nowrap}.radio-group-container{display:flex;gap:var(--marginLarge)}.radio-group-container:focus .radio-button-container .radio-button-circle{border-color:var(--primaryColor)}.radio-group-container .radio-button-container{display:flex;flex-direction:row;align-items:center;background-color:var(--formGroup);border-radius:var(--inputBorderRadius);width:100%;padding-left:var(--paddingMedium);padding-right:var(--paddingMedium);padding-top:var(--paddingLarge);padding-bottom:var(--paddingLarge);cursor:pointer;gap:var(--marginMedium)}.radio-group-container .radio-button-container .radio-button-circle{display:flex;width:1.3125rem;height:1.3125rem;border-radius:1.3125rem;border-width:.125rem;border-style:solid;border-color:var(--offWhite_ALWAYS);align-items:center;justify-content:center;background-color:var(--offWhite)}.radio-group-container .radio-button-container .radio-button-circle .radio-button-inner-circle{display:none;width:.9375rem;height:.9375rem;border-radius:.9375rem;align-items:center;justify-content:center;background-color:var(--primaryColor)}.radio-group-container .radio-button-container.selected .radio-button-circle .radio-button-inner-circle{display:flex}.radio-group-container .radio-button-container:active .radio-button-circle .radio-button-inner-circle{display:flex;background-color:var(--menu)}.radio-group-container .radio-button-container .radio-button-label{color:var(--offWhite_ALWAYS);font-size:.875rem;font-weight:600}.test-oauth-button{color:var(--offWhite_ALWAYS);height:var(--defaultInputHeight);border-style:solid;border-color:var(--inputBorder);border-radius:var(--inputBorderRadius);vertical-align:middle;text-align:center;position:relative;display:flex;align-items:center;justify-content:center;overflow:hidden;transition:color .2s;font-size:.9375rem;font-weight:600;font-family:Open Sans,sans-serif;text-transform:uppercase;cursor:pointer;width:100%;background-color:var(--primaryColor);margin-top:1.5rem;max-width:15rem}.test-oauth-button.oidc-verified{filter:brightness(.95);color:var(--offWhite_ALWAYS);background-color:var(--green)}.test-oauth-button .spinner{display:inline-block;width:var(--spinnerSizeMedium);height:var(--spinnerSizeMedium);border-radius:50%;background:transparent;border-top:var(--spinnerBorderTopMedium);border-right:var(--spinnerBorderRightMedium);border-bottom:var(--spinnerBorderBottomMedium);border-left:var(--spinnerBorderLeftMedium);animation:loading .5s infinite linear;margin-left:var(--marginSmall)}.test-oauth-button:hover{filter:brightness(.95)}.test-oauth-button:active{transform:translateY(1px)}.success-check{width:1.0625rem;height:1.0625rem;cursor:pointer;background-color:var(--navigation);margin:0;margin-top:.25rem;border-radius:2rem;margin-left:var(--marginSmall)}.success-check:checked{background-color:var(--green)!important;background-image:url(../../assets/images/check.png);background-size:.675rem;background-position:center center;background-repeat:no-repeat;border:none}.success-check:checked:disabled{opacity:1!important}.oidc-token-claims-container{background-color:var(--backgroundMuted);height:-moz-fit-content;height:fit-content;display:flex;flex-direction:column;align-items:flex-start;justify-content:flex-start;padding:var(--paddingMedium);border-radius:var(--inputBorderRadius);color:var(--tableText);font-weight:600;overflow:auto}.oidc-token-claims-container .oidc-token-claims-title{font-weight:600;font-size:1rem;white-space:nowrap;margin-bottom:var(--marginMedium)}.oidc-error-message-container{background-color:var(--lightRed);height:-moz-fit-content;height:fit-content;display:flex;flex-direction:column;align-items:flex-start;justify-content:flex-start;padding:var(--paddingMedium);border-radius:var(--inputBorderRadius);color:var(--red);font-weight:600;overflow:auto}.oidc-error-message-container .oidc-error-message-source{font-weight:600;font-size:1rem;white-space:nowrap}.oidc-error-message-container .oidc-error-message-detail2,.oidc-error-message-container .oidc-error-message-detail{margin-top:var(--marginSmall);font-weight:400;white-space:nowrap}.oidc-error-message-container::-webkit-scrollbar{height:6px;width:6px}.oidc-error-message-container::-webkit-scrollbar-thumb{background-color:var(--menu);border-radius:10px}.oidc-error-message-container:hover::-webkit-scrollbar-thumb{background-clip:unset!important}.read-only-2{display:flex;overflow:auto;white-space:nowrap;opacity:1!important;cursor:pointer;padding:var(--paddingMedium);padding-bottom:var(--paddingSmall)}.read-only-2::-webkit-scrollbar{height:6px;width:6px}.read-only-2::-webkit-scrollbar-thumb{background-color:var(--menu);border-radius:10px}.read-only-2:hover{text-decoration:underline}.read-only-2:hover::-webkit-scrollbar-thumb{background-clip:unset}.copy-link-container{display:flex;flex-direction:row;justify-content:space-between;align-items:center;opacity:1!important;cursor:text;border-radius:var(--inputBorderRadius);height:var(--defaultInputHeight);background-color:var(--backgroundMuted)!important}.copy-button{display:flex;align-items:center;justify-content:center;height:100%;width:2.575rem;margin-left:.125rem;background:url(/assets/svgs/copy.svg) no-repeat;background-size:1.125rem 1.125rem;background-position:center;cursor:pointer;border-top-right-radius:var(--inputBorderRadius);border-bottom-right-radius:var(--inputBorderRadius);background-color:#0000000f}.copy-button:hover{filter:brightness(.95);background-color:#0000001f}\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: 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.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"] }, { kind: "directive", type: i3.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "component", type: FormHeaderComponent, selector: "lib-form-header", inputs: ["data", "badges", "title", "moreActions", "formView", "saveDisabled", "saveTooltip", "actionButtonText", "moreActionsText", "showHeaderToggle", "showHeaderButton"], 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", "contentClass", "showHeader", "showToggle", "headerActions", "headerToggle"], outputs: ["actionRequested", "headerToggleChange"] }, { 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", "showLineNumbers"], outputs: ["dataChange", "jsonChange", "jsonInvalidChange"] }, { kind: "component", type: CustomTagsComponent, selector: "lib-custom-tags", inputs: ["tags"], outputs: ["tagsChange"] }] }); }
22913
23104
  }
22914
23105
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: JwtSignerFormComponent, decorators: [{
22915
23106
  type: Component,
22916
- 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 ? 'JWT Signer Details' : 'Create JWT Signer')\"\n [moreActions]=\"formData.moreActions\"\n (actionRequested)=\"headerActionRequested($event)\"\n [(formView)]=\"formView\"\n [saveDisabled]=\"svc.saveDisabled || formDataInvalid\"\n ></lib-form-header>\n <div class=\"jwt-signer-form-container projectable-form-container\" #scrollContainer>\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\n [title]=\"'Name'\"\n [label]=\"'Required'\"\n >\n <input class=\"form-field-input read-only\" [(ngModel)]=\"formData.name\" [ngClass]=\"{error: errors['name']}\" placeholder=\"Name this JWT Signer\" #nameFieldInput/>\n </lib-form-field-container>\n <lib-form-field-container\n [layout]=\"'column'\"\n [showHeader]=\"false\"\n >\n <div class=\"form-field-label-container\">\n <div class=\"form-field-header\">\n <div class=\"form-field-title-container\">\n <span class=\"form-field-title\">Issuer</span>\n <div\n class=\"form-field-info infoicon\"\n matTooltip=\"The &quot;issuer&quot; field on the JWT Signer must match the &quot;iss&quot; field on the JWT\"\n matTooltipPosition=\"below\"\n ></div>\n </div>\n <span class=\"form-field-label\" >Required</span>\n </div>\n <input class=\"form-field-input\" placeholder=\"Enter issuer\" [(ngModel)]=\"formData.issuer\" [ngClass]=\"{error: errors['issuer']}\"/>\n </div>\n <div class=\"form-field-label-container\">\n <div class=\"form-field-title-container\">\n <span class=\"form-field-title\">Audience</span>\n <div\n class=\"form-field-info infoicon\"\n matTooltip=\"The expected &quot;aud&quot; (audience) field on the JWT\"\n matTooltipPosition=\"below\"\n ></div>\n </div>\n <input class=\"form-field-input\" placeholder=\"Enter audience\" [(ngModel)]=\"formData.audience\"/>\n </div>\n <div class=\"form-field-row\">\n <div class=\"form-field-label-container\">\n <div class=\"form-field-title-container\">\n <span class=\"form-field-title\">Claims Property</span>\n <div\n class=\"form-field-info infoicon\"\n matTooltip=\"The field on the JWT for mapping to an identity. Matches the identity's id or externalId if &quot;Use External Id&quot; is set to true. Defaults to &quot;sub&quot;\"\n matTooltipPosition=\"below\"\n ></div>\n </div>\n <input class=\"form-field-input\" placeholder=\"Enter claims property\" [(ngModel)]=\"formData.claimsProperty\" (keyup)=\"checkExternalIdToggle()\" [ngClass]=\"{error: errors['claimsProperty']}\"/>\n </div>\n <div class=\"form-field-label-container\">\n <div class=\"form-field-header\">\n <div class=\"form-field-title-container\">\n <div class=\"config-container-label\" style=\"font-weight: 600; font-size: 14px;\">External ID</div>\n <div\n class=\"form-field-info infoicon\"\n matTooltip=\"If enabled, will match the &quot;claimsProperty&quot; to an identity's &quot;externalId&quot; field. If false, it will match to the identity's id field.\"\n matTooltipPosition=\"below\"\n ></div>\n </div>\n </div>\n <div class=\"config-item\">\n <div class=\"config-container toggle-container\">\n <div class=\"form-field-title-container\">\n <div class=\"config-container-label\">Use External ID</div>\n </div>\n <div\n (click)=\"toggleUseExternalId()\"\n [ngClass]=\"{ on: formData.useExternalId }\"\n class=\"toggle\"\n >\n <span [hidden]=\"!formData.useExternalId\" class=\"on-label\">YES</span>\n <span [hidden]=\"formData.useExternalId\" class=\"off-label\">NO</span>\n <div class=\"switch\"></div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </lib-form-field-container>\n <lib-form-field-container\n [showHeader]=\"false\"\n >\n <div class=\"form-field-label-container\">\n <div class=\"form-field-title-container\">\n <span class=\"form-field-title\">Client ID</span>\n <div\n class=\"form-field-info infoicon\"\n matTooltip=\"The client id to use when authenticating to the IDP\"\n matTooltipPosition=\"below\"\n ></div>\n </div>\n <input class=\"form-field-input\" placeholder=\"Enter client ID\" [(ngModel)]=\"formData.clientId\"/>\n </div>\n <div class=\"form-field-label-container\">\n <div class=\"form-field-title-container\">\n <span class=\"form-field-title\">External Auth Url</span>\n <div\n class=\"form-field-info infoicon\"\n matTooltip=\"The URL that users are directed to, to obtain a JWT\"\n matTooltipPosition=\"below\"\n ></div>\n </div>\n <input class=\"form-field-input\" placeholder=\"Enter external auth URL\" [(ngModel)]=\"formData.externalAuthUrl\"/>\n </div>\n <div class=\"form-field-label-container\">\n <div class=\"form-field-title-container\">\n <span class=\"form-field-title\">Scopes</span>\n <div\n class=\"form-field-info infoicon\"\n matTooltip=\"Enter as a comma or space seperated list of claims/permissions\"\n matTooltipPosition=\"below\"\n ></div>\n </div>\n <p-chips (keyup)=\"scopesOnKeyup($event)\"\n [(ngModel)]=\"formData.scopes\"\n [allowDuplicate]=\"false\"\n placeholder=\"Enter scopes\"\n [addOnBlur]=\"true\"\n separator=\",\">\n </p-chips>\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 <lib-form-field-container\n *ngIf=\"showMore && showTokenType\"\n [title]=\"'Target Token Type'\"\n [label]=\"'Required'\"\n [helpText]=\"'The target token type. Can be either Access or ID'\"\n class=\"form-field-advanced\"\n >\n <select\n [(ngModel)]=\"targetToken\"\n id=\"authPolicyId\"\n class=\"form-field-dropdown\"\n >\n <option value=\"ACCESS\">Access</option>\n <option value=\"ID\">ID</option>\n </select>\n </lib-form-field-container>\n <div [hidden]=\"!showMore\" class=\"form-group-column\">\n <lib-form-field-container\n [title]=\"'Verify OIDC Authentication'\"\n class=\"form-field-advanced\"\n [ngClass]=\"{'formFieldError': !oidcVerified && oidcErrorMessage, 'formFieldSuccess': oidcVerified}\"\n >\n <div class=\"form-field-row\" #oidcVerification>\n <div class=\"form-field-label-container\">\n <div class=\"form-field-title-container\">\n <div class=\"form-field-title\">Callback URL</div>\n <div\n class=\"form-field-info infoicon\"\n matTooltip=\"This URL must be added to the list of allowed callback URLs in your OAuth provider configuration\"\n matTooltipPosition=\"below\"\n ></div>\n </div>\n <div class=\"copy-link-container\">\n <pre class=\"read-only-2\" (click)=\"copyCallbackURL()\">{{ callbackURL }}</pre>\n <div class=\"copy-button\" (click)=\"copyCallbackURL()\"></div>\n </div>\n </div>\n <div class=\"test-oauth-button\"\n [ngClass]=\"{'oidc-verified': oidcVerified}\"\n (click)=\"testOIDCAuthentication()\"\n >\n {{oidcVerified ? 'Verified' : 'Authenticate' }}\n <div class=\"spinner\" *ngIf=\"oauthLoading\"></div>\n <input type=\"checkbox\" [disabled]=\"true\" [checked]=\"true\" class=\"success-check\" *ngIf=\"oidcVerified\">\n </div>\n </div>\n <span class=\"oidc-error-message\" *ngIf=\"oidcErrorMessage\">{{oidcErrorMessage}}</span>\n </lib-form-field-container>\n <lib-form-field-container\n [title]=\"'Custom Tags'\"\n [label]=\"'OPTIONAL'\"\n class=\"form-field-advanced\"\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]=\"'Verification'\"\n [label]=\"'REQUIRED'\"\n >\n <div class=\"radio-group-container\" (keydown)=\"radioKeyDownHandler($event)\" tabindex=\"0\">\n <div class=\"radio-button-container\" [ngClass]=\"{'selected': signatureMethod === 'JWKS_ENDPOINT'}\" (click)=\"selectSignatureMethod('JWKS_ENDPOINT')\">\n <div class=\"radio-button-circle\">\n <div class=\"radio-button-inner-circle\"></div>\n </div>\n <span class=\"radio-button-label\">JWKS Endpoint</span>\n </div>\n <div class=\"radio-button-container\" [ngClass]=\"{'selected': signatureMethod === 'CERT_PEM'}\" (click)=\"selectSignatureMethod('CERT_PEM')\">\n <div class=\"radio-button-circle\">\n <div class=\"radio-button-inner-circle\"></div>\n </div>\n <span class=\"radio-button-label\">Cert PEM</span>\n </div>\n </div>\n <div *ngIf=\"signatureMethod === 'JWKS_ENDPOINT'\" class=\"form-field-input-group\">\n <div class=\"form-field-label-container select-file-label-container\">\n <div class=\"form-field-header\">\n <div class=\"form-field-title-container\">\n <span class=\"form-field-title\">JWKS Endpoint</span>\n </div>\n </div>\n <input class=\"form-field-input read-only\" placeholder=\"Enter endpoint URL\" [(ngModel)]=\"formData.jwksEndpoint\" [ngClass]=\"{error: errors['certPem']}\"/>\n </div>\n </div>\n <div *ngIf=\"signatureMethod === 'CERT_PEM'\" class=\"form-field-input-group\">\n <div class=\"form-field-label-container select-file-label-container\">\n <div class=\"form-field-header\">\n <div class=\"form-field-title-container\">\n <span class=\"form-field-title\">PEM</span>\n </div>\n <span class=\"select-file-button\" (click)=\"openFileSelect($event)\">\n Select File\n <div class=\"spinner\" *ngIf=\"fileSelectOpening\"></div>\n </span>\n <input #fileSelect type=\"file\" style=\"display:none\" (change)=\"selectPemFile($event)\">\n </div>\n <textarea placeholder=\"Paste pem contents or select file\" [(ngModel)]=\"formData.certPem\" [ngClass]=\"{error: errors['certPem']}\"></textarea>\n </div>\n <div class=\"form-field-label-container\">\n <div class=\"form-field-header\">\n <div class=\"form-field-title-container\">\n <span class=\"form-field-title\">KID</span>\n </div>\n <span class=\"form-field-label\" >Optional</span>\n </div>\n <input class=\"form-field-input\" placeholder=\"Enter KID\" [(ngModel)]=\"formData.kid\"/>\n </div>\n </div>\n </lib-form-field-container>\n <lib-form-field-container\n [showHeader]=\"false\"\n >\n <div class=\"config-item\">\n <div class=\"config-container toggle-container\">\n <div class=\"config-container-label\">ENABLED</div>\n <div\n (click)=\"toggleEnabled()\"\n [ngClass]=\"{ on: formData.enabled }\"\n class=\"toggle\"\n >\n <span [hidden]=\"!formData.enabled\" class=\"on-label\">YES</span>\n <span [hidden]=\"formData.enabled\" class=\"off-label\">NO</span>\n <div class=\"switch\"></div>\n </div>\n </div>\n </div>\n </lib-form-field-container>\n <lib-form-field-container\n [title]=\"'API Calls'\"\n [headerActions]=\"apiOptions\"\n (actionRequested)=\"apiActionRequested($event)\"\n [class]=\"'api-data-no-wrap'\"\n >\n <div class=\"form-row\">\n <input class=\"form-field-input\" [value]=\"apiCallURL\"/>\n <div class=\"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: ["@charset \"UTF-8\";.jwt-signer-form-container{display:flex;flex-direction:column;height:100%;width:100%;align-items:center;gap:var(--gapXL)}.jwt-signer-form-container .select-file-button{padding-left:var(--paddingMedium);padding-right:var(--paddingMedium);height:1.5625rem;width:-moz-fit-content;width:fit-content;white-space:nowrap;display:flex;align-items:center;justify-content:center;font-weight:600;font-size:.875rem;background:var(--primary);border-style:solid;border-width:.0625rem;border-color:var(--stroke);color:var(--white);cursor:pointer;border-radius:var(--inputBorderRadius);gap:var(--marginMedium);margin-top:-.3125rem}.jwt-signer-form-container .select-file-button:hover{filter:brightness(.8)}.jwt-signer-form-container .select-file-button:active{filter:grayscale(1);transform:translateY(.0625rem)}.jwt-signer-form-container .select-file-button .spinner{display:inline-block;width:.5rem;height:.5rem;border-radius:50%;background:transparent;border-top:.125rem solid white;border-right:.125rem solid white;border-bottom:.125rem solid transparent;border-left:.125rem solid transparent;animation:loading .5s infinite linear}.jwt-signer-form-container .select-file-label-container{gap:var(--marginMedium)}::ng-deep .jwt-signer-form-container select:disabled,::ng-deep .jwt-signer-form-container input:disabled{opacity:.75!important;cursor:text;background-color:var(--stroke)!important}::ng-deep .api-data-no-wrap .jse-text-mode{width:100%}::ng-deep .api-data-no-wrap .jse-text-mode .cm-editor{width:100%}::ng-deep .api-data-no-wrap .jse-text-mode .cm-editor .cm-scroller{width:100%}::ng-deep .api-data-no-wrap .jse-text-mode .cm-editor .cm-scroller .cm-content{width:100%;overflow:auto}::ng-deep .api-data-no-wrap .jse-text-mode .cm-editor .cm-scroller .cm-content .\\37cr{white-space:nowrap}.radio-group-container{display:flex;gap:var(--marginLarge)}.radio-group-container:focus .radio-button-container .radio-button-circle{border-color:var(--primaryColor)}.radio-group-container .radio-button-container{display:flex;flex-direction:row;align-items:center;background-color:var(--formGroup);border-radius:var(--inputBorderRadius);width:100%;padding-left:var(--paddingMedium);padding-right:var(--paddingMedium);padding-top:var(--paddingLarge);padding-bottom:var(--paddingLarge);cursor:pointer;gap:var(--marginMedium)}.radio-group-container .radio-button-container .radio-button-circle{display:flex;width:1.3125rem;height:1.3125rem;border-radius:1.3125rem;border-width:.125rem;border-style:solid;border-color:var(--offWhite_ALWAYS);align-items:center;justify-content:center;background-color:var(--offWhite)}.radio-group-container .radio-button-container .radio-button-circle .radio-button-inner-circle{display:none;width:.9375rem;height:.9375rem;border-radius:.9375rem;align-items:center;justify-content:center;background-color:var(--primaryColor)}.radio-group-container .radio-button-container.selected .radio-button-circle .radio-button-inner-circle{display:flex}.radio-group-container .radio-button-container:active .radio-button-circle .radio-button-inner-circle{display:flex;background-color:var(--menu)}.radio-group-container .radio-button-container .radio-button-label{color:var(--offWhite_ALWAYS);font-size:.875rem;font-weight:600}.test-oauth-button{color:var(--offWhite_ALWAYS);height:var(--defaultInputHeight);border-style:solid;border-color:var(--inputBorder);border-radius:var(--inputBorderRadius);vertical-align:middle;text-align:center;position:relative;display:flex;align-items:center;justify-content:center;overflow:hidden;transition:color .2s;font-size:.9375rem;font-weight:600;font-family:Open Sans,sans-serif;text-transform:uppercase;cursor:pointer;width:100%;background-color:var(--primaryColor);margin-top:1.5rem;max-width:15rem}.test-oauth-button.oidc-verified{filter:brightness(.95);color:var(--offWhite_ALWAYS);background-color:var(--green)}.test-oauth-button .spinner{display:inline-block;width:var(--spinnerSizeMedium);height:var(--spinnerSizeMedium);border-radius:50%;background:transparent;border-top:var(--spinnerBorderTopMedium);border-right:var(--spinnerBorderRightMedium);border-bottom:var(--spinnerBorderBottomMedium);border-left:var(--spinnerBorderLeftMedium);animation:loading .5s infinite linear;margin-left:var(--marginSmall)}.test-oauth-button:hover{filter:brightness(.95)}.test-oauth-button:active{transform:translateY(1px)}.success-check{width:1.0625rem;height:1.0625rem;cursor:pointer;background-color:var(--navigation);margin:0;margin-top:.25rem;border-radius:2rem;margin-left:var(--marginSmall)}.success-check:checked{background-color:var(--green)!important;background-image:url(../../assets/images/check.png);background-size:.675rem;background-position:center center;background-repeat:no-repeat;border:none}.success-check:checked:disabled{opacity:1!important}.oidc-error-message{background-color:var(--lightRed);height:var(--defaultInputHeight);display:flex;flex-direction:row;align-items:center;padding:var(--paddingMedium);border-radius:var(--inputBorderRadius);color:var(--red);font-weight:600}.read-only-2{display:flex;overflow:auto;white-space:nowrap;opacity:1!important;cursor:pointer;padding:var(--paddingMedium);padding-bottom:var(--paddingSmall)}.read-only-2::-webkit-scrollbar{height:6px;width:6px}.read-only-2::-webkit-scrollbar-thumb{background-color:var(--menu);border-radius:10px}.read-only-2:hover{text-decoration:underline}.read-only-2:hover::-webkit-scrollbar-thumb{background-clip:unset}.copy-link-container{display:flex;flex-direction:row;justify-content:space-between;align-items:center;opacity:1!important;cursor:text;border-radius:var(--inputBorderRadius);height:var(--defaultInputHeight);background-color:var(--backgroundMuted)!important}.copy-button{display:flex;align-items:center;justify-content:center;height:100%;width:2.575rem;margin-left:.125rem;background:url(/assets/svgs/copy.svg) no-repeat;background-size:1.125rem 1.125rem;background-position:center;cursor:pointer;border-top-right-radius:var(--inputBorderRadius);border-bottom-right-radius:var(--inputBorderRadius);background-color:#0000000f}.copy-button:hover{filter:brightness(.95);background-color:#0000001f}\n"] }]
23107
+ 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 ? 'JWT Signer Details' : 'Create JWT Signer')\"\n [moreActions]=\"formData.moreActions\"\n (actionRequested)=\"headerActionRequested($event)\"\n [(formView)]=\"formView\"\n [saveDisabled]=\"svc.saveDisabled || formDataInvalid\"\n ></lib-form-header>\n <div class=\"jwt-signer-form-container projectable-form-container\" #scrollContainer>\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\n [title]=\"'Name'\"\n [label]=\"'Required'\"\n >\n <input class=\"form-field-input read-only\" [(ngModel)]=\"formData.name\" [ngClass]=\"{error: errors['name']}\" placeholder=\"Name this JWT Signer\" #nameFieldInput/>\n </lib-form-field-container>\n <lib-form-field-container\n [layout]=\"'column'\"\n [showHeader]=\"false\"\n >\n <div class=\"form-field-label-container\">\n <div class=\"form-field-header\">\n <div class=\"form-field-title-container\">\n <span class=\"form-field-title\">Issuer</span>\n <div\n class=\"form-field-info infoicon\"\n matTooltip=\"The &quot;issuer&quot; field on the JWT Signer must match the &quot;iss&quot; field on the JWT\"\n matTooltipPosition=\"below\"\n ></div>\n </div>\n <span class=\"form-field-label\" >Required</span>\n </div>\n <input class=\"form-field-input\" placeholder=\"Enter issuer\" [(ngModel)]=\"formData.issuer\" [ngClass]=\"{error: errors['issuer']}\"/>\n </div>\n <div class=\"form-field-label-container\">\n <div class=\"form-field-title-container\">\n <span class=\"form-field-title\">Audience</span>\n <div\n class=\"form-field-info infoicon\"\n matTooltip=\"The expected &quot;aud&quot; (audience) field on the JWT\"\n matTooltipPosition=\"below\"\n ></div>\n </div>\n <input class=\"form-field-input\" placeholder=\"Enter audience\" [(ngModel)]=\"formData.audience\"/>\n </div>\n <div class=\"form-field-row\">\n <div class=\"form-field-label-container\">\n <div class=\"form-field-title-container\">\n <span class=\"form-field-title\">Claims Property</span>\n <div\n class=\"form-field-info infoicon\"\n matTooltip=\"The field on the JWT for mapping to an identity. Matches the identity's id or externalId if &quot;Use External Id&quot; is set to true. Defaults to &quot;sub&quot;\"\n matTooltipPosition=\"below\"\n ></div>\n </div>\n <input class=\"form-field-input\" placeholder=\"Enter claims property\" [(ngModel)]=\"formData.claimsProperty\" (keyup)=\"checkExternalIdToggle()\" [ngClass]=\"{error: errors['claimsProperty']}\"/>\n </div>\n <div class=\"form-field-label-container\">\n <div class=\"form-field-header\">\n <div class=\"form-field-title-container\">\n <div class=\"config-container-label\" style=\"font-weight: 600; font-size: 14px;\">External ID</div>\n <div\n class=\"form-field-info infoicon\"\n matTooltip=\"If enabled, will match the &quot;claimsProperty&quot; to an identity's &quot;externalId&quot; field. If false, it will match to the identity's id field.\"\n matTooltipPosition=\"below\"\n ></div>\n </div>\n </div>\n <div class=\"config-item\">\n <div class=\"config-container toggle-container\">\n <div class=\"form-field-title-container\">\n <div class=\"config-container-label\">Use External ID</div>\n </div>\n <div\n (click)=\"toggleUseExternalId()\"\n [ngClass]=\"{ on: formData.useExternalId }\"\n class=\"toggle\"\n >\n <span [hidden]=\"!formData.useExternalId\" class=\"on-label\">YES</span>\n <span [hidden]=\"formData.useExternalId\" class=\"off-label\">NO</span>\n <div class=\"switch\"></div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </lib-form-field-container>\n <lib-form-field-container\n [showHeader]=\"false\"\n >\n <div class=\"form-field-label-container\">\n <div class=\"form-field-title-container\">\n <span class=\"form-field-title\">Client ID</span>\n <div\n class=\"form-field-info infoicon\"\n matTooltip=\"The client id to use when authenticating to the IDP\"\n matTooltipPosition=\"below\"\n ></div>\n </div>\n <input class=\"form-field-input\" placeholder=\"Enter client ID\" [(ngModel)]=\"formData.clientId\"/>\n </div>\n <div class=\"form-field-label-container\">\n <div class=\"form-field-title-container\">\n <span class=\"form-field-title\">External Auth Url</span>\n <div\n class=\"form-field-info infoicon\"\n matTooltip=\"The URL that users are directed to, to obtain a JWT\"\n matTooltipPosition=\"below\"\n ></div>\n </div>\n <input class=\"form-field-input\" placeholder=\"Enter external auth URL\" [(ngModel)]=\"formData.externalAuthUrl\"/>\n </div>\n <div class=\"form-field-label-container\">\n <div class=\"form-field-title-container\">\n <span class=\"form-field-title\">Scopes</span>\n <div\n class=\"form-field-info infoicon\"\n matTooltip=\"Enter as a comma or space seperated list of claims/permissions\"\n matTooltipPosition=\"below\"\n ></div>\n </div>\n <p-chips (keyup)=\"scopesOnKeyup($event)\"\n [(ngModel)]=\"formData.scopes\"\n [allowDuplicate]=\"false\"\n placeholder=\"Enter scopes\"\n [addOnBlur]=\"true\"\n separator=\",\">\n </p-chips>\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 <lib-form-field-container\n *ngIf=\"showMore && showTokenType\"\n [title]=\"'Target Token Type'\"\n [label]=\"'Required'\"\n [helpText]=\"'The target token type. Can be either Access or ID'\"\n class=\"form-field-advanced\"\n >\n <select\n [(ngModel)]=\"targetToken\"\n id=\"authPolicyId\"\n class=\"form-field-dropdown\"\n >\n <option value=\"ACCESS\">Access</option>\n <option value=\"ID\">ID</option>\n </select>\n </lib-form-field-container>\n <div [hidden]=\"!showMore\" class=\"form-group-column\">\n <lib-form-field-container\n [title]=\"'Verify OIDC Authentication'\"\n class=\"form-field-advanced\"\n [ngClass]=\"{'formFieldError': !oidcVerified && oidcErrorMessageDetail, 'formFieldSuccess': oidcVerified}\"\n >\n <div class=\"form-field-row\" #oidcVerification>\n <div class=\"form-field-label-container\">\n <div class=\"form-field-title-container\">\n <div class=\"form-field-title\">Callback URL</div>\n <div\n class=\"form-field-info infoicon\"\n matTooltip=\"This URL must be added to the list of allowed callback URLs in your OAuth provider configuration\"\n matTooltipPosition=\"below\"\n ></div>\n </div>\n <div class=\"copy-link-container\">\n <pre class=\"read-only-2\" (click)=\"copyCallbackURL()\">{{ callbackURL }}</pre>\n <div class=\"copy-button\" (click)=\"copyCallbackURL()\"></div>\n </div>\n </div>\n <div class=\"test-oauth-button\"\n [ngClass]=\"{'oidc-verified': oidcVerified}\"\n (click)=\"testOIDCAuthentication()\"\n >\n {{oidcVerified ? 'Verified' : 'Authenticate' }}\n <div class=\"spinner\" *ngIf=\"oauthLoading\"></div>\n <input type=\"checkbox\" [disabled]=\"true\" [checked]=\"true\" class=\"success-check\" *ngIf=\"oidcVerified\">\n </div>\n </div>\n <div class=\"oidc-error-message-container\" *ngIf=\"oidcErrorMessageDetail\">\n <code class=\"oidc-error-message-source\">{{oidcErrorMessageSource}}: </code>\n <code class=\"oidc-error-message-detail\">{{oidcErrorMessageDetail}}</code>\n <code class=\"oidc-error-message-detail2\" *ngIf=\"oidcErrorMessageDetail2\">{{oidcErrorMessageDetail2}}</code>\n <code class=\"oidc-error-message-detail2\" *ngIf=\"oidcErrorMessageDetail3\">{{oidcErrorMessageDetail3}}</code>\n </div>\n <div class=\"oidc-token-claims-container\" *ngIf=\"oidcAuthTokenClaims\">\n <code class=\"oidc-token-claims-title\">OAuth Token Claims: </code>\n <lib-json-view [showLineNumbers]=\"false\" [(data)]=\"oidcAuthTokenClaims\"></lib-json-view>\n </div>\n </lib-form-field-container>\n <lib-form-field-container\n [title]=\"'Custom Tags'\"\n [label]=\"'OPTIONAL'\"\n class=\"form-field-advanced\"\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]=\"'Verification'\"\n [label]=\"'REQUIRED'\"\n >\n <div class=\"radio-group-container\" (keydown)=\"radioKeyDownHandler($event)\" tabindex=\"0\">\n <div class=\"radio-button-container\" [ngClass]=\"{'selected': signatureMethod === 'JWKS_ENDPOINT'}\" (click)=\"selectSignatureMethod('JWKS_ENDPOINT')\">\n <div class=\"radio-button-circle\">\n <div class=\"radio-button-inner-circle\"></div>\n </div>\n <span class=\"radio-button-label\">JWKS Endpoint</span>\n </div>\n <div class=\"radio-button-container\" [ngClass]=\"{'selected': signatureMethod === 'CERT_PEM'}\" (click)=\"selectSignatureMethod('CERT_PEM')\">\n <div class=\"radio-button-circle\">\n <div class=\"radio-button-inner-circle\"></div>\n </div>\n <span class=\"radio-button-label\">Cert PEM</span>\n </div>\n </div>\n <div *ngIf=\"signatureMethod === 'JWKS_ENDPOINT'\" class=\"form-field-input-group\">\n <div class=\"form-field-label-container select-file-label-container\">\n <div class=\"form-field-header\">\n <div class=\"form-field-title-container\">\n <span class=\"form-field-title\">JWKS Endpoint</span>\n </div>\n </div>\n <input class=\"form-field-input read-only\" placeholder=\"Enter endpoint URL\" [(ngModel)]=\"formData.jwksEndpoint\" [ngClass]=\"{error: errors['jwksEndpoint']}\"/>\n </div>\n </div>\n <div *ngIf=\"signatureMethod === 'CERT_PEM'\" class=\"form-field-input-group\">\n <div class=\"form-field-label-container select-file-label-container\">\n <div class=\"form-field-header\">\n <div class=\"form-field-title-container\">\n <span class=\"form-field-title\">PEM</span>\n </div>\n <span class=\"select-file-button\" (click)=\"openFileSelect($event)\">\n Select File\n <div class=\"spinner\" *ngIf=\"fileSelectOpening\"></div>\n </span>\n <input #fileSelect type=\"file\" style=\"display:none\" (change)=\"selectPemFile($event)\">\n </div>\n <textarea placeholder=\"Paste pem contents or select file\" [(ngModel)]=\"formData.certPem\" [ngClass]=\"{error: errors['certPem']}\"></textarea>\n </div>\n <div class=\"form-field-label-container\">\n <div class=\"form-field-header\">\n <div class=\"form-field-title-container\">\n <span class=\"form-field-title\">KID</span>\n </div>\n <span class=\"form-field-label\" >Optional</span>\n </div>\n <input class=\"form-field-input\" placeholder=\"Enter KID\" [(ngModel)]=\"formData.kid\"/>\n </div>\n </div>\n </lib-form-field-container>\n <lib-form-field-container\n [showHeader]=\"false\"\n >\n <div class=\"config-item\">\n <div class=\"config-container toggle-container\">\n <div class=\"config-container-label\">ENABLED</div>\n <div\n (click)=\"toggleEnabled()\"\n [ngClass]=\"{ on: formData.enabled }\"\n class=\"toggle\"\n >\n <span [hidden]=\"!formData.enabled\" class=\"on-label\">YES</span>\n <span [hidden]=\"formData.enabled\" class=\"off-label\">NO</span>\n <div class=\"switch\"></div>\n </div>\n </div>\n </div>\n </lib-form-field-container>\n <lib-form-field-container\n [title]=\"'API Calls'\"\n [headerActions]=\"apiOptions\"\n (actionRequested)=\"apiActionRequested($event)\"\n [class]=\"'api-data-no-wrap'\"\n >\n <div class=\"form-row\">\n <input class=\"form-field-input\" [value]=\"apiCallURL\"/>\n <div class=\"icon-copy copy\" (click)=\"copyToClipboard(apiCallURL)\"></div>\n </div>\n <lib-json-view *ngIf=\"formData\" [showLineNumbers]=\"false\" [(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: ["@charset \"UTF-8\";.jwt-signer-form-container{display:flex;flex-direction:column;height:100%;width:100%;align-items:center;gap:var(--gapXL)}.jwt-signer-form-container .select-file-button{padding-left:var(--paddingMedium);padding-right:var(--paddingMedium);height:1.5625rem;width:-moz-fit-content;width:fit-content;white-space:nowrap;display:flex;align-items:center;justify-content:center;font-weight:600;font-size:.875rem;background:var(--primary);border-style:solid;border-width:.0625rem;border-color:var(--stroke);color:var(--white);cursor:pointer;border-radius:var(--inputBorderRadius);gap:var(--marginMedium);margin-top:-.3125rem}.jwt-signer-form-container .select-file-button:hover{filter:brightness(.8)}.jwt-signer-form-container .select-file-button:active{filter:grayscale(1);transform:translateY(.0625rem)}.jwt-signer-form-container .select-file-button .spinner{display:inline-block;width:.5rem;height:.5rem;border-radius:50%;background:transparent;border-top:.125rem solid white;border-right:.125rem solid white;border-bottom:.125rem solid transparent;border-left:.125rem solid transparent;animation:loading .5s infinite linear}.jwt-signer-form-container .select-file-label-container{gap:var(--marginMedium)}::ng-deep .jwt-signer-form-container select:disabled,::ng-deep .jwt-signer-form-container input:disabled{opacity:.75!important;cursor:text;background-color:var(--stroke)!important}::ng-deep .api-data-no-wrap .jse-text-mode{width:100%}::ng-deep .api-data-no-wrap .jse-text-mode .cm-editor{width:100%}::ng-deep .api-data-no-wrap .jse-text-mode .cm-editor .cm-scroller{width:100%}::ng-deep .api-data-no-wrap .jse-text-mode .cm-editor .cm-scroller .cm-content{width:100%;overflow:auto}::ng-deep .api-data-no-wrap .jse-text-mode .cm-editor .cm-scroller .cm-content .\\37cr{white-space:nowrap}.radio-group-container{display:flex;gap:var(--marginLarge)}.radio-group-container:focus .radio-button-container .radio-button-circle{border-color:var(--primaryColor)}.radio-group-container .radio-button-container{display:flex;flex-direction:row;align-items:center;background-color:var(--formGroup);border-radius:var(--inputBorderRadius);width:100%;padding-left:var(--paddingMedium);padding-right:var(--paddingMedium);padding-top:var(--paddingLarge);padding-bottom:var(--paddingLarge);cursor:pointer;gap:var(--marginMedium)}.radio-group-container .radio-button-container .radio-button-circle{display:flex;width:1.3125rem;height:1.3125rem;border-radius:1.3125rem;border-width:.125rem;border-style:solid;border-color:var(--offWhite_ALWAYS);align-items:center;justify-content:center;background-color:var(--offWhite)}.radio-group-container .radio-button-container .radio-button-circle .radio-button-inner-circle{display:none;width:.9375rem;height:.9375rem;border-radius:.9375rem;align-items:center;justify-content:center;background-color:var(--primaryColor)}.radio-group-container .radio-button-container.selected .radio-button-circle .radio-button-inner-circle{display:flex}.radio-group-container .radio-button-container:active .radio-button-circle .radio-button-inner-circle{display:flex;background-color:var(--menu)}.radio-group-container .radio-button-container .radio-button-label{color:var(--offWhite_ALWAYS);font-size:.875rem;font-weight:600}.test-oauth-button{color:var(--offWhite_ALWAYS);height:var(--defaultInputHeight);border-style:solid;border-color:var(--inputBorder);border-radius:var(--inputBorderRadius);vertical-align:middle;text-align:center;position:relative;display:flex;align-items:center;justify-content:center;overflow:hidden;transition:color .2s;font-size:.9375rem;font-weight:600;font-family:Open Sans,sans-serif;text-transform:uppercase;cursor:pointer;width:100%;background-color:var(--primaryColor);margin-top:1.5rem;max-width:15rem}.test-oauth-button.oidc-verified{filter:brightness(.95);color:var(--offWhite_ALWAYS);background-color:var(--green)}.test-oauth-button .spinner{display:inline-block;width:var(--spinnerSizeMedium);height:var(--spinnerSizeMedium);border-radius:50%;background:transparent;border-top:var(--spinnerBorderTopMedium);border-right:var(--spinnerBorderRightMedium);border-bottom:var(--spinnerBorderBottomMedium);border-left:var(--spinnerBorderLeftMedium);animation:loading .5s infinite linear;margin-left:var(--marginSmall)}.test-oauth-button:hover{filter:brightness(.95)}.test-oauth-button:active{transform:translateY(1px)}.success-check{width:1.0625rem;height:1.0625rem;cursor:pointer;background-color:var(--navigation);margin:0;margin-top:.25rem;border-radius:2rem;margin-left:var(--marginSmall)}.success-check:checked{background-color:var(--green)!important;background-image:url(../../assets/images/check.png);background-size:.675rem;background-position:center center;background-repeat:no-repeat;border:none}.success-check:checked:disabled{opacity:1!important}.oidc-token-claims-container{background-color:var(--backgroundMuted);height:-moz-fit-content;height:fit-content;display:flex;flex-direction:column;align-items:flex-start;justify-content:flex-start;padding:var(--paddingMedium);border-radius:var(--inputBorderRadius);color:var(--tableText);font-weight:600;overflow:auto}.oidc-token-claims-container .oidc-token-claims-title{font-weight:600;font-size:1rem;white-space:nowrap;margin-bottom:var(--marginMedium)}.oidc-error-message-container{background-color:var(--lightRed);height:-moz-fit-content;height:fit-content;display:flex;flex-direction:column;align-items:flex-start;justify-content:flex-start;padding:var(--paddingMedium);border-radius:var(--inputBorderRadius);color:var(--red);font-weight:600;overflow:auto}.oidc-error-message-container .oidc-error-message-source{font-weight:600;font-size:1rem;white-space:nowrap}.oidc-error-message-container .oidc-error-message-detail2,.oidc-error-message-container .oidc-error-message-detail{margin-top:var(--marginSmall);font-weight:400;white-space:nowrap}.oidc-error-message-container::-webkit-scrollbar{height:6px;width:6px}.oidc-error-message-container::-webkit-scrollbar-thumb{background-color:var(--menu);border-radius:10px}.oidc-error-message-container:hover::-webkit-scrollbar-thumb{background-clip:unset!important}.read-only-2{display:flex;overflow:auto;white-space:nowrap;opacity:1!important;cursor:pointer;padding:var(--paddingMedium);padding-bottom:var(--paddingSmall)}.read-only-2::-webkit-scrollbar{height:6px;width:6px}.read-only-2::-webkit-scrollbar-thumb{background-color:var(--menu);border-radius:10px}.read-only-2:hover{text-decoration:underline}.read-only-2:hover::-webkit-scrollbar-thumb{background-clip:unset}.copy-link-container{display:flex;flex-direction:row;justify-content:space-between;align-items:center;opacity:1!important;cursor:text;border-radius:var(--inputBorderRadius);height:var(--defaultInputHeight);background-color:var(--backgroundMuted)!important}.copy-button{display:flex;align-items:center;justify-content:center;height:100%;width:2.575rem;margin-left:.125rem;background:url(/assets/svgs/copy.svg) no-repeat;background-size:1.125rem 1.125rem;background-position:center;cursor:pointer;border-top-right-radius:var(--inputBorderRadius);border-bottom-right-radius:var(--inputBorderRadius);background-color:#0000000f}.copy-button:hover{filter:brightness(.95);background-color:#0000001f}\n"] }]
22917
23108
  }], ctorParameters: function () { return [{ type: JwtSignerFormService }, { type: SchemaService }, { type: GrowlerService }, { type: undefined, decorators: [{
22918
23109
  type: Inject,
22919
23110
  args: [SHAREDZ_EXTENSION]
@@ -22923,7 +23114,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
22923
23114
  }] }, { type: ZitiDataService, decorators: [{
22924
23115
  type: Inject,
22925
23116
  args: [ZITI_DATA_SERVICE]
22926
- }] }, { type: i4.Router }, { type: i4.ActivatedRoute }, { type: i1$4.Location }, { type: ValidationService }, { type: AuthService }, { type: i1$5.OAuthService }, { type: LoginServiceClass, decorators: [{
23117
+ }] }, { type: i4.Router }, { type: i4.ActivatedRoute }, { type: i1$4.Location }, { type: ValidationService }, { type: AuthService }, { type: i1$5.OAuthService }, { type: i1$1.HttpClient }, { type: LoginServiceClass, decorators: [{
22927
23118
  type: Inject,
22928
23119
  args: [ZAC_LOGIN_SERVICE]
22929
23120
  }] }]; }, propDecorators: { formData: [{
@@ -23666,7 +23857,7 @@ class AuthPolicyFormComponent extends ProjectableForm {
23666
23857
  this.svc.getJwtSigners(filters, 1);
23667
23858
  }
23668
23859
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AuthPolicyFormComponent, deps: [{ token: AuthPolicyFormService }, { token: SchemaService }, { token: GrowlerService }, { token: SHAREDZ_EXTENSION }, { token: SETTINGS_SERVICE }, { token: ZITI_DATA_SERVICE }, { token: i4.Router }, { token: i4.ActivatedRoute }, { token: i1$4.Location }, { token: ValidationService }], target: i0.ɵɵFactoryTarget.Component }); }
23669
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: AuthPolicyFormComponent, selector: "lib-configuration", inputs: { formData: "formData", errors: "errors" }, outputs: { close: "close" }, viewQueries: [{ propertyName: "filterInput", first: true, predicate: ["fileSelect"], descendants: true }], 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 ? 'Auth Policy Details' : 'Create Auth Policy')\"\n [moreActions]=\"formData.moreActions\"\n (actionRequested)=\"headerActionRequested($event)\"\n [(formView)]=\"formView\"\n [saveDisabled]=\"svc.saveDisabled || formDataInvalid\"\n ></lib-form-header>\n <div class=\"jwt-signer-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\n [title]=\"'Name'\"\n [label]=\"'Required'\"\n >\n <input class=\"form-field-input read-only\" [(ngModel)]=\"formData.name\" [ngClass]=\"{error: errors['name']}\" placeholder=\"Name this Auth Policy\"/>\n </lib-form-field-container>\n <lib-form-field-container\n [title]=\"'Primary Authentication'\"\n [layout]=\"'row'\"\n >\n <div class=\"config-item\">\n <div class=\"config-container toggle-container\">\n <div class=\"form-field-title-container\">\n <div class=\"config-container-label\">Cert</div>\n <div\n class=\"form-field-info infoicon\"\n matTooltip=\"Allow x509 certificate based authentication\"\n matTooltipPosition=\"below\"\n ></div>\n </div>\n <div\n (click)=\"toggleCertAllowed()\"\n [ngClass]=\"{ on: formData.primary.cert.allowed }\"\n class=\"toggle\"\n >\n <span [hidden]=\"!formData.primary.cert.allowed\" class=\"on-label\">YES</span>\n <span [hidden]=\"formData.primary.cert.allowed\" class=\"off-label\">NO</span>\n <div class=\"switch\"></div>\n </div>\n </div>\n </div>\n <div class=\"config-item\">\n <div class=\"config-container toggle-container\">\n <div class=\"form-field-title-container\">\n <div class=\"config-container-label\">Ext JWT</div>\n <div\n class=\"form-field-info infoicon\"\n matTooltip=\"Allow externally signed JWT bearer tokens\"\n matTooltipPosition=\"below\"\n ></div>\n </div>\n <div\n (click)=\"toggleExtJwtAllowed()\"\n [ngClass]=\"{ on: formData.primary.extJwt.allowed }\"\n class=\"toggle\"\n >\n <span [hidden]=\"!formData.primary.extJwt.allowed\" class=\"on-label\">YES</span>\n <span [hidden]=\"formData.primary.extJwt.allowed\" class=\"off-label\">NO</span>\n <div class=\"switch\"></div>\n </div>\n </div>\n </div>\n <div class=\"config-item\">\n <div class=\"config-container toggle-container\">\n <div class=\"form-field-title-container\">\n <div class=\"config-container-label\">UPDB</div>\n <div\n class=\"form-field-info infoicon\"\n matTooltip=\"Allow authentication via a traditional &quot;Username Password Database&quot;\"\n matTooltipPosition=\"below\"\n ></div>\n </div>\n <div\n (click)=\"toggleUpdbAllowed()\"\n [ngClass]=\"{ on: formData.primary.updb.allowed }\"\n class=\"toggle\"\n >\n <span [hidden]=\"!formData.primary.updb.allowed\" class=\"on-label\">YES</span>\n <span [hidden]=\"formData.primary.updb.allowed\" class=\"off-label\">NO</span>\n <div class=\"switch\"></div>\n </div>\n </div>\n </div>\n </lib-form-field-container>\n <lib-form-field-container\n *ngIf=\"formData.primary.cert.allowed\"\n [title]=\"'Cert Options'\"\n [layout]=\"'row'\"\n >\n <div class=\"config-item\">\n <div class=\"config-container toggle-container\">\n <div class=\"form-field-title-container\">\n <div class=\"config-container-label\">Allow Expired Certificates</div>\n <div\n class=\"form-field-info infoicon\"\n matTooltip=\"Allow expired client certificates to authenticate\"\n matTooltipPosition=\"below\"\n ></div>\n </div>\n <div\n (click)=\"toggleAllowExpiredCerts()\"\n [ngClass]=\"{ on: formData.primary.cert.allowExpiredCerts }\"\n class=\"toggle\"\n >\n <span [hidden]=\"!formData.primary.cert.allowExpiredCerts\" class=\"on-label\">YES</span>\n <span [hidden]=\"formData.primary.cert.allowExpiredCerts\" class=\"off-label\">NO</span>\n <div class=\"switch\"></div>\n </div>\n </div>\n </div>\n </lib-form-field-container>\n <lib-form-field-container\n *ngIf=\"formData.primary.extJwt.allowed\"\n [title]=\"'Ext JWT Options'\"\n [layout]=\"'column'\"\n >\n <div class=\"form-field-label-container allowed-signers-container\">\n <div class=\"form-field-title-container\">\n <span class=\"form-field-title\">Allowed JWT Signers</span>\n <div\n class=\"form-field-info infoicon\"\n matTooltip=\"Choose which External JWT Signers may be used for authentication\"\n matTooltipPosition=\"below\"\n ></div>\n </div>\n <lib-tag-selector\n [(selectedNamedAttributes)]=\"allowedJwtSignerAttributes\"\n [availableNamedAttributes]=\"svc.jwtSignerNamedAttributes\"\n [placeholder]=\"'Select which External JWT Signers to allow'\"\n (selectedNamedAttributesChange)=\"allowedJwtSignersChanged($event)\"\n ></lib-tag-selector>\n </div>\n </lib-form-field-container>\n <lib-form-field-container\n *ngIf=\"formData.primary.updb.allowed\"\n [title]=\"'UPDB Options'\"\n [layout]=\"'column'\"\n >\n <div class=\"form-field-row updb-input-options\">\n <div class=\"form-field-label-container\">\n <div class=\"form-field-title-container\">\n <span class=\"form-field-title\">Minimum Length</span>\n </div>\n <input class=\"form-field-input\" placeholder=\"Enter a numeric value\" type=\"number\" [(ngModel)]=\"formData.primary.updb.minPasswordLength\"/>\n </div>\n <div class=\"form-field-label-container\">\n <div class=\"form-field-title-container\">\n <span class=\"form-field-title\">Max Attempts</span>\n </div>\n <input class=\"form-field-input\" placeholder=\"Enter a numeric value\" type=\"number\" [(ngModel)]=\"formData.primary.updb.maxAttempts\"/>\n </div>\n <div class=\"form-field-label-container\">\n <div class=\"form-field-title-container\">\n <span class=\"form-field-title\">Lockout Duration <div class=\"form-sub-text\">(min)</div></span>\n </div>\n <input class=\"form-field-input\" placeholder=\"Enter time in min\" type=\"number\" [(ngModel)]=\"formData.primary.updb.lockoutDurationMinutes\"/>\n </div>\n </div>\n <div class=\"form-field-row\">\n <div class=\"config-item\">\n <div class=\"config-container toggle-container\">\n <div class=\"form-field-title-container\">\n <div class=\"config-container-label\">Mixed Case</div>\n <div\n class=\"form-field-info infoicon\"\n matTooltip=\"Require upper and lower case charachters\"\n matTooltipPosition=\"below\"\n ></div>\n </div>\n <div\n (click)=\"toggleUpdbMixed()\"\n [ngClass]=\"{ on: formData.primary.updb.requireMixedCase }\"\n class=\"toggle\"\n >\n <span [hidden]=\"!formData.primary.updb.requireMixedCase\" class=\"on-label\">YES</span>\n <span [hidden]=\"formData.primary.updb.requireMixedCase\" class=\"off-label\">NO</span>\n <div class=\"switch\"></div>\n </div>\n </div>\n </div>\n <div class=\"config-item\">\n <div class=\"config-container toggle-container\">\n <div class=\"form-field-title-container\">\n <div class=\"config-container-label\">Numeric</div>\n <div\n class=\"form-field-info infoicon\"\n matTooltip=\"Require numerical charachters 0-9\"\n matTooltipPosition=\"below\"\n ></div>\n </div>\n <div\n (click)=\"toggleUpdbNumeric()\"\n [ngClass]=\"{ on: formData.primary.updb.requireNumericChar }\"\n class=\"toggle\"\n >\n <span [hidden]=\"!formData.primary.updb.requireNumericChar\" class=\"on-label\">YES</span>\n <span [hidden]=\"formData.primary.updb.requireNumericChar\" class=\"off-label\">NO</span>\n <div class=\"switch\"></div>\n </div>\n </div>\n </div>\n <div class=\"config-item\">\n <div class=\"config-container toggle-container\">\n <div class=\"form-field-title-container\">\n <div class=\"config-container-label\">Special</div>\n <div\n class=\"form-field-info infoicon\"\n matTooltip=\"Require special (non-alpha numeric) charachters. ie. !%$@*\"\n matTooltipPosition=\"below\"\n ></div>\n </div>\n <div\n (click)=\"toggleUpdbSpecial()\"\n [ngClass]=\"{ on: formData.primary.updb.requireSpecialChar }\"\n class=\"toggle\"\n >\n <span [hidden]=\"!formData.primary.updb.requireSpecialChar\" class=\"on-label\">YES</span>\n <span [hidden]=\"formData.primary.updb.requireSpecialChar\" class=\"off-label\">NO</span>\n <div class=\"switch\"></div>\n </div>\n </div>\n </div>\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 >\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]=\"'Secondary Authentication'\"\n [label]=\"'OPTIONAL'\"\n [layout]=\"'column'\"\n [contentStyle]=\"'z-index: 1000001'\"\n >\n <div class=\"form-field-label-container\">\n <div class=\"form-field-title-container\">\n <span class=\"form-field-title\">TOTP MFA</span>\n <div\n class=\"form-field-info infoicon\"\n matTooltip=\"Require authenticating clients to have TOTP MFA enabled (Time-based, One-Time Password)\"\n matTooltipPosition=\"below\"\n ></div>\n </div>\n <div class=\"config-item\">\n <div class=\"config-container toggle-container\">\n <div class=\"form-field-title-container\">\n <div class=\"config-container-label\">Require TOTP</div>\n </div>\n <div\n (click)=\"toggleRequireTotp()\"\n [ngClass]=\"{ on: formData.secondary.requireTotp }\"\n class=\"toggle\"\n >\n <span [hidden]=\"!formData.secondary.requireTotp\" class=\"on-label\">YES</span>\n <span [hidden]=\"formData.secondary.requireTotp\" class=\"off-label\">NO</span>\n <div class=\"switch\"></div>\n </div>\n </div>\n </div>\n </div>\n <div class=\"form-field-label-container\">\n <div class=\"form-field-title-container\">\n <span class=\"form-field-title\">JWT Signer</span>\n <div\n class=\"form-field-info infoicon\"\n matTooltip=\"Require every client request to have a JWT from the specified External JTW Signer in the HTTP Authentication header\"\n matTooltipPosition=\"below\"\n ></div>\n </div>\n <p-dropdown\n placeholder=\"Select JWT Signer...\"\n optionLabel=\"name\"\n optionValue=\"id\"\n filterBy=\"name\"\n [options]=\"svc.jwtSigners\"\n [filter]=\"true\"\n [showClear]=\"true\"\n (change)=\"secondaryJwtSignerChanged($event)\"\n [(ngModel)]=\"formData.secondary.requireExtJwtSigner\"\n >\n <ng-template pTemplate=\"filter\" let-options=\"options\">\n <div class=\"dropdown-filter-container\">\n <div class=\"p-inputgroup\" (click)=\"$event.stopPropagation()\">\n <span class=\"p-inputgroup-addon\"><i class=\"pi pi-search\"></i></span>\n <input\n type=\"text\"\n pInputText\n placeholder=\"Filter\"\n (keyup)=\"jwtSignersFilterChangedDebounced($event)\" />\n </div>\n <button pButton\n icon=\"pi pi-times\"\n [ngClass]=\"{'configs-loading': svc.jwtSignersLoading}\"\n (click)=\"clearJwtSignerFilter($event)\"\n severity=\"secondary\">\n </button>\n <div class=\"spinner\" *ngIf=\"svc.jwtSignersLoading\"></div>\n </div>\n </ng-template>\n </p-dropdown>\n </div>\n </lib-form-field-container>\n <lib-form-field-container\n [title]=\"'API Calls'\"\n [headerActions]=\"apiOptions\"\n (actionRequested)=\"apiActionRequested($event)\"\n [class]=\"'api-data-no-wrap'\"\n >\n <div class=\"form-row\">\n <input class=\"form-field-input\" [value]=\"apiCallURL\"/>\n <div class=\"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: ["@charset \"UTF-8\";.form-group-column.three-fifths{min-width:31.25rem}.jwt-signer-form-container{display:flex;flex-direction:column;height:100%;width:100%;align-items:center;gap:var(--gapXL)}.jwt-signer-form-container .select-file-button{padding-left:var(--paddingMedium);padding-right:var(--paddingMedium);height:1.5625rem;width:-moz-fit-content;width:fit-content;white-space:nowrap;display:flex;align-items:center;justify-content:center;font-weight:600;font-size:.875rem;background:var(--primary);border-style:solid;border-width:.0625rem;border-color:var(--stroke);color:var(--white);cursor:pointer;border-radius:var(--inputBorderRadius);gap:var(--marginMedium);margin-top:-.3125rem}.jwt-signer-form-container .select-file-button:hover{filter:brightness(.8)}.jwt-signer-form-container .select-file-button:active{filter:grayscale(1);transform:translateY(.0625rem)}.jwt-signer-form-container .select-file-button .spinner{display:inline-block;width:.5rem;height:.5rem;border-radius:50%;background:transparent;border-top:.125rem solid white;border-right:.125rem solid white;border-bottom:.125rem solid transparent;border-left:.125rem solid transparent;animation:loading .5s infinite linear}.jwt-signer-form-container .select-file-label-container{gap:var(--marginMedium)}.jwt-signer-form-container .updb-input-options{margin-top:var(--marginSmall);background-color:var(--formGroup);padding:var(--paddingMedium);border-radius:var(--inputBorderRadius)}.jwt-signer-form-container .updb-input-options .form-field-title{color:var(--offWhite)}::ng-deep .jwt-signer-form-container select:disabled,::ng-deep .jwt-signer-form-container input:disabled{opacity:.75!important;cursor:text;background-color:var(--stroke)!important}::ng-deep .api-data-no-wrap .jse-text-mode{width:100%}::ng-deep .api-data-no-wrap .jse-text-mode .cm-editor{width:100%}::ng-deep .api-data-no-wrap .jse-text-mode .cm-editor .cm-scroller{width:100%}::ng-deep .api-data-no-wrap .jse-text-mode .cm-editor .cm-scroller .cm-content{width:100%;overflow:auto}::ng-deep .api-data-no-wrap .jse-text-mode .cm-editor .cm-scroller .cm-content .\\37cr{white-space:nowrap}.radio-group-container{display:flex;gap:var(--marginLarge)}.radio-group-container:focus .radio-button-container .radio-button-circle{border-color:var(--primaryColor)}.radio-group-container .radio-button-container{display:flex;flex-direction:row;align-items:center;background-color:var(--formGroup);border-radius:var(--inputBorderRadius);width:100%;padding-left:var(--paddingMedium);padding-right:var(--paddingMedium);padding-top:var(--paddingLarge);padding-bottom:var(--paddingLarge);cursor:pointer;gap:var(--marginMedium)}.radio-group-container .radio-button-container .radio-button-circle{display:flex;width:1.3125rem;height:1.3125rem;border-radius:1.3125rem;border-width:.125rem;border-style:solid;border-color:var(--offWhite);align-items:center;justify-content:center;background-color:var(--offWhite)}.radio-group-container .radio-button-container .radio-button-circle .radio-button-inner-circle{display:none;width:.9375rem;height:.9375rem;border-radius:.9375rem;align-items:center;justify-content:center;background-color:var(--primaryColor)}.radio-group-container .radio-button-container.selected .radio-button-circle .radio-button-inner-circle{display:flex}.radio-group-container .radio-button-container:active .radio-button-circle .radio-button-inner-circle{display:flex;background-color:var(--menu)}.radio-group-container .radio-button-container .radio-button-label{color:var(--offWhite);font-size:.875rem;font-weight:600}.allowed-signers-container{background-color:var(--formGroup);padding:var(--paddingMedium);border-radius:var(--inputBorderRadius)}.allowed-signers-container .form-field-title{color:var(--offWhite)}\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: 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"] }, { kind: "directive", type: i6$1.InputText, selector: "[pInputText]" }, { kind: "directive", type: i9.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "directive", type: i8.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading"] }, { kind: "directive", type: i3.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "component", type: i4$2.Dropdown, selector: "p-dropdown", inputs: ["id", "scrollHeight", "filter", "name", "style", "panelStyle", "styleClass", "panelStyleClass", "readonly", "required", "editable", "appendTo", "tabindex", "placeholder", "filterPlaceholder", "filterLocale", "inputId", "dataKey", "filterBy", "filterFields", "autofocus", "resetFilterOnHide", "dropdownIcon", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "autoDisplayFirst", "group", "showClear", "emptyFilterMessage", "emptyMessage", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "ariaLabel", "ariaLabelledBy", "filterMatchMode", "maxlength", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "focusOnHover", "selectOnFocus", "autoOptionFocus", "autofocusFilter", "disabled", "itemSize", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "filterValue", "options"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onShow", "onHide", "onClear", "onLazyLoad"] }, { kind: "component", type: FormHeaderComponent, selector: "lib-form-header", inputs: ["data", "badges", "title", "moreActions", "formView", "saveDisabled", "saveTooltip", "actionButtonText", "moreActionsText", "showHeaderToggle", "showHeaderButton"], 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", "contentClass", "showHeader", "showToggle", "headerActions", "headerToggle"], outputs: ["actionRequested", "headerToggleChange"] }, { 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: TagSelectorComponent, selector: "lib-tag-selector", inputs: ["placeholder", "disableField", "disableCreate", "hideOption", "isLoading", "errorMessage", "focusOnInit", "selectedRoleAttributes", "selectedNamedAttributes", "hasError", "availableRoleAttributes", "availableNamedAttributes"], outputs: ["addRoleAttribute", "addNamedAttribute", "roleAttributeRemoved", "namedAttributeRemoved", "selectedRoleAttributesChange", "selectedNamedAttributesChange", "filterChange"] }, { kind: "component", type: CustomTagsComponent, selector: "lib-custom-tags", inputs: ["tags"], outputs: ["tagsChange"] }] }); }
23860
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: AuthPolicyFormComponent, selector: "lib-configuration", inputs: { formData: "formData", errors: "errors" }, outputs: { close: "close" }, viewQueries: [{ propertyName: "filterInput", first: true, predicate: ["fileSelect"], descendants: true }], 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 ? 'Auth Policy Details' : 'Create Auth Policy')\"\n [moreActions]=\"formData.moreActions\"\n (actionRequested)=\"headerActionRequested($event)\"\n [(formView)]=\"formView\"\n [saveDisabled]=\"svc.saveDisabled || formDataInvalid\"\n ></lib-form-header>\n <div class=\"jwt-signer-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\n [title]=\"'Name'\"\n [label]=\"'Required'\"\n >\n <input class=\"form-field-input read-only\" [(ngModel)]=\"formData.name\" [ngClass]=\"{error: errors['name']}\" placeholder=\"Name this Auth Policy\"/>\n </lib-form-field-container>\n <lib-form-field-container\n [title]=\"'Primary Authentication'\"\n [layout]=\"'row'\"\n >\n <div class=\"config-item\">\n <div class=\"config-container toggle-container\">\n <div class=\"form-field-title-container\">\n <div class=\"config-container-label\">Cert</div>\n <div\n class=\"form-field-info infoicon\"\n matTooltip=\"Allow x509 certificate based authentication\"\n matTooltipPosition=\"below\"\n ></div>\n </div>\n <div\n (click)=\"toggleCertAllowed()\"\n [ngClass]=\"{ on: formData.primary.cert.allowed }\"\n class=\"toggle\"\n >\n <span [hidden]=\"!formData.primary.cert.allowed\" class=\"on-label\">YES</span>\n <span [hidden]=\"formData.primary.cert.allowed\" class=\"off-label\">NO</span>\n <div class=\"switch\"></div>\n </div>\n </div>\n </div>\n <div class=\"config-item\">\n <div class=\"config-container toggle-container\">\n <div class=\"form-field-title-container\">\n <div class=\"config-container-label\">Ext JWT</div>\n <div\n class=\"form-field-info infoicon\"\n matTooltip=\"Allow externally signed JWT bearer tokens\"\n matTooltipPosition=\"below\"\n ></div>\n </div>\n <div\n (click)=\"toggleExtJwtAllowed()\"\n [ngClass]=\"{ on: formData.primary.extJwt.allowed }\"\n class=\"toggle\"\n >\n <span [hidden]=\"!formData.primary.extJwt.allowed\" class=\"on-label\">YES</span>\n <span [hidden]=\"formData.primary.extJwt.allowed\" class=\"off-label\">NO</span>\n <div class=\"switch\"></div>\n </div>\n </div>\n </div>\n <div class=\"config-item\">\n <div class=\"config-container toggle-container\">\n <div class=\"form-field-title-container\">\n <div class=\"config-container-label\">UPDB</div>\n <div\n class=\"form-field-info infoicon\"\n matTooltip=\"Allow authentication via a traditional &quot;Username Password Database&quot;\"\n matTooltipPosition=\"below\"\n ></div>\n </div>\n <div\n (click)=\"toggleUpdbAllowed()\"\n [ngClass]=\"{ on: formData.primary.updb.allowed }\"\n class=\"toggle\"\n >\n <span [hidden]=\"!formData.primary.updb.allowed\" class=\"on-label\">YES</span>\n <span [hidden]=\"formData.primary.updb.allowed\" class=\"off-label\">NO</span>\n <div class=\"switch\"></div>\n </div>\n </div>\n </div>\n </lib-form-field-container>\n <lib-form-field-container\n *ngIf=\"formData.primary.cert.allowed\"\n [title]=\"'Cert Options'\"\n [layout]=\"'row'\"\n >\n <div class=\"config-item\">\n <div class=\"config-container toggle-container\">\n <div class=\"form-field-title-container\">\n <div class=\"config-container-label\">Allow Expired Certificates</div>\n <div\n class=\"form-field-info infoicon\"\n matTooltip=\"Allow expired client certificates to authenticate\"\n matTooltipPosition=\"below\"\n ></div>\n </div>\n <div\n (click)=\"toggleAllowExpiredCerts()\"\n [ngClass]=\"{ on: formData.primary.cert.allowExpiredCerts }\"\n class=\"toggle\"\n >\n <span [hidden]=\"!formData.primary.cert.allowExpiredCerts\" class=\"on-label\">YES</span>\n <span [hidden]=\"formData.primary.cert.allowExpiredCerts\" class=\"off-label\">NO</span>\n <div class=\"switch\"></div>\n </div>\n </div>\n </div>\n </lib-form-field-container>\n <lib-form-field-container\n *ngIf=\"formData.primary.extJwt.allowed\"\n [title]=\"'Ext JWT Options'\"\n [layout]=\"'column'\"\n >\n <div class=\"form-field-label-container allowed-signers-container\">\n <div class=\"form-field-title-container\">\n <span class=\"form-field-title\">Allowed JWT Signers</span>\n <div\n class=\"form-field-info infoicon\"\n matTooltip=\"Choose which External JWT Signers may be used for authentication\"\n matTooltipPosition=\"below\"\n ></div>\n </div>\n <lib-tag-selector\n [(selectedNamedAttributes)]=\"allowedJwtSignerAttributes\"\n [availableNamedAttributes]=\"svc.jwtSignerNamedAttributes\"\n [placeholder]=\"'Select which External JWT Signers to allow'\"\n (selectedNamedAttributesChange)=\"allowedJwtSignersChanged($event)\"\n ></lib-tag-selector>\n </div>\n </lib-form-field-container>\n <lib-form-field-container\n *ngIf=\"formData.primary.updb.allowed\"\n [title]=\"'UPDB Options'\"\n [layout]=\"'column'\"\n >\n <div class=\"form-field-row updb-input-options\">\n <div class=\"form-field-label-container\">\n <div class=\"form-field-title-container\">\n <span class=\"form-field-title\">Minimum Length</span>\n </div>\n <input class=\"form-field-input\" placeholder=\"Enter a numeric value\" type=\"number\" [(ngModel)]=\"formData.primary.updb.minPasswordLength\"/>\n </div>\n <div class=\"form-field-label-container\">\n <div class=\"form-field-title-container\">\n <span class=\"form-field-title\">Max Attempts</span>\n </div>\n <input class=\"form-field-input\" placeholder=\"Enter a numeric value\" type=\"number\" [(ngModel)]=\"formData.primary.updb.maxAttempts\"/>\n </div>\n <div class=\"form-field-label-container\">\n <div class=\"form-field-title-container\">\n <span class=\"form-field-title\">Lockout Duration <div class=\"form-sub-text\">(min)</div></span>\n </div>\n <input class=\"form-field-input\" placeholder=\"Enter time in min\" type=\"number\" [(ngModel)]=\"formData.primary.updb.lockoutDurationMinutes\"/>\n </div>\n </div>\n <div class=\"form-field-row\">\n <div class=\"config-item\">\n <div class=\"config-container toggle-container\">\n <div class=\"form-field-title-container\">\n <div class=\"config-container-label\">Mixed Case</div>\n <div\n class=\"form-field-info infoicon\"\n matTooltip=\"Require upper and lower case charachters\"\n matTooltipPosition=\"below\"\n ></div>\n </div>\n <div\n (click)=\"toggleUpdbMixed()\"\n [ngClass]=\"{ on: formData.primary.updb.requireMixedCase }\"\n class=\"toggle\"\n >\n <span [hidden]=\"!formData.primary.updb.requireMixedCase\" class=\"on-label\">YES</span>\n <span [hidden]=\"formData.primary.updb.requireMixedCase\" class=\"off-label\">NO</span>\n <div class=\"switch\"></div>\n </div>\n </div>\n </div>\n <div class=\"config-item\">\n <div class=\"config-container toggle-container\">\n <div class=\"form-field-title-container\">\n <div class=\"config-container-label\">Numeric</div>\n <div\n class=\"form-field-info infoicon\"\n matTooltip=\"Require numerical charachters 0-9\"\n matTooltipPosition=\"below\"\n ></div>\n </div>\n <div\n (click)=\"toggleUpdbNumeric()\"\n [ngClass]=\"{ on: formData.primary.updb.requireNumericChar }\"\n class=\"toggle\"\n >\n <span [hidden]=\"!formData.primary.updb.requireNumericChar\" class=\"on-label\">YES</span>\n <span [hidden]=\"formData.primary.updb.requireNumericChar\" class=\"off-label\">NO</span>\n <div class=\"switch\"></div>\n </div>\n </div>\n </div>\n <div class=\"config-item\">\n <div class=\"config-container toggle-container\">\n <div class=\"form-field-title-container\">\n <div class=\"config-container-label\">Special</div>\n <div\n class=\"form-field-info infoicon\"\n matTooltip=\"Require special (non-alpha numeric) charachters. ie. !%$@*\"\n matTooltipPosition=\"below\"\n ></div>\n </div>\n <div\n (click)=\"toggleUpdbSpecial()\"\n [ngClass]=\"{ on: formData.primary.updb.requireSpecialChar }\"\n class=\"toggle\"\n >\n <span [hidden]=\"!formData.primary.updb.requireSpecialChar\" class=\"on-label\">YES</span>\n <span [hidden]=\"formData.primary.updb.requireSpecialChar\" class=\"off-label\">NO</span>\n <div class=\"switch\"></div>\n </div>\n </div>\n </div>\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 >\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]=\"'Secondary Authentication'\"\n [label]=\"'OPTIONAL'\"\n [layout]=\"'column'\"\n [contentStyle]=\"'z-index: 1000001'\"\n >\n <div class=\"form-field-label-container\">\n <div class=\"form-field-title-container\">\n <span class=\"form-field-title\">TOTP MFA</span>\n <div\n class=\"form-field-info infoicon\"\n matTooltip=\"Require authenticating clients to have TOTP MFA enabled (Time-based, One-Time Password)\"\n matTooltipPosition=\"below\"\n ></div>\n </div>\n <div class=\"config-item\">\n <div class=\"config-container toggle-container\">\n <div class=\"form-field-title-container\">\n <div class=\"config-container-label\">Require TOTP</div>\n </div>\n <div\n (click)=\"toggleRequireTotp()\"\n [ngClass]=\"{ on: formData.secondary.requireTotp }\"\n class=\"toggle\"\n >\n <span [hidden]=\"!formData.secondary.requireTotp\" class=\"on-label\">YES</span>\n <span [hidden]=\"formData.secondary.requireTotp\" class=\"off-label\">NO</span>\n <div class=\"switch\"></div>\n </div>\n </div>\n </div>\n </div>\n <div class=\"form-field-label-container\">\n <div class=\"form-field-title-container\">\n <span class=\"form-field-title\">JWT Signer</span>\n <div\n class=\"form-field-info infoicon\"\n matTooltip=\"Require every client request to have a JWT from the specified External JTW Signer in the HTTP Authentication header\"\n matTooltipPosition=\"below\"\n ></div>\n </div>\n <p-dropdown\n placeholder=\"Select JWT Signer...\"\n optionLabel=\"name\"\n optionValue=\"id\"\n filterBy=\"name\"\n [options]=\"svc.jwtSigners\"\n [filter]=\"true\"\n [showClear]=\"true\"\n (change)=\"secondaryJwtSignerChanged($event)\"\n [(ngModel)]=\"formData.secondary.requireExtJwtSigner\"\n >\n <ng-template pTemplate=\"filter\" let-options=\"options\">\n <div class=\"dropdown-filter-container\">\n <div class=\"p-inputgroup\" (click)=\"$event.stopPropagation()\">\n <span class=\"p-inputgroup-addon\"><i class=\"pi pi-search\"></i></span>\n <input\n type=\"text\"\n pInputText\n placeholder=\"Filter\"\n (keyup)=\"jwtSignersFilterChangedDebounced($event)\" />\n </div>\n <button pButton\n icon=\"pi pi-times\"\n [ngClass]=\"{'configs-loading': svc.jwtSignersLoading}\"\n (click)=\"clearJwtSignerFilter($event)\"\n severity=\"secondary\">\n </button>\n <div class=\"spinner\" *ngIf=\"svc.jwtSignersLoading\"></div>\n </div>\n </ng-template>\n </p-dropdown>\n </div>\n </lib-form-field-container>\n <lib-form-field-container\n [title]=\"'API Calls'\"\n [headerActions]=\"apiOptions\"\n (actionRequested)=\"apiActionRequested($event)\"\n [class]=\"'api-data-no-wrap'\"\n >\n <div class=\"form-row\">\n <input class=\"form-field-input\" [value]=\"apiCallURL\"/>\n <div class=\"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: ["@charset \"UTF-8\";.form-group-column.three-fifths{min-width:31.25rem}.jwt-signer-form-container{display:flex;flex-direction:column;height:100%;width:100%;align-items:center;gap:var(--gapXL)}.jwt-signer-form-container .select-file-button{padding-left:var(--paddingMedium);padding-right:var(--paddingMedium);height:1.5625rem;width:-moz-fit-content;width:fit-content;white-space:nowrap;display:flex;align-items:center;justify-content:center;font-weight:600;font-size:.875rem;background:var(--primary);border-style:solid;border-width:.0625rem;border-color:var(--stroke);color:var(--white);cursor:pointer;border-radius:var(--inputBorderRadius);gap:var(--marginMedium);margin-top:-.3125rem}.jwt-signer-form-container .select-file-button:hover{filter:brightness(.8)}.jwt-signer-form-container .select-file-button:active{filter:grayscale(1);transform:translateY(.0625rem)}.jwt-signer-form-container .select-file-button .spinner{display:inline-block;width:.5rem;height:.5rem;border-radius:50%;background:transparent;border-top:.125rem solid white;border-right:.125rem solid white;border-bottom:.125rem solid transparent;border-left:.125rem solid transparent;animation:loading .5s infinite linear}.jwt-signer-form-container .select-file-label-container{gap:var(--marginMedium)}.jwt-signer-form-container .updb-input-options{margin-top:var(--marginSmall);background-color:var(--formGroup);padding:var(--paddingMedium);border-radius:var(--inputBorderRadius)}.jwt-signer-form-container .updb-input-options .form-field-title{color:var(--offWhite)}::ng-deep .jwt-signer-form-container select:disabled,::ng-deep .jwt-signer-form-container input:disabled{opacity:.75!important;cursor:text;background-color:var(--stroke)!important}::ng-deep .api-data-no-wrap .jse-text-mode{width:100%}::ng-deep .api-data-no-wrap .jse-text-mode .cm-editor{width:100%}::ng-deep .api-data-no-wrap .jse-text-mode .cm-editor .cm-scroller{width:100%}::ng-deep .api-data-no-wrap .jse-text-mode .cm-editor .cm-scroller .cm-content{width:100%;overflow:auto}::ng-deep .api-data-no-wrap .jse-text-mode .cm-editor .cm-scroller .cm-content .\\37cr{white-space:nowrap}.radio-group-container{display:flex;gap:var(--marginLarge)}.radio-group-container:focus .radio-button-container .radio-button-circle{border-color:var(--primaryColor)}.radio-group-container .radio-button-container{display:flex;flex-direction:row;align-items:center;background-color:var(--formGroup);border-radius:var(--inputBorderRadius);width:100%;padding-left:var(--paddingMedium);padding-right:var(--paddingMedium);padding-top:var(--paddingLarge);padding-bottom:var(--paddingLarge);cursor:pointer;gap:var(--marginMedium)}.radio-group-container .radio-button-container .radio-button-circle{display:flex;width:1.3125rem;height:1.3125rem;border-radius:1.3125rem;border-width:.125rem;border-style:solid;border-color:var(--offWhite);align-items:center;justify-content:center;background-color:var(--offWhite)}.radio-group-container .radio-button-container .radio-button-circle .radio-button-inner-circle{display:none;width:.9375rem;height:.9375rem;border-radius:.9375rem;align-items:center;justify-content:center;background-color:var(--primaryColor)}.radio-group-container .radio-button-container.selected .radio-button-circle .radio-button-inner-circle{display:flex}.radio-group-container .radio-button-container:active .radio-button-circle .radio-button-inner-circle{display:flex;background-color:var(--menu)}.radio-group-container .radio-button-container .radio-button-label{color:var(--offWhite);font-size:.875rem;font-weight:600}.allowed-signers-container{background-color:var(--formGroup);padding:var(--paddingMedium);border-radius:var(--inputBorderRadius)}.allowed-signers-container .form-field-title{color:var(--offWhite)}\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: 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"] }, { kind: "directive", type: i6$1.InputText, selector: "[pInputText]" }, { kind: "directive", type: i9.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "directive", type: i8.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading"] }, { kind: "directive", type: i3.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "component", type: i4$2.Dropdown, selector: "p-dropdown", inputs: ["id", "scrollHeight", "filter", "name", "style", "panelStyle", "styleClass", "panelStyleClass", "readonly", "required", "editable", "appendTo", "tabindex", "placeholder", "filterPlaceholder", "filterLocale", "inputId", "dataKey", "filterBy", "filterFields", "autofocus", "resetFilterOnHide", "dropdownIcon", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "autoDisplayFirst", "group", "showClear", "emptyFilterMessage", "emptyMessage", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "ariaLabel", "ariaLabelledBy", "filterMatchMode", "maxlength", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "focusOnHover", "selectOnFocus", "autoOptionFocus", "autofocusFilter", "disabled", "itemSize", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "filterValue", "options"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onShow", "onHide", "onClear", "onLazyLoad"] }, { kind: "component", type: FormHeaderComponent, selector: "lib-form-header", inputs: ["data", "badges", "title", "moreActions", "formView", "saveDisabled", "saveTooltip", "actionButtonText", "moreActionsText", "showHeaderToggle", "showHeaderButton"], 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", "contentClass", "showHeader", "showToggle", "headerActions", "headerToggle"], outputs: ["actionRequested", "headerToggleChange"] }, { 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", "showLineNumbers"], outputs: ["dataChange", "jsonChange", "jsonInvalidChange"] }, { kind: "component", type: TagSelectorComponent, selector: "lib-tag-selector", inputs: ["placeholder", "disableField", "disableCreate", "hideOption", "isLoading", "errorMessage", "focusOnInit", "selectedRoleAttributes", "selectedNamedAttributes", "hasError", "availableRoleAttributes", "availableNamedAttributes"], outputs: ["addRoleAttribute", "addNamedAttribute", "roleAttributeRemoved", "namedAttributeRemoved", "selectedRoleAttributesChange", "selectedNamedAttributesChange", "filterChange"] }, { kind: "component", type: CustomTagsComponent, selector: "lib-custom-tags", inputs: ["tags"], outputs: ["tagsChange"] }] }); }
23670
23861
  }
23671
23862
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AuthPolicyFormComponent, decorators: [{
23672
23863
  type: Component,
@@ -24474,7 +24665,7 @@ class CertificateAuthorityFormComponent extends ProjectableForm {
24474
24665
  this.formData.externalIdClaim.parserCriteria = parserCriteria;
24475
24666
  }
24476
24667
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: CertificateAuthorityFormComponent, deps: [{ token: CertificateAuthorityFormService }, { token: SchemaService }, { token: GrowlerService }, { token: SHAREDZ_EXTENSION }, { token: SETTINGS_SERVICE }, { token: ZITI_DATA_SERVICE }, { token: i4.Router }, { token: i4.ActivatedRoute }, { token: i1$4.Location }, { token: ValidationService }], target: i0.ɵɵFactoryTarget.Component }); }
24477
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: CertificateAuthorityFormComponent, selector: "lib-certificate-authority", inputs: { formData: "formData", errors: "errors" }, outputs: { close: "close" }, viewQueries: [{ propertyName: "filterInput", first: true, predicate: ["fileSelect"], descendants: true }], 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 ? 'Certificate Authority Details' : 'Create Certificate Authority')\"\n [moreActions]=\"formData.moreActions\"\n (actionRequested)=\"headerActionRequested($event)\"\n [(formView)]=\"formView\"\n [saveDisabled]=\"svc.saveDisabled || formDataInvalid\"\n [badges]=\"badges\"\n ></lib-form-header>\n <div class=\"jwt-signer-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\n [title]=\"'Name'\"\n [label]=\"'Required'\"\n >\n <input class=\"form-field-input read-only\" [(ngModel)]=\"formData.name\" [ngClass]=\"{error: errors['name']}\" placeholder=\"Name this Certificate Authority\"/>\n </lib-form-field-container>\n <lib-form-field-container\n [title]=\"'Identity Name Format'\"\n [contentStyle]=\"'z-index: 99999999'\"\n [label]=\"'OPTIONAL'\"\n [helpText]=\"'The identity name format used to name automatically enrolling identities. Defaults to [caName]-[commonName]'\"\n >\n <input class=\"form-field-input read-only\" [(ngModel)]=\"formData.identityNameFormat\" [ngClass]=\"{error: errors['identityNameFormat']}\" placeholder=\"Defaults to [caName]-[commonName]\"/>\n </lib-form-field-container>\n <lib-form-field-container\n [title]=\"'Identity Roles'\"\n [contentStyle]=\"'z-index: 99999999'\"\n [label]=\"'OPTIONAL'\"\n [helpText]=\"'The identity roles to give to automatically enrolling identities'\"\n >\n <lib-tag-selector\n [(selectedRoleAttributes)]=\"formData.identityRoles\"\n [availableRoleAttributes]=\"identityRoleAttributes\"\n [placeholder]=\"'Type to filter and enter to assign'\"\n [hasError]=\"errors.dialIdentities\"\n ></lib-tag-selector>\n </lib-form-field-container>\n <lib-form-field-container\n [title]=\"'Enrollment Options'\"\n [layout]=\"'row'\"\n >\n <div class=\"config-item\">\n <div class=\"config-container toggle-container\">\n <div class=\"form-field-title-container\">\n <div class=\"config-container-label\">Auto Enroll</div>\n <div\n class=\"form-field-info infoicon\"\n matTooltip=\"Allows client certificates of the CA to automatically enroll when encountered\"\n matTooltipPosition=\"below\"\n ></div>\n </div>\n <div\n (click)=\"toggleSwitch('isAutoCaEnrollmentEnabled')\"\n [ngClass]=\"{ on: formData.isAutoCaEnrollmentEnabled }\"\n class=\"toggle\"\n >\n <span [hidden]=\"!formData.isAutoCaEnrollmentEnabled\" class=\"on-label\">YES</span>\n <span [hidden]=\"formData.isAutoCaEnrollmentEnabled\" class=\"off-label\">NO</span>\n <div class=\"switch\"></div>\n </div>\n </div>\n </div>\n <div class=\"config-item\">\n <div class=\"config-container toggle-container\">\n <div class=\"form-field-title-container\">\n <div class=\"config-container-label\">OTT Enroll</div>\n <div\n class=\"form-field-info infoicon\"\n matTooltip=\"Allows client certificates of the CA to enroll if an identity with an ottca enrollment was created\"\n matTooltipPosition=\"below\"\n ></div>\n </div>\n <div\n (click)=\"toggleSwitch('isOttCaEnrollmentEnabled')\"\n [ngClass]=\"{ on: formData.isOttCaEnrollmentEnabled }\"\n class=\"toggle\"\n >\n <span [hidden]=\"!formData.isOttCaEnrollmentEnabled\" class=\"on-label\">YES</span>\n <span [hidden]=\"formData.isOttCaEnrollmentEnabled\" class=\"off-label\">NO</span>\n <div class=\"switch\"></div>\n </div>\n </div>\n </div>\n <div class=\"config-item\">\n <div class=\"config-container toggle-container\">\n <div class=\"form-field-title-container\">\n <div class=\"config-container-label\">Auth Enabled</div>\n <div\n class=\"form-field-info infoicon\"\n matTooltip=\"Allows client certificates of the CA to attempt to enroll\"\n matTooltipPosition=\"below\"\n ></div>\n </div>\n <div\n (click)=\"toggleSwitch('isAuthEnabled')\"\n [ngClass]=\"{ on: formData.isAuthEnabled }\"\n class=\"toggle\"\n >\n <span [hidden]=\"!formData.isAuthEnabled\" class=\"on-label\">YES</span>\n <span [hidden]=\"formData.isAuthEnabled\" class=\"off-label\">NO</span>\n <div class=\"switch\"></div>\n </div>\n </div>\n </div>\n </lib-form-field-container>\n <lib-form-field-container\n [title]=\"'External ID Claim'\"\n [layout]=\"'column'\"\n [helpText]=\"'Configuration used to pull values out of the x509 client certificate used to match identity externalId'\"\n [showToggle]=\"true\"\n [(headerToggle)]=\"externalIdClaim\"\n (headerToggleChange)=\"externalIdClaimChanged()\"\n >\n <div class=\"form-field-input-group\" [ngClass]=\"{disabled: !externalIdClaim}\">\n <div class=\"form-field-row\">\n <div class=\"form-field-label-container\">\n <div class=\"form-field-title-container\">\n <span class=\"form-field-title\">Location</span>\n <div\n class=\"form-field-info infoicon\"\n matTooltip=\"Defines which value(s) in an x509 certificate will be processed\"\n matTooltipPosition=\"below\"\n ></div>\n </div>\n <select [(ngModel)]=\"claimLocation\" id=\"ClaimLocation\" class=\"form-field-dropdown\" [disabled]=\"!externalIdClaim\" [ngClass]=\"{error: errors['claimLocation']}\">\n <option value=\"\">Select an option</option>\n <option *ngFor=\"let loc of locations\" [value]=\"loc\">\n {{ loc }}\n </option>\n </select>\n </div>\n <div class=\"form-field-label-container\">\n <div class=\"form-field-title-container\">\n <span class=\"form-field-title\">Matcher</span>\n <div\n class=\"form-field-info infoicon\"\n matTooltip=\"Defines how values from location will be filtered\"\n matTooltipPosition=\"below\"\n ></div>\n </div>\n <select [(ngModel)]=\"matcher\" id=\"ClaimMatcher\" class=\"form-field-dropdown\" [disabled]=\"!externalIdClaim\" [ngClass]=\"{error: errors['matcher']}\">\n <option value=\"\">Select an option</option>\n <option *ngFor=\"let matcher of matchers\" [value]=\"matcher\">\n {{ matcher }}\n </option>\n </select>\n </div>\n <div class=\"form-field-label-container\">\n <div class=\"form-field-title-container\">\n <span class=\"form-field-title\">Parser</span>\n <div\n class=\"form-field-info infoicon\"\n matTooltip=\"Defines how values from location filtered by matcher will be parsed\"\n matTooltipPosition=\"below\"\n ></div>\n </div>\n <select [(ngModel)]=\"parser\" id=\"ClaimParser\" class=\"form-field-dropdown\" [disabled]=\"!externalIdClaim\" [ngClass]=\"{error: errors['parser']}\">\n <option value=\"\">Select an option</option>\n <option *ngFor=\"let parser of parsers\" [value]=\"parser\">\n {{ parser }}\n </option>\n </select>\n </div>\n </div>\n <div class=\"form-field-row\">\n <div class=\"form-field-label-container\">\n <div class=\"form-field-title-container\">\n <span class=\"form-field-title\">Index</span>\n <div\n class=\"form-field-info infoicon\"\n matTooltip=\"Should multiple values still be available after location, matcher, and parser processing the integer value here will be used from the set\"\n matTooltipPosition=\"below\"\n ></div>\n </div>\n <input class=\"form-field-input\" type=\"number\" placeholder=\"Enter a number\" [(ngModel)]=\"index\" [ngClass]=\"{error: errors['index']}\" [disabled]=\"!externalIdClaim\"/>\n </div>\n <div class=\"form-field-label-container\">\n <div class=\"form-field-title-container\">\n <span class=\"form-field-title\">Match Criteria</span>\n <div\n class=\"form-field-info infoicon\"\n matTooltip=\"Defines the PREFIX, SUFFIX, or SCHEME to look for based on matcher\"\n matTooltipPosition=\"below\"\n ></div>\n </div>\n <input class=\"form-field-input\" placeholder=\"Enter matcher criteria\" [(ngModel)]=\"matcherCriteria\" [ngClass]=\"{error: errors['matcherCriteria']}\" [disabled]=\"!externalIdClaim\"/>\n </div>\n <div class=\"form-field-label-container\">\n <div class=\"form-field-title-container\">\n <span class=\"form-field-title\">Parser Criteria</span>\n <div\n class=\"form-field-info infoicon\"\n matTooltip=\"Defines the criteria to provide to parser\"\n matTooltipPosition=\"below\"\n ></div>\n </div>\n <input class=\"form-field-input\" placeholder=\"Enter parser criteria\" [(ngModel)]=\"parserCriteria\" [ngClass]=\"{error: errors['parserCriteria']}\" [disabled]=\"!externalIdClaim\"/>\n </div>\n </div>\n </div>\n </lib-form-field-container>\n <lib-form-field-container\n [title]=\"'PEM'\"\n [label]=\"'REQUIRED'\"\n >\n <div class=\"form-field-input-group\">\n <div class=\"form-field-label-container select-file-label-container\">\n <div class=\"form-field-header\">\n <div class=\"form-field-title-container\">\n <span class=\"form-field-title\">Enter PEM</span>\n </div>\n <span class=\"select-file-button\" (click)=\"openFileSelect($event)\">\n Select File\n <div class=\"spinner\" *ngIf=\"fileSelectOpening\"></div>\n </span>\n <input #fileSelect type=\"file\" style=\"display:none\" (change)=\"selectPemFile($event)\">\n </div>\n <textarea placeholder=\"Paste pem contents or select file\" [(ngModel)]=\"formData.certPem\" [ngClass]=\"{error: errors['certPem']}\"></textarea>\n </div>\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 >\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 *ngIf=\"formData.id && !this.formData.isVerified\"\n [showHeader]=\"false\"\n >\n <a class=\"download-button\" href=\"./{{this.basePath}}/{{this.formData.id}}/verify\" (click)=\"verifyCertificate($event)\">\n <div class=\"verify-certificate\"></div>\n <span>Verify Certificate</span>\n <div class=\"tap-to-download\"></div>\n </a>\n </lib-form-field-container>\n <lib-form-field-container\n [title]=\"'API Calls'\"\n [headerActions]=\"apiOptions\"\n (actionRequested)=\"apiActionRequested($event)\"\n [class]=\"'api-data-no-wrap'\"\n >\n <div class=\"form-row\">\n <input class=\"form-field-input\" [value]=\"apiCallURL\"/>\n <div class=\"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: ["@charset \"UTF-8\";.form-group-column.three-fifths{min-width:31.25rem}.jwt-signer-form-container{display:flex;flex-direction:column;height:100%;width:100%;align-items:center;gap:var(--gapXL)}.jwt-signer-form-container .select-file-button{padding-left:var(--paddingMedium);padding-right:var(--paddingMedium);height:1.5625rem;width:-moz-fit-content;width:fit-content;white-space:nowrap;display:flex;align-items:center;justify-content:center;font-weight:600;font-size:.875rem;background:var(--primary);border-style:solid;border-width:.0625rem;border-color:var(--stroke);color:var(--white);cursor:pointer;border-radius:var(--inputBorderRadius);gap:var(--marginMedium);margin-top:-.3125rem}.jwt-signer-form-container .select-file-button:hover{filter:brightness(.8)}.jwt-signer-form-container .select-file-button:active{filter:grayscale(1);transform:translateY(.0625rem)}.jwt-signer-form-container .select-file-button .spinner{display:inline-block;width:.5rem;height:.5rem;border-radius:50%;background:transparent;border-top:.125rem solid white;border-right:.125rem solid white;border-bottom:.125rem solid transparent;border-left:.125rem solid transparent;animation:loading .5s infinite linear}.jwt-signer-form-container .select-file-label-container{gap:var(--marginMedium)}.jwt-signer-form-container .updb-input-options{margin-top:var(--marginSmall);background-color:var(--formGroup);padding:var(--paddingMedium);border-radius:var(--inputBorderRadius)}.jwt-signer-form-container .updb-input-options .form-field-title{color:var(--offWhite)}::ng-deep .jwt-signer-form-container select:disabled,::ng-deep .jwt-signer-form-container input:disabled{opacity:.75!important;cursor:text;background-color:var(--stroke)!important}::ng-deep .api-data-no-wrap .jse-text-mode{width:100%}::ng-deep .api-data-no-wrap .jse-text-mode .cm-editor{width:100%}::ng-deep .api-data-no-wrap .jse-text-mode .cm-editor .cm-scroller{width:100%}::ng-deep .api-data-no-wrap .jse-text-mode .cm-editor .cm-scroller .cm-content{width:100%;overflow:auto}::ng-deep .api-data-no-wrap .jse-text-mode .cm-editor .cm-scroller .cm-content .\\37cr{white-space:nowrap}.radio-group-container{display:flex;gap:var(--marginLarge)}.radio-group-container:focus .radio-button-container .radio-button-circle{border-color:var(--primaryColor)}.radio-group-container .radio-button-container{display:flex;flex-direction:row;align-items:center;background-color:var(--formGroup);border-radius:var(--inputBorderRadius);width:100%;padding-left:var(--paddingMedium);padding-right:var(--paddingMedium);padding-top:var(--paddingLarge);padding-bottom:var(--paddingLarge);cursor:pointer;gap:var(--marginMedium)}.radio-group-container .radio-button-container .radio-button-circle{display:flex;width:1.3125rem;height:1.3125rem;border-radius:1.3125rem;border-width:.125rem;border-style:solid;border-color:var(--offWhite);align-items:center;justify-content:center;background-color:var(--offWhite)}.radio-group-container .radio-button-container .radio-button-circle .radio-button-inner-circle{display:none;width:.9375rem;height:.9375rem;border-radius:.9375rem;align-items:center;justify-content:center;background-color:var(--primaryColor)}.radio-group-container .radio-button-container.selected .radio-button-circle .radio-button-inner-circle{display:flex}.radio-group-container .radio-button-container:active .radio-button-circle .radio-button-inner-circle{display:flex;background-color:var(--menu)}.radio-group-container .radio-button-container .radio-button-label{color:var(--offWhite);font-size:.875rem;font-weight:600}.allowed-signers-container{background-color:var(--formGroup);padding:var(--paddingMedium);border-radius:var(--inputBorderRadius)}.allowed-signers-container .form-field-title{color:var(--offWhite)}.toggle-container .config-container-label{font-size:.8rem}\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.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { 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"] }, { kind: "component", type: FormHeaderComponent, selector: "lib-form-header", inputs: ["data", "badges", "title", "moreActions", "formView", "saveDisabled", "saveTooltip", "actionButtonText", "moreActionsText", "showHeaderToggle", "showHeaderButton"], 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", "contentClass", "showHeader", "showToggle", "headerActions", "headerToggle"], outputs: ["actionRequested", "headerToggleChange"] }, { 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: TagSelectorComponent, selector: "lib-tag-selector", inputs: ["placeholder", "disableField", "disableCreate", "hideOption", "isLoading", "errorMessage", "focusOnInit", "selectedRoleAttributes", "selectedNamedAttributes", "hasError", "availableRoleAttributes", "availableNamedAttributes"], outputs: ["addRoleAttribute", "addNamedAttribute", "roleAttributeRemoved", "namedAttributeRemoved", "selectedRoleAttributesChange", "selectedNamedAttributesChange", "filterChange"] }, { kind: "component", type: CustomTagsComponent, selector: "lib-custom-tags", inputs: ["tags"], outputs: ["tagsChange"] }] }); }
24668
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: CertificateAuthorityFormComponent, selector: "lib-certificate-authority", inputs: { formData: "formData", errors: "errors" }, outputs: { close: "close" }, viewQueries: [{ propertyName: "filterInput", first: true, predicate: ["fileSelect"], descendants: true }], 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 ? 'Certificate Authority Details' : 'Create Certificate Authority')\"\n [moreActions]=\"formData.moreActions\"\n (actionRequested)=\"headerActionRequested($event)\"\n [(formView)]=\"formView\"\n [saveDisabled]=\"svc.saveDisabled || formDataInvalid\"\n [badges]=\"badges\"\n ></lib-form-header>\n <div class=\"jwt-signer-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\n [title]=\"'Name'\"\n [label]=\"'Required'\"\n >\n <input class=\"form-field-input read-only\" [(ngModel)]=\"formData.name\" [ngClass]=\"{error: errors['name']}\" placeholder=\"Name this Certificate Authority\"/>\n </lib-form-field-container>\n <lib-form-field-container\n [title]=\"'Identity Name Format'\"\n [contentStyle]=\"'z-index: 99999999'\"\n [label]=\"'OPTIONAL'\"\n [helpText]=\"'The identity name format used to name automatically enrolling identities. Defaults to [caName]-[commonName]'\"\n >\n <input class=\"form-field-input read-only\" [(ngModel)]=\"formData.identityNameFormat\" [ngClass]=\"{error: errors['identityNameFormat']}\" placeholder=\"Defaults to [caName]-[commonName]\"/>\n </lib-form-field-container>\n <lib-form-field-container\n [title]=\"'Identity Roles'\"\n [contentStyle]=\"'z-index: 99999999'\"\n [label]=\"'OPTIONAL'\"\n [helpText]=\"'The identity roles to give to automatically enrolling identities'\"\n >\n <lib-tag-selector\n [(selectedRoleAttributes)]=\"formData.identityRoles\"\n [availableRoleAttributes]=\"identityRoleAttributes\"\n [placeholder]=\"'Type to filter and enter to assign'\"\n [hasError]=\"errors.dialIdentities\"\n ></lib-tag-selector>\n </lib-form-field-container>\n <lib-form-field-container\n [title]=\"'Enrollment Options'\"\n [layout]=\"'row'\"\n >\n <div class=\"config-item\">\n <div class=\"config-container toggle-container\">\n <div class=\"form-field-title-container\">\n <div class=\"config-container-label\">Auto Enroll</div>\n <div\n class=\"form-field-info infoicon\"\n matTooltip=\"Allows client certificates of the CA to automatically enroll when encountered\"\n matTooltipPosition=\"below\"\n ></div>\n </div>\n <div\n (click)=\"toggleSwitch('isAutoCaEnrollmentEnabled')\"\n [ngClass]=\"{ on: formData.isAutoCaEnrollmentEnabled }\"\n class=\"toggle\"\n >\n <span [hidden]=\"!formData.isAutoCaEnrollmentEnabled\" class=\"on-label\">YES</span>\n <span [hidden]=\"formData.isAutoCaEnrollmentEnabled\" class=\"off-label\">NO</span>\n <div class=\"switch\"></div>\n </div>\n </div>\n </div>\n <div class=\"config-item\">\n <div class=\"config-container toggle-container\">\n <div class=\"form-field-title-container\">\n <div class=\"config-container-label\">OTT Enroll</div>\n <div\n class=\"form-field-info infoicon\"\n matTooltip=\"Allows client certificates of the CA to enroll if an identity with an ottca enrollment was created\"\n matTooltipPosition=\"below\"\n ></div>\n </div>\n <div\n (click)=\"toggleSwitch('isOttCaEnrollmentEnabled')\"\n [ngClass]=\"{ on: formData.isOttCaEnrollmentEnabled }\"\n class=\"toggle\"\n >\n <span [hidden]=\"!formData.isOttCaEnrollmentEnabled\" class=\"on-label\">YES</span>\n <span [hidden]=\"formData.isOttCaEnrollmentEnabled\" class=\"off-label\">NO</span>\n <div class=\"switch\"></div>\n </div>\n </div>\n </div>\n <div class=\"config-item\">\n <div class=\"config-container toggle-container\">\n <div class=\"form-field-title-container\">\n <div class=\"config-container-label\">Auth Enabled</div>\n <div\n class=\"form-field-info infoicon\"\n matTooltip=\"Allows client certificates of the CA to attempt to enroll\"\n matTooltipPosition=\"below\"\n ></div>\n </div>\n <div\n (click)=\"toggleSwitch('isAuthEnabled')\"\n [ngClass]=\"{ on: formData.isAuthEnabled }\"\n class=\"toggle\"\n >\n <span [hidden]=\"!formData.isAuthEnabled\" class=\"on-label\">YES</span>\n <span [hidden]=\"formData.isAuthEnabled\" class=\"off-label\">NO</span>\n <div class=\"switch\"></div>\n </div>\n </div>\n </div>\n </lib-form-field-container>\n <lib-form-field-container\n [title]=\"'External ID Claim'\"\n [layout]=\"'column'\"\n [helpText]=\"'Configuration used to pull values out of the x509 client certificate used to match identity externalId'\"\n [showToggle]=\"true\"\n [(headerToggle)]=\"externalIdClaim\"\n (headerToggleChange)=\"externalIdClaimChanged()\"\n >\n <div class=\"form-field-input-group\" [ngClass]=\"{disabled: !externalIdClaim}\">\n <div class=\"form-field-row\">\n <div class=\"form-field-label-container\">\n <div class=\"form-field-title-container\">\n <span class=\"form-field-title\">Location</span>\n <div\n class=\"form-field-info infoicon\"\n matTooltip=\"Defines which value(s) in an x509 certificate will be processed\"\n matTooltipPosition=\"below\"\n ></div>\n </div>\n <select [(ngModel)]=\"claimLocation\" id=\"ClaimLocation\" class=\"form-field-dropdown\" [disabled]=\"!externalIdClaim\" [ngClass]=\"{error: errors['claimLocation']}\">\n <option value=\"\">Select an option</option>\n <option *ngFor=\"let loc of locations\" [value]=\"loc\">\n {{ loc }}\n </option>\n </select>\n </div>\n <div class=\"form-field-label-container\">\n <div class=\"form-field-title-container\">\n <span class=\"form-field-title\">Matcher</span>\n <div\n class=\"form-field-info infoicon\"\n matTooltip=\"Defines how values from location will be filtered\"\n matTooltipPosition=\"below\"\n ></div>\n </div>\n <select [(ngModel)]=\"matcher\" id=\"ClaimMatcher\" class=\"form-field-dropdown\" [disabled]=\"!externalIdClaim\" [ngClass]=\"{error: errors['matcher']}\">\n <option value=\"\">Select an option</option>\n <option *ngFor=\"let matcher of matchers\" [value]=\"matcher\">\n {{ matcher }}\n </option>\n </select>\n </div>\n <div class=\"form-field-label-container\">\n <div class=\"form-field-title-container\">\n <span class=\"form-field-title\">Parser</span>\n <div\n class=\"form-field-info infoicon\"\n matTooltip=\"Defines how values from location filtered by matcher will be parsed\"\n matTooltipPosition=\"below\"\n ></div>\n </div>\n <select [(ngModel)]=\"parser\" id=\"ClaimParser\" class=\"form-field-dropdown\" [disabled]=\"!externalIdClaim\" [ngClass]=\"{error: errors['parser']}\">\n <option value=\"\">Select an option</option>\n <option *ngFor=\"let parser of parsers\" [value]=\"parser\">\n {{ parser }}\n </option>\n </select>\n </div>\n </div>\n <div class=\"form-field-row\">\n <div class=\"form-field-label-container\">\n <div class=\"form-field-title-container\">\n <span class=\"form-field-title\">Index</span>\n <div\n class=\"form-field-info infoicon\"\n matTooltip=\"Should multiple values still be available after location, matcher, and parser processing the integer value here will be used from the set\"\n matTooltipPosition=\"below\"\n ></div>\n </div>\n <input class=\"form-field-input\" type=\"number\" placeholder=\"Enter a number\" [(ngModel)]=\"index\" [ngClass]=\"{error: errors['index']}\" [disabled]=\"!externalIdClaim\"/>\n </div>\n <div class=\"form-field-label-container\">\n <div class=\"form-field-title-container\">\n <span class=\"form-field-title\">Match Criteria</span>\n <div\n class=\"form-field-info infoicon\"\n matTooltip=\"Defines the PREFIX, SUFFIX, or SCHEME to look for based on matcher\"\n matTooltipPosition=\"below\"\n ></div>\n </div>\n <input class=\"form-field-input\" placeholder=\"Enter matcher criteria\" [(ngModel)]=\"matcherCriteria\" [ngClass]=\"{error: errors['matcherCriteria']}\" [disabled]=\"!externalIdClaim\"/>\n </div>\n <div class=\"form-field-label-container\">\n <div class=\"form-field-title-container\">\n <span class=\"form-field-title\">Parser Criteria</span>\n <div\n class=\"form-field-info infoicon\"\n matTooltip=\"Defines the criteria to provide to parser\"\n matTooltipPosition=\"below\"\n ></div>\n </div>\n <input class=\"form-field-input\" placeholder=\"Enter parser criteria\" [(ngModel)]=\"parserCriteria\" [ngClass]=\"{error: errors['parserCriteria']}\" [disabled]=\"!externalIdClaim\"/>\n </div>\n </div>\n </div>\n </lib-form-field-container>\n <lib-form-field-container\n [title]=\"'PEM'\"\n [label]=\"'REQUIRED'\"\n >\n <div class=\"form-field-input-group\">\n <div class=\"form-field-label-container select-file-label-container\">\n <div class=\"form-field-header\">\n <div class=\"form-field-title-container\">\n <span class=\"form-field-title\">Enter PEM</span>\n </div>\n <span class=\"select-file-button\" (click)=\"openFileSelect($event)\">\n Select File\n <div class=\"spinner\" *ngIf=\"fileSelectOpening\"></div>\n </span>\n <input #fileSelect type=\"file\" style=\"display:none\" (change)=\"selectPemFile($event)\">\n </div>\n <textarea placeholder=\"Paste pem contents or select file\" [(ngModel)]=\"formData.certPem\" [ngClass]=\"{error: errors['certPem']}\"></textarea>\n </div>\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 >\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 *ngIf=\"formData.id && !this.formData.isVerified\"\n [showHeader]=\"false\"\n >\n <a class=\"download-button\" href=\"./{{this.basePath}}/{{this.formData.id}}/verify\" (click)=\"verifyCertificate($event)\">\n <div class=\"verify-certificate\"></div>\n <span>Verify Certificate</span>\n <div class=\"tap-to-download\"></div>\n </a>\n </lib-form-field-container>\n <lib-form-field-container\n [title]=\"'API Calls'\"\n [headerActions]=\"apiOptions\"\n (actionRequested)=\"apiActionRequested($event)\"\n [class]=\"'api-data-no-wrap'\"\n >\n <div class=\"form-row\">\n <input class=\"form-field-input\" [value]=\"apiCallURL\"/>\n <div class=\"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: ["@charset \"UTF-8\";.form-group-column.three-fifths{min-width:31.25rem}.jwt-signer-form-container{display:flex;flex-direction:column;height:100%;width:100%;align-items:center;gap:var(--gapXL)}.jwt-signer-form-container .select-file-button{padding-left:var(--paddingMedium);padding-right:var(--paddingMedium);height:1.5625rem;width:-moz-fit-content;width:fit-content;white-space:nowrap;display:flex;align-items:center;justify-content:center;font-weight:600;font-size:.875rem;background:var(--primary);border-style:solid;border-width:.0625rem;border-color:var(--stroke);color:var(--white);cursor:pointer;border-radius:var(--inputBorderRadius);gap:var(--marginMedium);margin-top:-.3125rem}.jwt-signer-form-container .select-file-button:hover{filter:brightness(.8)}.jwt-signer-form-container .select-file-button:active{filter:grayscale(1);transform:translateY(.0625rem)}.jwt-signer-form-container .select-file-button .spinner{display:inline-block;width:.5rem;height:.5rem;border-radius:50%;background:transparent;border-top:.125rem solid white;border-right:.125rem solid white;border-bottom:.125rem solid transparent;border-left:.125rem solid transparent;animation:loading .5s infinite linear}.jwt-signer-form-container .select-file-label-container{gap:var(--marginMedium)}.jwt-signer-form-container .updb-input-options{margin-top:var(--marginSmall);background-color:var(--formGroup);padding:var(--paddingMedium);border-radius:var(--inputBorderRadius)}.jwt-signer-form-container .updb-input-options .form-field-title{color:var(--offWhite)}::ng-deep .jwt-signer-form-container select:disabled,::ng-deep .jwt-signer-form-container input:disabled{opacity:.75!important;cursor:text;background-color:var(--stroke)!important}::ng-deep .api-data-no-wrap .jse-text-mode{width:100%}::ng-deep .api-data-no-wrap .jse-text-mode .cm-editor{width:100%}::ng-deep .api-data-no-wrap .jse-text-mode .cm-editor .cm-scroller{width:100%}::ng-deep .api-data-no-wrap .jse-text-mode .cm-editor .cm-scroller .cm-content{width:100%;overflow:auto}::ng-deep .api-data-no-wrap .jse-text-mode .cm-editor .cm-scroller .cm-content .\\37cr{white-space:nowrap}.radio-group-container{display:flex;gap:var(--marginLarge)}.radio-group-container:focus .radio-button-container .radio-button-circle{border-color:var(--primaryColor)}.radio-group-container .radio-button-container{display:flex;flex-direction:row;align-items:center;background-color:var(--formGroup);border-radius:var(--inputBorderRadius);width:100%;padding-left:var(--paddingMedium);padding-right:var(--paddingMedium);padding-top:var(--paddingLarge);padding-bottom:var(--paddingLarge);cursor:pointer;gap:var(--marginMedium)}.radio-group-container .radio-button-container .radio-button-circle{display:flex;width:1.3125rem;height:1.3125rem;border-radius:1.3125rem;border-width:.125rem;border-style:solid;border-color:var(--offWhite);align-items:center;justify-content:center;background-color:var(--offWhite)}.radio-group-container .radio-button-container .radio-button-circle .radio-button-inner-circle{display:none;width:.9375rem;height:.9375rem;border-radius:.9375rem;align-items:center;justify-content:center;background-color:var(--primaryColor)}.radio-group-container .radio-button-container.selected .radio-button-circle .radio-button-inner-circle{display:flex}.radio-group-container .radio-button-container:active .radio-button-circle .radio-button-inner-circle{display:flex;background-color:var(--menu)}.radio-group-container .radio-button-container .radio-button-label{color:var(--offWhite);font-size:.875rem;font-weight:600}.allowed-signers-container{background-color:var(--formGroup);padding:var(--paddingMedium);border-radius:var(--inputBorderRadius)}.allowed-signers-container .form-field-title{color:var(--offWhite)}.toggle-container .config-container-label{font-size:.8rem}\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.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { 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"] }, { kind: "component", type: FormHeaderComponent, selector: "lib-form-header", inputs: ["data", "badges", "title", "moreActions", "formView", "saveDisabled", "saveTooltip", "actionButtonText", "moreActionsText", "showHeaderToggle", "showHeaderButton"], 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", "contentClass", "showHeader", "showToggle", "headerActions", "headerToggle"], outputs: ["actionRequested", "headerToggleChange"] }, { 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", "showLineNumbers"], outputs: ["dataChange", "jsonChange", "jsonInvalidChange"] }, { kind: "component", type: TagSelectorComponent, selector: "lib-tag-selector", inputs: ["placeholder", "disableField", "disableCreate", "hideOption", "isLoading", "errorMessage", "focusOnInit", "selectedRoleAttributes", "selectedNamedAttributes", "hasError", "availableRoleAttributes", "availableNamedAttributes"], outputs: ["addRoleAttribute", "addNamedAttribute", "roleAttributeRemoved", "namedAttributeRemoved", "selectedRoleAttributesChange", "selectedNamedAttributesChange", "filterChange"] }, { kind: "component", type: CustomTagsComponent, selector: "lib-custom-tags", inputs: ["tags"], outputs: ["tagsChange"] }] }); }
24478
24669
  }
24479
24670
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: CertificateAuthorityFormComponent, decorators: [{
24480
24671
  type: Component,
@@ -25374,7 +25565,7 @@ class ConfigTypeFormComponent extends ProjectableForm {
25374
25565
  return '';
25375
25566
  }
25376
25567
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ConfigTypeFormComponent, deps: [{ token: ConfigTypeFormService }, { token: SchemaService }, { token: GrowlerService }, { token: SHAREDZ_EXTENSION }, { token: SETTINGS_SERVICE }, { token: ZITI_DATA_SERVICE }, { token: i4.Router }, { token: i4.ActivatedRoute }, { token: i1$4.Location }, { token: ValidationService }], target: i0.ɵɵFactoryTarget.Component }); }
25377
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: ConfigTypeFormComponent, 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=\"config-type-form-container 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 Type' : 'Create Config Type')\"\n [moreActions]=\"formData.moreActions\"\n (actionRequested)=\"headerActionRequested($event)\"\n [(formView)]=\"formView\"\n [saveDisabled]=\"saveDisabled\"\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 [title]=\"'Schema'\" [label]=\"'Required'\" class=\"schema-json-editor\">\n <lib-json-view [(data)]=\"formData.schema\" [jsonInvalid]=\"errors['schema']\"></lib-json-view>\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-type-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% - .9375rem);min-width:34.375rem;max-width:43.75rem}.form-group-column.two-fifths{max-width:43.75rem}::ng-deep #jsoneditor{max-height:32rem;overflow:hidden}\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: 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.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", "badges", "title", "moreActions", "formView", "saveDisabled", "saveTooltip", "actionButtonText", "moreActionsText", "showHeaderToggle", "showHeaderButton"], 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", "contentClass", "showHeader", "showToggle", "headerActions", "headerToggle"], outputs: ["actionRequested", "headerToggleChange"] }, { 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"] }] }); }
25568
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: ConfigTypeFormComponent, 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=\"config-type-form-container 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 Type' : 'Create Config Type')\"\n [moreActions]=\"formData.moreActions\"\n (actionRequested)=\"headerActionRequested($event)\"\n [(formView)]=\"formView\"\n [saveDisabled]=\"saveDisabled\"\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 [title]=\"'Schema'\" [label]=\"'Required'\" class=\"schema-json-editor\">\n <lib-json-view [(data)]=\"formData.schema\" [jsonInvalid]=\"errors['schema']\"></lib-json-view>\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-type-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% - .9375rem);min-width:34.375rem;max-width:43.75rem}.form-group-column.two-fifths{max-width:43.75rem}::ng-deep #jsoneditor{max-height:32rem;overflow:hidden}\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: 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.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", "badges", "title", "moreActions", "formView", "saveDisabled", "saveTooltip", "actionButtonText", "moreActionsText", "showHeaderToggle", "showHeaderButton"], 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", "contentClass", "showHeader", "showToggle", "headerActions", "headerToggle"], outputs: ["actionRequested", "headerToggleChange"] }, { 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", "showLineNumbers"], outputs: ["dataChange", "jsonChange", "jsonInvalidChange"] }, { kind: "component", type: CustomTagsComponent, selector: "lib-custom-tags", inputs: ["tags"], outputs: ["tagsChange"] }] }); }
25378
25569
  }
25379
25570
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ConfigTypeFormComponent, decorators: [{
25380
25571
  type: Component,
@@ -26164,7 +26355,7 @@ class PostureCheckFormComponent extends ProjectableForm {
26164
26355
  macAddressesChange(event) {
26165
26356
  }
26166
26357
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: PostureCheckFormComponent, deps: [{ token: PostureCheckFormService }, { token: SchemaService }, { token: GrowlerService }, { token: SHAREDZ_EXTENSION }, { token: SETTINGS_SERVICE }, { token: ZITI_DATA_SERVICE }, { token: i4.Router }, { token: i4.ActivatedRoute }, { token: i1$4.Location }, { token: ValidationService }], target: i0.ɵɵFactoryTarget.Component }); }
26167
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: PostureCheckFormComponent, selector: "lib-posture-check", inputs: { formData: "formData", errors: "errors" }, outputs: { close: "close" }, usesInheritance: true, ngImport: i0, template: "<div class=\"posture-check-form-container 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 Posture Check' : 'Create Posture Check')\"\n [moreActions]=\"formData.moreActions\"\n (actionRequested)=\"headerActionRequested($event)\"\n [(formView)]=\"formView\"\n ></lib-form-header>\n <div class=\"posture-checkform-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]=\"'Name'\" [label]=\"'Required'\">\n <input\n id=\"PostureCheckName\"\n type=\"text\"\n maxlength=\"500\"\n placeholder=\"Name this posture check\"\n [ngClass]=\"{error: errors['name']}\"\n [(ngModel)]=\"formData.name\"\n >\n </lib-form-field-container>\n <lib-form-field-container\n [title]=\"'Select or create Posture Check attributes'\"\n [label]=\"'OPTIONAL'\"\n [contentStyle]=\"'z-index: 99999999'\"\n [helpText]=\"'Attributes are tags applied to an resource. Apply the same tag to other Posture Checks to form a group of Posture Checks.'\"\n >\n <lib-tag-selector\n [(selectedRoleAttributes)]=\"formData.roleAttributes\"\n [availableRoleAttributes]=\"pcRoleAttributes\"\n [placeholder]=\"'Add attributes to group Posture Checks'\"\n ></lib-tag-selector>\n </lib-form-field-container>\n <lib-form-field-container [title]=\"'Type'\" [label]=\"'Required'\" class=\"schema-json-editor\">\n <select\n *ngIf=\"postureCheckTypes.length > 0\"\n [(ngModel)]=\"formData.typeId\"\n (change)=\"pcTypeChanged($event)\"\n [disabled]=\"formData.id\"\n [matTooltip]=\"formData.id ? 'Type cannot be changed' : ''\"\n matTooltipPosition=\"below\"\n id=\"SelectedConfigType\"\n class=\"form-field-dropdown\"\n (keyup.enter)=\"preventEnterProp($event)\"\n >\n <option value=\"\">Select posture check type...</option>\n <option\n *ngFor=\"let type of postureCheckTypes\"\n [value]=\"type.id\"\n >\n {{ type.name }}\n </option>\n </select>\n </lib-form-field-container>\n <lib-form-field-container [title]=\"'MAC Addresses'\" [label]=\"'Required'\" *ngIf=\"formData.typeId === 'MAC'\">\n <p-chips (keyup)=\"macAddressesChange($event)\"\n [(ngModel)]=\"formData.macAddresses\"\n [allowDuplicate]=\"false\"\n placeholder=\"Enter mc addresses\"\n [addOnBlur]=\"true\"\n [ngClass]=\"{ error: errors['macAddresses'] }\"\n separator=\",\"\n (keyup.enter)=\"preventEnterProp($event)\"\n >\n </p-chips>\n </lib-form-field-container>\n <lib-form-field-container [title]=\"'Windows Domain Details'\" [label]=\"'Required'\" *ngIf=\"formData.typeId === 'DOMAIN'\">\n <p-chips (keyup)=\"macAddressesChange($event)\"\n [(ngModel)]=\"formData.domains\"\n [allowDuplicate]=\"false\"\n placeholder=\"Enter domains\"\n [addOnBlur]=\"true\"\n [ngClass]=\"{ error: errors['domains'] }\"\n separator=\",\"\n (keyup.enter)=\"preventEnterProp($event)\"\n >\n </p-chips>\n </lib-form-field-container>\n <lib-form-field-container [title]=\"'Process Details'\" [contentClass]=\"'form-field-input-group'\" *ngIf=\"formData.typeId === 'PROCESS'\">\n <div class=\"form-field-label-container process-os-details-header\">\n <div class=\"form-field-header\">\n <div class=\"form-field-title-container\">\n <span class=\"form-field-title\">Operating System</span>\n </div>\n <span class=\"form-field-label\" >Required</span>\n </div>\n <p-dropdown\n placeholder=\"Select configuration...\"\n optionLabel=\"name\"\n optionValue=\"type\"\n filterBy=\"name\"\n [options]=\"osTypes\"\n [filter]=\"false\"\n [showClear]=\"true\"\n [(ngModel)]=\"formData.process.osType\"\n (keyup.enter)=\"preventEnterProp($event)\"\n >\n <ng-template pTemplate=\"selectedItem\">\n <div class=\"os-type-dropdown-item\" *ngIf=\"formData.process.osType && formData.process.osType !== ''\">\n <div class=\"os-type-dropdown-icon\"\n [class]=\"'os-type-dropdown-icon-' + formData.process.osType\"\n ></div>\n <div>{{ formData.process.osType }}</div>\n </div>\n </ng-template>\n <ng-template let-os pTemplate=\"item\">\n <div class=\"os-type-dropdown-item\">\n <div class=\"os-type-dropdown-icon\"\n [class]=\"'os-type-dropdown-icon-' + os.type\"\n ></div>\n <div>{{ os.name }}</div>\n </div>\n </ng-template>\n </p-dropdown>\n </div>\n <div class=\"form-field-label-container\">\n <div class=\"form-field-header\">\n <div class=\"form-field-title-container\">\n <span class=\"form-field-title\">Hashes</span>\n <div\n class=\"form-field-info infoicon\"\n matTooltip=\"Valid sha256 hashes of a binary\"\n matTooltipPosition=\"below\"\n ></div>\n </div>\n <span class=\"form-field-label\" >Required</span>\n </div>\n <p-chips [(ngModel)]=\"formData.process.hashes\"\n [allowDuplicate]=\"false\"\n placeholder=\"Enter hashes\"\n [addOnBlur]=\"true\"\n [ngClass]=\"{ error: errors['processHashes'] }\"\n separator=\",\"\n (keyup.enter)=\"preventEnterProp($event)\"\n >\n </p-chips>\n </div>\n <div class=\"form-field-label-container\">\n <div class=\"form-field-header\">\n <div class=\"form-field-title-container\">\n <span class=\"form-field-title\">Path</span>\n </div>\n <span class=\"form-field-label\" >Required</span>\n </div>\n <input class=\"form-field-input\" placeholder=\"/path/to/process\" [(ngModel)]=\"formData.process.path\" [ngClass]=\"{error: errors['processPath']}\"/>\n </div>\n <div class=\"form-field-label-container\">\n <div class=\"form-field-header\">\n <div class=\"form-field-title-container\">\n <span class=\"form-field-title\">Fingerprint</span>\n <div\n class=\"form-field-info infoicon\"\n matTooltip=\"Fingerprints are the sha1 fingerprints (thumbprints) of valid signing certificates\"\n matTooltipPosition=\"below\"\n ></div>\n </div>\n <span class=\"form-field-label\" >Required</span>\n </div>\n <input class=\"form-field-input\" placeholder=\"Enter a fingerprint\" [(ngModel)]=\"formData.process.signerFingerprint\" [ngClass]=\"{error: errors['androidOSMin']}\"/>\n </div>\n </lib-form-field-container>\n <lib-form-field-container [title]=\"'Process Multi Details'\" *ngIf=\"formData.typeId === 'PROCESS_MULTI'\">\n <div class=\"form-field-label-container\">\n <div class=\"form-field-header\">\n <div class=\"form-field-title-container\">\n <span class=\"form-field-title\">Semantic</span>\n </div>\n <span class=\"form-field-label\" >Required</span>\n </div>\n <select\n [(ngModel)]=\"formData.semantic\"\n id=\"PolicySemantic\"\n class=\"form-field-dropdown\"\n >\n <option value=\"AllOf\">AllOf</option>\n <option value=\"AnyOf\">AnyOf</option>\n </select>\n </div>\n <div class=\"process-multi-item form-field-input-group\" *ngFor=\"let process of processMultiItems; index as i\">\n <div class=\"icon-clear\" *ngIf=\"processMultiItems.length > 1\" (click)=\"removeProcessItem(i)\"></div>\n <div class=\"form-field-label-container process-os-details-header\">\n <div class=\"form-field-header\">\n <div class=\"form-field-title-container\">\n <span class=\"form-field-title\">Operating System</span>\n </div>\n <span class=\"form-field-label\" >Required</span>\n </div>\n <p-dropdown\n placeholder=\"Select configuration...\"\n optionLabel=\"name\"\n optionValue=\"type\"\n filterBy=\"name\"\n [options]=\"osTypes\"\n [filter]=\"false\"\n [showClear]=\"true\"\n [(ngModel)]=\"process.osType\"\n (keyup.enter)=\"preventEnterProp($event)\"\n >\n <ng-template pTemplate=\"selectedItem\">\n <div class=\"os-type-dropdown-item\" *ngIf=\"process.osType && process.osType !== ''\">\n <div class=\"os-type-dropdown-icon\"\n [class]=\"'os-type-dropdown-icon-' + process.osType\"\n ></div>\n <div>{{ process.osType }}</div>\n </div>\n </ng-template>\n <ng-template let-os pTemplate=\"item\">\n <div class=\"os-type-dropdown-item\">\n <div class=\"os-type-dropdown-icon\"\n [class]=\"'os-type-dropdown-icon-' + os.type\"\n ></div>\n <div>{{ os.name }}</div>\n </div>\n </ng-template>\n </p-dropdown>\n </div>\n <div class=\"form-field-label-container\">\n <div class=\"form-field-header\">\n <div class=\"form-field-title-container\">\n <span class=\"form-field-title\">Hashes</span>\n <div\n class=\"form-field-info infoicon\"\n matTooltip=\"Valid sha256 hashes of a binary\"\n matTooltipPosition=\"below\"\n ></div>\n </div>\n <span class=\"form-field-label\" >Required</span>\n </div>\n <p-chips [(ngModel)]=\"process.hashes\"\n [allowDuplicate]=\"false\"\n placeholder=\"Enter hashes\"\n [addOnBlur]=\"true\"\n [ngClass]=\"{ error: errors['processHashes'] }\"\n separator=\",\"\n (keyup.enter)=\"preventEnterProp($event)\"\n >\n </p-chips>\n </div>\n <div class=\"form-field-label-container\">\n <div class=\"form-field-header\">\n <div class=\"form-field-title-container\">\n <span class=\"form-field-title\">Path</span>\n </div>\n <span class=\"form-field-label\" >Required</span>\n </div>\n <input class=\"form-field-input\" placeholder=\"/path/to/process\" [(ngModel)]=\"process.path\" [ngClass]=\"{error: errors['processPath']}\"/>\n </div>\n <div class=\"form-field-label-container\">\n <div class=\"form-field-header\">\n <div class=\"form-field-title-container\">\n <span class=\"form-field-title\">Fingerprint</span>\n <div\n class=\"form-field-info infoicon\"\n matTooltip=\"Signer fingerprints are the sha1 fingerprints (thumbprints) of valid signing certificates\"\n matTooltipPosition=\"below\"\n ></div>\n </div>\n <span class=\"form-field-label\" >Required</span>\n </div>\n <p-chips (keyup)=\"macAddressesChange($event)\"\n [(ngModel)]=\"process.signerFingerprints\"\n [allowDuplicate]=\"false\"\n placeholder=\"Enter signer fingerprints\"\n [addOnBlur]=\"true\"\n [ngClass]=\"{ error: errors['process[' + i +'].signerFingerprints'] }\"\n separator=\",\"\n (keyup.enter)=\"preventEnterProp($event)\"\n />\n </div>\n </div>\n <div class=\"buttons process-multi-buttons\">\n <button class=\"button\" (click)=\"addProcessItem()\">Add Another Process</button>\n </div>\n </lib-form-field-container>\n <lib-form-field-container\n [title]=\"'Multi Factor Details'\"\n [layout]=\"'column'\"\n *ngIf=\"formData.typeId === 'MFA'\"\n >\n <div class=\"form-field-row\">\n <div class=\"form-field-label-container\">\n <div class=\"form-field-title-container\">\n <span class=\"form-field-title\">Timeout (seconds)</span>\n </div>\n <input class=\"form-field-input\" placeholder=\"# in seconds\" [(ngModel)]=\"formData.timeoutSeconds\" [ngClass]=\"{error: errors['timeoutSeconds']}\" type=\"number\"/>\n </div>\n <div class=\"config-item os-toggle-container\" (click)=\"toggleMFAPrompt('wake')\">\n <div class=\"form-field-title-container\">\n <span class=\"form-field-title\">Require On Wake</span>\n </div>\n <div class=\"config-container toggle-container os-toggle-container\">\n <div class=\"form-field-title-container\">\n <div class=\"config-container-label\">Require</div>\n </div>\n <div\n [ngClass]=\"{ on: formData.promptOnWake }\"\n class=\"toggle\"\n >\n <span [hidden]=\"!formData.promptOnWake\" class=\"on-label\">YES</span>\n <span [hidden]=\"formData.promptOnWake\" class=\"off-label\">NO</span>\n <div class=\"switch\"></div>\n </div>\n </div>\n </div>\n <div class=\"config-item os-toggle-container\" (click)=\"toggleMFAPrompt('unlock')\">\n <div class=\"form-field-title-container\">\n <span class=\"form-field-title\">Require On Unlock</span>\n </div>\n <div class=\"config-container toggle-container os-toggle-container\">\n <div class=\"form-field-title-container\">\n <div class=\"config-container-label\">Require</div>\n </div>\n <div\n [ngClass]=\"{ on: formData.promptOnUnlock }\"\n class=\"toggle\"\n >\n <span [hidden]=\"!formData.promptOnUnlock\" class=\"on-label\">YES</span>\n <span [hidden]=\"formData.promptOnUnlock\" class=\"off-label\">NO</span>\n <div class=\"switch\"></div>\n </div>\n </div>\n </div>\n </div>\n </lib-form-field-container>\n <lib-form-field-container\n [showHeader]=\"false\"\n [layout]=\"'column'\"\n *ngIf=\"formData.typeId === 'OS'\"\n >\n <div class=\"form-field-row os-version-row\">\n <div class=\"config-item os-toggle-container\">\n <div class=\"form-field-title-container\">\n <span class=\"form-field-title\">Operating System</span>\n </div>\n <div class=\"config-container toggle-container os-toggle-container\"\n (click)=\"toggleOS('Android')\">\n <div class=\"form-field-title-container\">\n <div class=\"pc-os-button android-os-button\"></div>\n <div class=\"config-container-label\">Android</div>\n </div>\n <div\n [ngClass]=\"{ on: osCheckData.Android.enabled }\"\n class=\"toggle\"\n >\n <span [hidden]=\"!osCheckData.Android.enabled\" class=\"on-label\">YES</span>\n <span [hidden]=\"osCheckData.Android.enabled\" class=\"off-label\">NO</span>\n <div class=\"switch\"></div>\n </div>\n </div>\n </div>\n <div class=\"form-field-label-container\">\n <div class=\"form-field-title-container\">\n <span class=\"form-field-title\">Min Version</span>\n </div>\n <input class=\"form-field-input\" placeholder=\"#.#.#\" [matTooltip]=\"osCheckData.Android.isAdvanced ? 'Use JSON view to edit' : ''\" [(ngModel)]=\"osCheckData.Android.min\" [ngClass]=\"{error: errors['androidOSMin']}\" [disabled]=\"!osCheckData.Android.enabled || osCheckData.Android.isAdvanced\"/>\n </div>\n <div class=\"form-field-label-container\">\n <div class=\"form-field-title-container\">\n <span class=\"form-field-title\">Max Version</span>\n </div>\n <input class=\"form-field-input\" placeholder=\"#.#.#\" [matTooltip]=\"osCheckData.Android.isAdvanced ? 'Use JSON view to edit' : ''\" [(ngModel)]=\"osCheckData.Android.max\" [ngClass]=\"{error: errors['androidOSMax']}\" [disabled]=\"!osCheckData.Android.enabled || osCheckData.Android.isAdvanced\"/>\n </div>\n </div>\n <div class=\"form-field-row os-version-row\">\n <div class=\"config-item os-toggle-container\"\n (click)=\"toggleOS('iOS')\">\n <div class=\"config-container toggle-container os-toggle-container\">\n <div class=\"form-field-title-container\">\n <div class=\"pc-os-button ios-os-button\"></div>\n <div class=\"config-container-label\">iOS</div>\n </div>\n <div\n [ngClass]=\"{ on: osCheckData.iOS.enabled }\"\n class=\"toggle\"\n >\n <span [hidden]=\"!osCheckData.iOS.enabled\" class=\"on-label\">YES</span>\n <span [hidden]=\"osCheckData.iOS.enabled\" class=\"off-label\">NO</span>\n <div class=\"switch\"></div>\n </div>\n </div>\n </div>\n <div class=\"form-field-label-container\">\n <input class=\"form-field-input\" placeholder=\"#.#.#\" [matTooltip]=\"osCheckData.iOS.isAdvanced ? 'Use JSON view to edit' : ''\" [(ngModel)]=\"osCheckData.iOS.min\" [ngClass]=\"{error: errors['iOS']}\" [disabled]=\"!osCheckData.iOS.enabled || osCheckData.iOS.isAdvanced\"/>\n </div>\n <div class=\"form-field-label-container\">\n <input class=\"form-field-input\" placeholder=\"#.#.#\" [matTooltip]=\"osCheckData.iOS.isAdvanced ? 'Use JSON view to edit' : ''\" [(ngModel)]=\"osCheckData.iOS.max\" [ngClass]=\"{error: errors['iOS']}\" [disabled]=\"!osCheckData.iOS.enabled || osCheckData.iOS.isAdvanced\"/>\n </div>\n </div>\n <div class=\"form-field-row os-version-row\">\n <div class=\"config-item os-toggle-container\"\n (click)=\"toggleOS('Linux')\">\n <div class=\"config-container toggle-container os-toggle-container\">\n <div class=\"form-field-title-container\">\n <div class=\"pc-os-button linux-os-button\"></div>\n <div class=\"config-container-label\">Linux</div>\n </div>\n <div\n [ngClass]=\"{ on: osCheckData.Linux.enabled }\"\n class=\"toggle\"\n >\n <span [hidden]=\"!osCheckData.Linux.enabled\" class=\"on-label\">YES</span>\n <span [hidden]=\"osCheckData.Linux.enabled\" class=\"off-label\">NO</span>\n <div class=\"switch\"></div>\n </div>\n </div>\n </div>\n <div class=\"form-field-label-container\">\n <input class=\"form-field-input\" placeholder=\"#.#.#\" [matTooltip]=\"osCheckData.Linux.isAdvanced ? 'Use JSON view to edit' : ''\" [(ngModel)]=\"osCheckData.Linux.min\" [ngClass]=\"{error: errors['linuxOS']}\" [disabled]=\"!osCheckData.Linux.enabled || osCheckData.Linux.isAdvanced\"/>\n </div>\n <div class=\"form-field-label-container\">\n <input class=\"form-field-input\" placeholder=\"#.#.#\" [matTooltip]=\"osCheckData.Linux.isAdvanced ? 'Use JSON view to edit' : ''\" [(ngModel)]=\"osCheckData.Linux.max\" [ngClass]=\"{error: errors['linuxOS']}\" [disabled]=\"!osCheckData.Linux.enabled || osCheckData.Linux.isAdvanced\"/>\n </div>\n </div>\n <div class=\"form-field-row os-version-row\">\n <div class=\"config-item os-toggle-container\">\n <div class=\"config-container toggle-container os-toggle-container\"\n (click)=\"toggleOS('macOS')\">\n <div class=\"form-field-title-container\">\n <div class=\"pc-os-button mac-os-button\"></div>\n <div class=\"config-container-label\">macOS</div>\n </div>\n <div\n [ngClass]=\"{ on: osCheckData.macOS.enabled }\"\n class=\"toggle\"\n >\n <span [hidden]=\"!osCheckData.macOS.enabled\" class=\"on-label\">YES</span>\n <span [hidden]=\"osCheckData.macOS.enabled\" class=\"off-label\">NO</span>\n <div class=\"switch\"></div>\n </div>\n </div>\n </div>\n <div class=\"form-field-label-container\">\n <input class=\"form-field-input\" placeholder=\"#.#.#\" [matTooltip]=\"osCheckData.macOS.isAdvanced ? 'Use JSON view to edit' : ''\" [(ngModel)]=\"osCheckData.macOS.min\" [ngClass]=\"{error: errors['macOS']}\" [disabled]=\"!osCheckData.macOS.enabled || osCheckData.macOS.isAdvanced\"/>\n </div>\n <div class=\"form-field-label-container\">\n <input class=\"form-field-input\" placeholder=\"#.#.#\" [matTooltip]=\"osCheckData.macOS.isAdvanced ? 'Use JSON view to edit' : ''\" [(ngModel)]=\"osCheckData.macOS.max\" [ngClass]=\"{error: errors['macOS']}\" [disabled]=\"!osCheckData.macOS.enabled || osCheckData.macOS.isAdvanced\"/>\n </div>\n </div>\n <div class=\"form-field-row os-version-row\">\n <div class=\"config-item os-toggle-container\"\n (click)=\"toggleOS('Windows')\">\n <div class=\"config-container toggle-container os-toggle-container\">\n <div class=\"form-field-title-container\">\n <div class=\"pc-os-button windows-os-button\"></div>\n <div class=\"config-container-label\">Windows</div>\n </div>\n <div\n [ngClass]=\"{ on: osCheckData.Windows.enabled }\"\n class=\"toggle\"\n >\n <span [hidden]=\"!osCheckData.Windows.enabled\" class=\"on-label\">YES</span>\n <span [hidden]=\"osCheckData.Windows.enabled\" class=\"off-label\">NO</span>\n <div class=\"switch\"></div>\n </div>\n </div>\n </div>\n <div class=\"form-field-label-container\">\n <input class=\"form-field-input\" placeholder=\"#.#.#\" [matTooltip]=\"osCheckData.Windows.isAdvanced ? 'Use JSON view to edit' : ''\" [(ngModel)]=\"osCheckData.Windows.min\" [ngClass]=\"{error: errors['windowsOS']}\" [disabled]=\"!osCheckData.Windows.enabled || osCheckData.Windows.isAdvanced\"/>\n </div>\n <div class=\"form-field-label-container\">\n <input class=\"form-field-input\" placeholder=\"#.#.#\" [matTooltip]=\"osCheckData.Windows.isAdvanced ? 'Use JSON view to edit' : ''\" [(ngModel)]=\"osCheckData.Windows.max\" [ngClass]=\"{error: errors['windowsOS']}\" [disabled]=\"!osCheckData.Windows.enabled || osCheckData.Windows.isAdvanced\"/>\n </div>\n </div>\n <div class=\"form-field-row os-version-row\">\n <div class=\"config-item os-toggle-container\"\n (click)=\"toggleOS('WindowsServer')\">\n <div class=\"config-container toggle-container os-toggle-container\">\n <div class=\"form-field-title-container\">\n <div class=\"pc-os-button windows-server-os-button\"></div>\n <div class=\"config-container-label\">Windows Server</div>\n </div>\n <div\n [ngClass]=\"{ on: osCheckData.WindowsServer.enabled }\"\n class=\"toggle\"\n >\n <span [hidden]=\"!osCheckData.WindowsServer.enabled\" class=\"on-label\">YES</span>\n <span [hidden]=\"osCheckData.WindowsServer.enabled\" class=\"off-label\">NO</span>\n <div class=\"switch\"></div>\n </div>\n </div>\n </div>\n <div class=\"form-field-label-container\">\n <input class=\"form-field-input\" placeholder=\"#.#.#\" [matTooltip]=\"osCheckData.WindowsServer.isAdvanced ? 'Use JSON view to edit' : ''\" [(ngModel)]=\"osCheckData.WindowsServer.min\" [ngClass]=\"{error: errors['windowsServerOS']}\" [disabled]=\"!osCheckData.WindowsServer.enabled || osCheckData.WindowsServer.isAdvanced\"/>\n </div>\n <div class=\"form-field-label-container\">\n <input class=\"form-field-input\" placeholder=\"#.#.#\" [matTooltip]=\"osCheckData.WindowsServer.isAdvanced ? 'Use JSON view to edit' : ''\" [(ngModel)]=\"osCheckData.WindowsServer.max\" [ngClass]=\"{error: errors['windowsServerOS']}\" [disabled]=\"!osCheckData.WindowsServer.enabled || osCheckData.WindowsServer.isAdvanced\"/>\n </div>\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: [".posture-check-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% - .9375rem);min-width:34.375rem;max-width:43.75rem}.form-group-column.two-fifths{max-width:43.75rem}::ng-deep #jsoneditor{max-height:32rem;overflow:hidden}.os-toggle-container{gap:var(--gapSmall)}.os-toggle-container .config-container-label{text-transform:unset}.os-toggle-container{height:var(--defaultInputHeight);cursor:pointer}.os-toggle-container:hover .pc-os-button{transform:scale(1.05)}.os-version-row input:disabled{color:transparent!important}.os-version-row input:disabled::placeholder{color:transparent!important}.process-os-details-header{margin-top:var(--marginSmall)}input:disabled,select:disabled,textarea:disabled{opacity:.3!important;cursor:not-allowed}.process-multi-buttons{display:flex;flex-direction:row;justify-content:flex-end;margin:0}.process-multi-buttons button{background-color:var(--primaryColor);box-shadow:none;font-size:.75rem}.process-multi-buttons button:hover{filter:brightness(.8)}.process-multi-buttons button:active{transform:translateY(.0625rem)}.process-multi-item{display:flex;flex-direction:column;position:relative;gap:var(--gapMedium);border-width:.125rem;border-color:var(--menu);border-style:solid;padding:var(--paddingMedium);border-radius:var(--inputBorderRadius)}.process-multi-item .icon-clear{position:absolute;top:0;right:0;color:var(--red);margin-top:-.5rem;margin-right:-.5rem;background:var(--background);font-size:1.5rem;border-radius:2rem;cursor:pointer}.process-multi-item .icon-clear:hover{filter:brightness(.8)}.process-multi-item .icon-clear:active{transform:translateY(.0625rem)}.os-type-dropdown-item{display:flex;flex-direction:row;align-items:center;justify-content:flex-start;gap:var(--gapMedium)}.os-type-dropdown-item div{font-size:.875rem!important;font-family:Open Sans,Arial,sans-serif;color:var(--tableText)}.os-type-dropdown-item .os-type-dropdown-icon{background-size:1.75rem;height:1.75rem;width:1.75rem;display:inline-block;background-position-x:center;background-position-y:center}.os-type-dropdown-item .os-type-dropdown-icon.os-type-dropdown-icon-Android{background-image:url(/assets/images/android-os.png)}.os-type-dropdown-item .os-type-dropdown-icon.os-type-dropdown-icon-iOS{background-image:url(/assets/images/ios-os.png)}.os-type-dropdown-item .os-type-dropdown-icon.os-type-dropdown-icon-Linux{background-image:url(/assets/images/linux-os.png)}.os-type-dropdown-item .os-type-dropdown-icon.os-type-dropdown-icon-macOS{background-image:url(/assets/images/mac-os.png)}.os-type-dropdown-item .os-type-dropdown-icon.os-type-dropdown-icon-Windows{background-image:url(/assets/images/windows-os.png)}.os-type-dropdown-item .os-type-dropdown-icon.os-type-dropdown-icon-WindowsServer{background-image:url(/assets/images/windows-server-os.png)}.pc-os-button{background-size:2rem;height:2rem;width:2rem;display:inline-block;background-position-x:center;background-position-y:center;margin-right:.5rem}.pc-os-button.android-os-button{background-image:url(/assets/images/android-os.png)}.pc-os-button.ios-os-button{background-image:url(/assets/images/ios-os.png)}.pc-os-button.linux-os-button{background-image:url(/assets/images/linux-os.png)}.pc-os-button.mac-os-button{background-image:url(/assets/images/mac-os.png)}.pc-os-button.windows-os-button{background-image:url(/assets/images/windows-os.png)}.pc-os-button.windows-server-os-button{background-color:var(--offWhite_ALWAYS);border-radius:2rem;width:2rem;height:2rem;min-width:2rem;background-size:1.625rem;background-image:url(/assets/images/windows-server-os.png)}::ng-deep .posture-check-form-container .p-dropdown-panel .p-dropdown-items .p-dropdown-item{font-size:.875rem!important;font-family:Open Sans,Arial,sans-serif;color:var(--tableText);padding:.25rem var(--paddingMedium)}::ng-deep .posture-check-form-container p-dropdown .p-dropdown.p-component .p-inputtext.p-dropdown-label{padding:0 var(--paddingMedium)}::ng-deep p-chips input[type=text]{width:100%}::ng-deep p-chips ul{padding:0}\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.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { 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: 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"] }, { kind: "directive", type: i9.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "directive", type: i3.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "component", type: i4$2.Dropdown, selector: "p-dropdown", inputs: ["id", "scrollHeight", "filter", "name", "style", "panelStyle", "styleClass", "panelStyleClass", "readonly", "required", "editable", "appendTo", "tabindex", "placeholder", "filterPlaceholder", "filterLocale", "inputId", "dataKey", "filterBy", "filterFields", "autofocus", "resetFilterOnHide", "dropdownIcon", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "autoDisplayFirst", "group", "showClear", "emptyFilterMessage", "emptyMessage", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "ariaLabel", "ariaLabelledBy", "filterMatchMode", "maxlength", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "focusOnHover", "selectOnFocus", "autoOptionFocus", "autofocusFilter", "disabled", "itemSize", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "filterValue", "options"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onShow", "onHide", "onClear", "onLazyLoad"] }, { kind: "component", type: FormHeaderComponent, selector: "lib-form-header", inputs: ["data", "badges", "title", "moreActions", "formView", "saveDisabled", "saveTooltip", "actionButtonText", "moreActionsText", "showHeaderToggle", "showHeaderButton"], 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", "contentClass", "showHeader", "showToggle", "headerActions", "headerToggle"], outputs: ["actionRequested", "headerToggleChange"] }, { 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: TagSelectorComponent, selector: "lib-tag-selector", inputs: ["placeholder", "disableField", "disableCreate", "hideOption", "isLoading", "errorMessage", "focusOnInit", "selectedRoleAttributes", "selectedNamedAttributes", "hasError", "availableRoleAttributes", "availableNamedAttributes"], outputs: ["addRoleAttribute", "addNamedAttribute", "roleAttributeRemoved", "namedAttributeRemoved", "selectedRoleAttributesChange", "selectedNamedAttributesChange", "filterChange"] }, { kind: "component", type: CustomTagsComponent, selector: "lib-custom-tags", inputs: ["tags"], outputs: ["tagsChange"] }] }); }
26358
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: PostureCheckFormComponent, selector: "lib-posture-check", inputs: { formData: "formData", errors: "errors" }, outputs: { close: "close" }, usesInheritance: true, ngImport: i0, template: "<div class=\"posture-check-form-container 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 Posture Check' : 'Create Posture Check')\"\n [moreActions]=\"formData.moreActions\"\n (actionRequested)=\"headerActionRequested($event)\"\n [(formView)]=\"formView\"\n ></lib-form-header>\n <div class=\"posture-checkform-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]=\"'Name'\" [label]=\"'Required'\">\n <input\n id=\"PostureCheckName\"\n type=\"text\"\n maxlength=\"500\"\n placeholder=\"Name this posture check\"\n [ngClass]=\"{error: errors['name']}\"\n [(ngModel)]=\"formData.name\"\n >\n </lib-form-field-container>\n <lib-form-field-container\n [title]=\"'Select or create Posture Check attributes'\"\n [label]=\"'OPTIONAL'\"\n [contentStyle]=\"'z-index: 99999999'\"\n [helpText]=\"'Attributes are tags applied to an resource. Apply the same tag to other Posture Checks to form a group of Posture Checks.'\"\n >\n <lib-tag-selector\n [(selectedRoleAttributes)]=\"formData.roleAttributes\"\n [availableRoleAttributes]=\"pcRoleAttributes\"\n [placeholder]=\"'Add attributes to group Posture Checks'\"\n ></lib-tag-selector>\n </lib-form-field-container>\n <lib-form-field-container [title]=\"'Type'\" [label]=\"'Required'\" class=\"schema-json-editor\">\n <select\n *ngIf=\"postureCheckTypes.length > 0\"\n [(ngModel)]=\"formData.typeId\"\n (change)=\"pcTypeChanged($event)\"\n [disabled]=\"formData.id\"\n [matTooltip]=\"formData.id ? 'Type cannot be changed' : ''\"\n matTooltipPosition=\"below\"\n id=\"SelectedConfigType\"\n class=\"form-field-dropdown\"\n (keyup.enter)=\"preventEnterProp($event)\"\n >\n <option value=\"\">Select posture check type...</option>\n <option\n *ngFor=\"let type of postureCheckTypes\"\n [value]=\"type.id\"\n >\n {{ type.name }}\n </option>\n </select>\n </lib-form-field-container>\n <lib-form-field-container [title]=\"'MAC Addresses'\" [label]=\"'Required'\" *ngIf=\"formData.typeId === 'MAC'\">\n <p-chips (keyup)=\"macAddressesChange($event)\"\n [(ngModel)]=\"formData.macAddresses\"\n [allowDuplicate]=\"false\"\n placeholder=\"Enter mc addresses\"\n [addOnBlur]=\"true\"\n [ngClass]=\"{ error: errors['macAddresses'] }\"\n separator=\",\"\n (keyup.enter)=\"preventEnterProp($event)\"\n >\n </p-chips>\n </lib-form-field-container>\n <lib-form-field-container [title]=\"'Windows Domain Details'\" [label]=\"'Required'\" *ngIf=\"formData.typeId === 'DOMAIN'\">\n <p-chips (keyup)=\"macAddressesChange($event)\"\n [(ngModel)]=\"formData.domains\"\n [allowDuplicate]=\"false\"\n placeholder=\"Enter domains\"\n [addOnBlur]=\"true\"\n [ngClass]=\"{ error: errors['domains'] }\"\n separator=\",\"\n (keyup.enter)=\"preventEnterProp($event)\"\n >\n </p-chips>\n </lib-form-field-container>\n <lib-form-field-container [title]=\"'Process Details'\" [contentClass]=\"'form-field-input-group'\" *ngIf=\"formData.typeId === 'PROCESS'\">\n <div class=\"form-field-label-container process-os-details-header\">\n <div class=\"form-field-header\">\n <div class=\"form-field-title-container\">\n <span class=\"form-field-title\">Operating System</span>\n </div>\n <span class=\"form-field-label\" >Required</span>\n </div>\n <p-dropdown\n placeholder=\"Select configuration...\"\n optionLabel=\"name\"\n optionValue=\"type\"\n filterBy=\"name\"\n [options]=\"osTypes\"\n [filter]=\"false\"\n [showClear]=\"true\"\n [(ngModel)]=\"formData.process.osType\"\n (keyup.enter)=\"preventEnterProp($event)\"\n >\n <ng-template pTemplate=\"selectedItem\">\n <div class=\"os-type-dropdown-item\" *ngIf=\"formData.process.osType && formData.process.osType !== ''\">\n <div class=\"os-type-dropdown-icon\"\n [class]=\"'os-type-dropdown-icon-' + formData.process.osType\"\n ></div>\n <div>{{ formData.process.osType }}</div>\n </div>\n </ng-template>\n <ng-template let-os pTemplate=\"item\">\n <div class=\"os-type-dropdown-item\">\n <div class=\"os-type-dropdown-icon\"\n [class]=\"'os-type-dropdown-icon-' + os.type\"\n ></div>\n <div>{{ os.name }}</div>\n </div>\n </ng-template>\n </p-dropdown>\n </div>\n <div class=\"form-field-label-container\">\n <div class=\"form-field-header\">\n <div class=\"form-field-title-container\">\n <span class=\"form-field-title\">Hashes</span>\n <div\n class=\"form-field-info infoicon\"\n matTooltip=\"Valid sha256 hashes of a binary\"\n matTooltipPosition=\"below\"\n ></div>\n </div>\n <span class=\"form-field-label\" >Required</span>\n </div>\n <p-chips [(ngModel)]=\"formData.process.hashes\"\n [allowDuplicate]=\"false\"\n placeholder=\"Enter hashes\"\n [addOnBlur]=\"true\"\n [ngClass]=\"{ error: errors['processHashes'] }\"\n separator=\",\"\n (keyup.enter)=\"preventEnterProp($event)\"\n >\n </p-chips>\n </div>\n <div class=\"form-field-label-container\">\n <div class=\"form-field-header\">\n <div class=\"form-field-title-container\">\n <span class=\"form-field-title\">Path</span>\n </div>\n <span class=\"form-field-label\" >Required</span>\n </div>\n <input class=\"form-field-input\" placeholder=\"/path/to/process\" [(ngModel)]=\"formData.process.path\" [ngClass]=\"{error: errors['processPath']}\"/>\n </div>\n <div class=\"form-field-label-container\">\n <div class=\"form-field-header\">\n <div class=\"form-field-title-container\">\n <span class=\"form-field-title\">Fingerprint</span>\n <div\n class=\"form-field-info infoicon\"\n matTooltip=\"Fingerprints are the sha1 fingerprints (thumbprints) of valid signing certificates\"\n matTooltipPosition=\"below\"\n ></div>\n </div>\n <span class=\"form-field-label\" >Required</span>\n </div>\n <input class=\"form-field-input\" placeholder=\"Enter a fingerprint\" [(ngModel)]=\"formData.process.signerFingerprint\" [ngClass]=\"{error: errors['androidOSMin']}\"/>\n </div>\n </lib-form-field-container>\n <lib-form-field-container [title]=\"'Process Multi Details'\" *ngIf=\"formData.typeId === 'PROCESS_MULTI'\">\n <div class=\"form-field-label-container\">\n <div class=\"form-field-header\">\n <div class=\"form-field-title-container\">\n <span class=\"form-field-title\">Semantic</span>\n </div>\n <span class=\"form-field-label\" >Required</span>\n </div>\n <select\n [(ngModel)]=\"formData.semantic\"\n id=\"PolicySemantic\"\n class=\"form-field-dropdown\"\n >\n <option value=\"AllOf\">AllOf</option>\n <option value=\"AnyOf\">AnyOf</option>\n </select>\n </div>\n <div class=\"process-multi-item form-field-input-group\" *ngFor=\"let process of processMultiItems; index as i\">\n <div class=\"icon-clear\" *ngIf=\"processMultiItems.length > 1\" (click)=\"removeProcessItem(i)\"></div>\n <div class=\"form-field-label-container process-os-details-header\">\n <div class=\"form-field-header\">\n <div class=\"form-field-title-container\">\n <span class=\"form-field-title\">Operating System</span>\n </div>\n <span class=\"form-field-label\" >Required</span>\n </div>\n <p-dropdown\n placeholder=\"Select configuration...\"\n optionLabel=\"name\"\n optionValue=\"type\"\n filterBy=\"name\"\n [options]=\"osTypes\"\n [filter]=\"false\"\n [showClear]=\"true\"\n [(ngModel)]=\"process.osType\"\n (keyup.enter)=\"preventEnterProp($event)\"\n >\n <ng-template pTemplate=\"selectedItem\">\n <div class=\"os-type-dropdown-item\" *ngIf=\"process.osType && process.osType !== ''\">\n <div class=\"os-type-dropdown-icon\"\n [class]=\"'os-type-dropdown-icon-' + process.osType\"\n ></div>\n <div>{{ process.osType }}</div>\n </div>\n </ng-template>\n <ng-template let-os pTemplate=\"item\">\n <div class=\"os-type-dropdown-item\">\n <div class=\"os-type-dropdown-icon\"\n [class]=\"'os-type-dropdown-icon-' + os.type\"\n ></div>\n <div>{{ os.name }}</div>\n </div>\n </ng-template>\n </p-dropdown>\n </div>\n <div class=\"form-field-label-container\">\n <div class=\"form-field-header\">\n <div class=\"form-field-title-container\">\n <span class=\"form-field-title\">Hashes</span>\n <div\n class=\"form-field-info infoicon\"\n matTooltip=\"Valid sha256 hashes of a binary\"\n matTooltipPosition=\"below\"\n ></div>\n </div>\n <span class=\"form-field-label\" >Required</span>\n </div>\n <p-chips [(ngModel)]=\"process.hashes\"\n [allowDuplicate]=\"false\"\n placeholder=\"Enter hashes\"\n [addOnBlur]=\"true\"\n [ngClass]=\"{ error: errors['processHashes'] }\"\n separator=\",\"\n (keyup.enter)=\"preventEnterProp($event)\"\n >\n </p-chips>\n </div>\n <div class=\"form-field-label-container\">\n <div class=\"form-field-header\">\n <div class=\"form-field-title-container\">\n <span class=\"form-field-title\">Path</span>\n </div>\n <span class=\"form-field-label\" >Required</span>\n </div>\n <input class=\"form-field-input\" placeholder=\"/path/to/process\" [(ngModel)]=\"process.path\" [ngClass]=\"{error: errors['processPath']}\"/>\n </div>\n <div class=\"form-field-label-container\">\n <div class=\"form-field-header\">\n <div class=\"form-field-title-container\">\n <span class=\"form-field-title\">Fingerprint</span>\n <div\n class=\"form-field-info infoicon\"\n matTooltip=\"Signer fingerprints are the sha1 fingerprints (thumbprints) of valid signing certificates\"\n matTooltipPosition=\"below\"\n ></div>\n </div>\n <span class=\"form-field-label\" >Required</span>\n </div>\n <p-chips (keyup)=\"macAddressesChange($event)\"\n [(ngModel)]=\"process.signerFingerprints\"\n [allowDuplicate]=\"false\"\n placeholder=\"Enter signer fingerprints\"\n [addOnBlur]=\"true\"\n [ngClass]=\"{ error: errors['process[' + i +'].signerFingerprints'] }\"\n separator=\",\"\n (keyup.enter)=\"preventEnterProp($event)\"\n />\n </div>\n </div>\n <div class=\"buttons process-multi-buttons\">\n <button class=\"button\" (click)=\"addProcessItem()\">Add Another Process</button>\n </div>\n </lib-form-field-container>\n <lib-form-field-container\n [title]=\"'Multi Factor Details'\"\n [layout]=\"'column'\"\n *ngIf=\"formData.typeId === 'MFA'\"\n >\n <div class=\"form-field-row\">\n <div class=\"form-field-label-container\">\n <div class=\"form-field-title-container\">\n <span class=\"form-field-title\">Timeout (seconds)</span>\n </div>\n <input class=\"form-field-input\" placeholder=\"# in seconds\" [(ngModel)]=\"formData.timeoutSeconds\" [ngClass]=\"{error: errors['timeoutSeconds']}\" type=\"number\"/>\n </div>\n <div class=\"config-item os-toggle-container\" (click)=\"toggleMFAPrompt('wake')\">\n <div class=\"form-field-title-container\">\n <span class=\"form-field-title\">Require On Wake</span>\n </div>\n <div class=\"config-container toggle-container os-toggle-container\">\n <div class=\"form-field-title-container\">\n <div class=\"config-container-label\">Require</div>\n </div>\n <div\n [ngClass]=\"{ on: formData.promptOnWake }\"\n class=\"toggle\"\n >\n <span [hidden]=\"!formData.promptOnWake\" class=\"on-label\">YES</span>\n <span [hidden]=\"formData.promptOnWake\" class=\"off-label\">NO</span>\n <div class=\"switch\"></div>\n </div>\n </div>\n </div>\n <div class=\"config-item os-toggle-container\" (click)=\"toggleMFAPrompt('unlock')\">\n <div class=\"form-field-title-container\">\n <span class=\"form-field-title\">Require On Unlock</span>\n </div>\n <div class=\"config-container toggle-container os-toggle-container\">\n <div class=\"form-field-title-container\">\n <div class=\"config-container-label\">Require</div>\n </div>\n <div\n [ngClass]=\"{ on: formData.promptOnUnlock }\"\n class=\"toggle\"\n >\n <span [hidden]=\"!formData.promptOnUnlock\" class=\"on-label\">YES</span>\n <span [hidden]=\"formData.promptOnUnlock\" class=\"off-label\">NO</span>\n <div class=\"switch\"></div>\n </div>\n </div>\n </div>\n </div>\n </lib-form-field-container>\n <lib-form-field-container\n [showHeader]=\"false\"\n [layout]=\"'column'\"\n *ngIf=\"formData.typeId === 'OS'\"\n >\n <div class=\"form-field-row os-version-row\">\n <div class=\"config-item os-toggle-container\">\n <div class=\"form-field-title-container\">\n <span class=\"form-field-title\">Operating System</span>\n </div>\n <div class=\"config-container toggle-container os-toggle-container\"\n (click)=\"toggleOS('Android')\">\n <div class=\"form-field-title-container\">\n <div class=\"pc-os-button android-os-button\"></div>\n <div class=\"config-container-label\">Android</div>\n </div>\n <div\n [ngClass]=\"{ on: osCheckData.Android.enabled }\"\n class=\"toggle\"\n >\n <span [hidden]=\"!osCheckData.Android.enabled\" class=\"on-label\">YES</span>\n <span [hidden]=\"osCheckData.Android.enabled\" class=\"off-label\">NO</span>\n <div class=\"switch\"></div>\n </div>\n </div>\n </div>\n <div class=\"form-field-label-container\">\n <div class=\"form-field-title-container\">\n <span class=\"form-field-title\">Min Version</span>\n </div>\n <input class=\"form-field-input\" placeholder=\"#.#.#\" [matTooltip]=\"osCheckData.Android.isAdvanced ? 'Use JSON view to edit' : ''\" [(ngModel)]=\"osCheckData.Android.min\" [ngClass]=\"{error: errors['androidOSMin']}\" [disabled]=\"!osCheckData.Android.enabled || osCheckData.Android.isAdvanced\"/>\n </div>\n <div class=\"form-field-label-container\">\n <div class=\"form-field-title-container\">\n <span class=\"form-field-title\">Max Version</span>\n </div>\n <input class=\"form-field-input\" placeholder=\"#.#.#\" [matTooltip]=\"osCheckData.Android.isAdvanced ? 'Use JSON view to edit' : ''\" [(ngModel)]=\"osCheckData.Android.max\" [ngClass]=\"{error: errors['androidOSMax']}\" [disabled]=\"!osCheckData.Android.enabled || osCheckData.Android.isAdvanced\"/>\n </div>\n </div>\n <div class=\"form-field-row os-version-row\">\n <div class=\"config-item os-toggle-container\"\n (click)=\"toggleOS('iOS')\">\n <div class=\"config-container toggle-container os-toggle-container\">\n <div class=\"form-field-title-container\">\n <div class=\"pc-os-button ios-os-button\"></div>\n <div class=\"config-container-label\">iOS</div>\n </div>\n <div\n [ngClass]=\"{ on: osCheckData.iOS.enabled }\"\n class=\"toggle\"\n >\n <span [hidden]=\"!osCheckData.iOS.enabled\" class=\"on-label\">YES</span>\n <span [hidden]=\"osCheckData.iOS.enabled\" class=\"off-label\">NO</span>\n <div class=\"switch\"></div>\n </div>\n </div>\n </div>\n <div class=\"form-field-label-container\">\n <input class=\"form-field-input\" placeholder=\"#.#.#\" [matTooltip]=\"osCheckData.iOS.isAdvanced ? 'Use JSON view to edit' : ''\" [(ngModel)]=\"osCheckData.iOS.min\" [ngClass]=\"{error: errors['iOS']}\" [disabled]=\"!osCheckData.iOS.enabled || osCheckData.iOS.isAdvanced\"/>\n </div>\n <div class=\"form-field-label-container\">\n <input class=\"form-field-input\" placeholder=\"#.#.#\" [matTooltip]=\"osCheckData.iOS.isAdvanced ? 'Use JSON view to edit' : ''\" [(ngModel)]=\"osCheckData.iOS.max\" [ngClass]=\"{error: errors['iOS']}\" [disabled]=\"!osCheckData.iOS.enabled || osCheckData.iOS.isAdvanced\"/>\n </div>\n </div>\n <div class=\"form-field-row os-version-row\">\n <div class=\"config-item os-toggle-container\"\n (click)=\"toggleOS('Linux')\">\n <div class=\"config-container toggle-container os-toggle-container\">\n <div class=\"form-field-title-container\">\n <div class=\"pc-os-button linux-os-button\"></div>\n <div class=\"config-container-label\">Linux</div>\n </div>\n <div\n [ngClass]=\"{ on: osCheckData.Linux.enabled }\"\n class=\"toggle\"\n >\n <span [hidden]=\"!osCheckData.Linux.enabled\" class=\"on-label\">YES</span>\n <span [hidden]=\"osCheckData.Linux.enabled\" class=\"off-label\">NO</span>\n <div class=\"switch\"></div>\n </div>\n </div>\n </div>\n <div class=\"form-field-label-container\">\n <input class=\"form-field-input\" placeholder=\"#.#.#\" [matTooltip]=\"osCheckData.Linux.isAdvanced ? 'Use JSON view to edit' : ''\" [(ngModel)]=\"osCheckData.Linux.min\" [ngClass]=\"{error: errors['linuxOS']}\" [disabled]=\"!osCheckData.Linux.enabled || osCheckData.Linux.isAdvanced\"/>\n </div>\n <div class=\"form-field-label-container\">\n <input class=\"form-field-input\" placeholder=\"#.#.#\" [matTooltip]=\"osCheckData.Linux.isAdvanced ? 'Use JSON view to edit' : ''\" [(ngModel)]=\"osCheckData.Linux.max\" [ngClass]=\"{error: errors['linuxOS']}\" [disabled]=\"!osCheckData.Linux.enabled || osCheckData.Linux.isAdvanced\"/>\n </div>\n </div>\n <div class=\"form-field-row os-version-row\">\n <div class=\"config-item os-toggle-container\">\n <div class=\"config-container toggle-container os-toggle-container\"\n (click)=\"toggleOS('macOS')\">\n <div class=\"form-field-title-container\">\n <div class=\"pc-os-button mac-os-button\"></div>\n <div class=\"config-container-label\">macOS</div>\n </div>\n <div\n [ngClass]=\"{ on: osCheckData.macOS.enabled }\"\n class=\"toggle\"\n >\n <span [hidden]=\"!osCheckData.macOS.enabled\" class=\"on-label\">YES</span>\n <span [hidden]=\"osCheckData.macOS.enabled\" class=\"off-label\">NO</span>\n <div class=\"switch\"></div>\n </div>\n </div>\n </div>\n <div class=\"form-field-label-container\">\n <input class=\"form-field-input\" placeholder=\"#.#.#\" [matTooltip]=\"osCheckData.macOS.isAdvanced ? 'Use JSON view to edit' : ''\" [(ngModel)]=\"osCheckData.macOS.min\" [ngClass]=\"{error: errors['macOS']}\" [disabled]=\"!osCheckData.macOS.enabled || osCheckData.macOS.isAdvanced\"/>\n </div>\n <div class=\"form-field-label-container\">\n <input class=\"form-field-input\" placeholder=\"#.#.#\" [matTooltip]=\"osCheckData.macOS.isAdvanced ? 'Use JSON view to edit' : ''\" [(ngModel)]=\"osCheckData.macOS.max\" [ngClass]=\"{error: errors['macOS']}\" [disabled]=\"!osCheckData.macOS.enabled || osCheckData.macOS.isAdvanced\"/>\n </div>\n </div>\n <div class=\"form-field-row os-version-row\">\n <div class=\"config-item os-toggle-container\"\n (click)=\"toggleOS('Windows')\">\n <div class=\"config-container toggle-container os-toggle-container\">\n <div class=\"form-field-title-container\">\n <div class=\"pc-os-button windows-os-button\"></div>\n <div class=\"config-container-label\">Windows</div>\n </div>\n <div\n [ngClass]=\"{ on: osCheckData.Windows.enabled }\"\n class=\"toggle\"\n >\n <span [hidden]=\"!osCheckData.Windows.enabled\" class=\"on-label\">YES</span>\n <span [hidden]=\"osCheckData.Windows.enabled\" class=\"off-label\">NO</span>\n <div class=\"switch\"></div>\n </div>\n </div>\n </div>\n <div class=\"form-field-label-container\">\n <input class=\"form-field-input\" placeholder=\"#.#.#\" [matTooltip]=\"osCheckData.Windows.isAdvanced ? 'Use JSON view to edit' : ''\" [(ngModel)]=\"osCheckData.Windows.min\" [ngClass]=\"{error: errors['windowsOS']}\" [disabled]=\"!osCheckData.Windows.enabled || osCheckData.Windows.isAdvanced\"/>\n </div>\n <div class=\"form-field-label-container\">\n <input class=\"form-field-input\" placeholder=\"#.#.#\" [matTooltip]=\"osCheckData.Windows.isAdvanced ? 'Use JSON view to edit' : ''\" [(ngModel)]=\"osCheckData.Windows.max\" [ngClass]=\"{error: errors['windowsOS']}\" [disabled]=\"!osCheckData.Windows.enabled || osCheckData.Windows.isAdvanced\"/>\n </div>\n </div>\n <div class=\"form-field-row os-version-row\">\n <div class=\"config-item os-toggle-container\"\n (click)=\"toggleOS('WindowsServer')\">\n <div class=\"config-container toggle-container os-toggle-container\">\n <div class=\"form-field-title-container\">\n <div class=\"pc-os-button windows-server-os-button\"></div>\n <div class=\"config-container-label\">Windows Server</div>\n </div>\n <div\n [ngClass]=\"{ on: osCheckData.WindowsServer.enabled }\"\n class=\"toggle\"\n >\n <span [hidden]=\"!osCheckData.WindowsServer.enabled\" class=\"on-label\">YES</span>\n <span [hidden]=\"osCheckData.WindowsServer.enabled\" class=\"off-label\">NO</span>\n <div class=\"switch\"></div>\n </div>\n </div>\n </div>\n <div class=\"form-field-label-container\">\n <input class=\"form-field-input\" placeholder=\"#.#.#\" [matTooltip]=\"osCheckData.WindowsServer.isAdvanced ? 'Use JSON view to edit' : ''\" [(ngModel)]=\"osCheckData.WindowsServer.min\" [ngClass]=\"{error: errors['windowsServerOS']}\" [disabled]=\"!osCheckData.WindowsServer.enabled || osCheckData.WindowsServer.isAdvanced\"/>\n </div>\n <div class=\"form-field-label-container\">\n <input class=\"form-field-input\" placeholder=\"#.#.#\" [matTooltip]=\"osCheckData.WindowsServer.isAdvanced ? 'Use JSON view to edit' : ''\" [(ngModel)]=\"osCheckData.WindowsServer.max\" [ngClass]=\"{error: errors['windowsServerOS']}\" [disabled]=\"!osCheckData.WindowsServer.enabled || osCheckData.WindowsServer.isAdvanced\"/>\n </div>\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: [".posture-check-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% - .9375rem);min-width:34.375rem;max-width:43.75rem}.form-group-column.two-fifths{max-width:43.75rem}::ng-deep #jsoneditor{max-height:32rem;overflow:hidden}.os-toggle-container{gap:var(--gapSmall)}.os-toggle-container .config-container-label{text-transform:unset}.os-toggle-container{height:var(--defaultInputHeight);cursor:pointer}.os-toggle-container:hover .pc-os-button{transform:scale(1.05)}.os-version-row input:disabled{color:transparent!important}.os-version-row input:disabled::placeholder{color:transparent!important}.process-os-details-header{margin-top:var(--marginSmall)}input:disabled,select:disabled,textarea:disabled{opacity:.3!important;cursor:not-allowed}.process-multi-buttons{display:flex;flex-direction:row;justify-content:flex-end;margin:0}.process-multi-buttons button{background-color:var(--primaryColor);box-shadow:none;font-size:.75rem}.process-multi-buttons button:hover{filter:brightness(.8)}.process-multi-buttons button:active{transform:translateY(.0625rem)}.process-multi-item{display:flex;flex-direction:column;position:relative;gap:var(--gapMedium);border-width:.125rem;border-color:var(--menu);border-style:solid;padding:var(--paddingMedium);border-radius:var(--inputBorderRadius)}.process-multi-item .icon-clear{position:absolute;top:0;right:0;color:var(--red);margin-top:-.5rem;margin-right:-.5rem;background:var(--background);font-size:1.5rem;border-radius:2rem;cursor:pointer}.process-multi-item .icon-clear:hover{filter:brightness(.8)}.process-multi-item .icon-clear:active{transform:translateY(.0625rem)}.os-type-dropdown-item{display:flex;flex-direction:row;align-items:center;justify-content:flex-start;gap:var(--gapMedium)}.os-type-dropdown-item div{font-size:.875rem!important;font-family:Open Sans,Arial,sans-serif;color:var(--tableText)}.os-type-dropdown-item .os-type-dropdown-icon{background-size:1.75rem;height:1.75rem;width:1.75rem;display:inline-block;background-position-x:center;background-position-y:center}.os-type-dropdown-item .os-type-dropdown-icon.os-type-dropdown-icon-Android{background-image:url(/assets/images/android-os.png)}.os-type-dropdown-item .os-type-dropdown-icon.os-type-dropdown-icon-iOS{background-image:url(/assets/images/ios-os.png)}.os-type-dropdown-item .os-type-dropdown-icon.os-type-dropdown-icon-Linux{background-image:url(/assets/images/linux-os.png)}.os-type-dropdown-item .os-type-dropdown-icon.os-type-dropdown-icon-macOS{background-image:url(/assets/images/mac-os.png)}.os-type-dropdown-item .os-type-dropdown-icon.os-type-dropdown-icon-Windows{background-image:url(/assets/images/windows-os.png)}.os-type-dropdown-item .os-type-dropdown-icon.os-type-dropdown-icon-WindowsServer{background-image:url(/assets/images/windows-server-os.png)}.pc-os-button{background-size:2rem;height:2rem;width:2rem;display:inline-block;background-position-x:center;background-position-y:center;margin-right:.5rem}.pc-os-button.android-os-button{background-image:url(/assets/images/android-os.png)}.pc-os-button.ios-os-button{background-image:url(/assets/images/ios-os.png)}.pc-os-button.linux-os-button{background-image:url(/assets/images/linux-os.png)}.pc-os-button.mac-os-button{background-image:url(/assets/images/mac-os.png)}.pc-os-button.windows-os-button{background-image:url(/assets/images/windows-os.png)}.pc-os-button.windows-server-os-button{background-color:var(--offWhite_ALWAYS);border-radius:2rem;width:2rem;height:2rem;min-width:2rem;background-size:1.625rem;background-image:url(/assets/images/windows-server-os.png)}::ng-deep .posture-check-form-container .p-dropdown-panel .p-dropdown-items .p-dropdown-item{font-size:.875rem!important;font-family:Open Sans,Arial,sans-serif;color:var(--tableText);padding:.25rem var(--paddingMedium)}::ng-deep .posture-check-form-container p-dropdown .p-dropdown.p-component .p-inputtext.p-dropdown-label{padding:0 var(--paddingMedium)}::ng-deep p-chips input[type=text]{width:100%}::ng-deep p-chips ul{padding:0}\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.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { 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: 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"] }, { kind: "directive", type: i9.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "directive", type: i3.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "component", type: i4$2.Dropdown, selector: "p-dropdown", inputs: ["id", "scrollHeight", "filter", "name", "style", "panelStyle", "styleClass", "panelStyleClass", "readonly", "required", "editable", "appendTo", "tabindex", "placeholder", "filterPlaceholder", "filterLocale", "inputId", "dataKey", "filterBy", "filterFields", "autofocus", "resetFilterOnHide", "dropdownIcon", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "autoDisplayFirst", "group", "showClear", "emptyFilterMessage", "emptyMessage", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "ariaLabel", "ariaLabelledBy", "filterMatchMode", "maxlength", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "focusOnHover", "selectOnFocus", "autoOptionFocus", "autofocusFilter", "disabled", "itemSize", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "filterValue", "options"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onShow", "onHide", "onClear", "onLazyLoad"] }, { kind: "component", type: FormHeaderComponent, selector: "lib-form-header", inputs: ["data", "badges", "title", "moreActions", "formView", "saveDisabled", "saveTooltip", "actionButtonText", "moreActionsText", "showHeaderToggle", "showHeaderButton"], 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", "contentClass", "showHeader", "showToggle", "headerActions", "headerToggle"], outputs: ["actionRequested", "headerToggleChange"] }, { 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", "showLineNumbers"], outputs: ["dataChange", "jsonChange", "jsonInvalidChange"] }, { kind: "component", type: TagSelectorComponent, selector: "lib-tag-selector", inputs: ["placeholder", "disableField", "disableCreate", "hideOption", "isLoading", "errorMessage", "focusOnInit", "selectedRoleAttributes", "selectedNamedAttributes", "hasError", "availableRoleAttributes", "availableNamedAttributes"], outputs: ["addRoleAttribute", "addNamedAttribute", "roleAttributeRemoved", "namedAttributeRemoved", "selectedRoleAttributesChange", "selectedNamedAttributesChange", "filterChange"] }, { kind: "component", type: CustomTagsComponent, selector: "lib-custom-tags", inputs: ["tags"], outputs: ["tagsChange"] }] }); }
26168
26359
  }
26169
26360
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: PostureCheckFormComponent, decorators: [{
26170
26361
  type: Component,
@@ -26218,8 +26409,8 @@ class SessionsPageService extends ListPageServiceClass {
26218
26409
  noSearch: false,
26219
26410
  order: "asc",
26220
26411
  page: 1,
26221
- searchOn: "service",
26222
- sort: "service",
26412
+ searchOn: "id",
26413
+ sort: "id",
26223
26414
  total: 50
26224
26415
  };
26225
26416
  this.paging = this.DEFAULT_PAGING;
@@ -26227,7 +26418,7 @@ class SessionsPageService extends ListPageServiceClass {
26227
26418
  this.selectedConfig = {};
26228
26419
  this.modalType = '';
26229
26420
  this.menuItems = [
26230
- { name: 'Edit', action: 'update' },
26421
+ { name: 'View', action: 'update' },
26231
26422
  { name: 'Delete', action: 'delete' },
26232
26423
  ];
26233
26424
  }
@@ -26256,9 +26447,9 @@ class SessionsPageService extends ListPageServiceClass {
26256
26447
  };
26257
26448
  return [
26258
26449
  {
26259
- colId: 'serviceName',
26260
- field: 'service.name',
26261
- headerName: 'Service',
26450
+ colId: 'id',
26451
+ field: 'id',
26452
+ headerName: 'ID',
26262
26453
  headerComponent: TableColumnDefaultComponent,
26263
26454
  headerComponentParams: this.headerComponentParams,
26264
26455
  cellRenderer: TableCellNameComponent,
@@ -26272,6 +26463,45 @@ class SessionsPageService extends ListPageServiceClass {
26272
26463
  resizable: true,
26273
26464
  cellClass: 'nf-cell-vert-align tCol',
26274
26465
  sortable: true,
26466
+ filter: false,
26467
+ sortColumn: this.sort.bind(this),
26468
+ },
26469
+ {
26470
+ colId: 'service.name',
26471
+ field: 'service.name',
26472
+ headerName: 'Service Name',
26473
+ headerComponent: TableColumnDefaultComponent,
26474
+ cellRenderer: TableCellNameComponent,
26475
+ cellRendererParams: { pathRoot: 'services/advanced', itemProp: 'service.id' },
26476
+ onCellClicked: (data) => {
26477
+ if (this.hasSelectedText()) {
26478
+ return;
26479
+ }
26480
+ this.openEditForm(data?.data?.id);
26481
+ },
26482
+ resizable: true,
26483
+ cellClass: 'nf-cell-vert-align tCol',
26484
+ sortable: false,
26485
+ filter: false,
26486
+ sortColumn: this.sort.bind(this),
26487
+ },
26488
+ {
26489
+ colId: 'service',
26490
+ field: 'service.id',
26491
+ headerName: 'Service ID',
26492
+ headerComponent: TableColumnDefaultComponent,
26493
+ headerComponentParams: this.headerComponentParams,
26494
+ cellRenderer: TableCellNameComponent,
26495
+ cellRendererParams: { pathRoot: 'services/advanced', itemProp: 'service.id' },
26496
+ onCellClicked: (data) => {
26497
+ if (this.hasSelectedText()) {
26498
+ return;
26499
+ }
26500
+ this.openEditForm(data?.data?.id);
26501
+ },
26502
+ resizable: true,
26503
+ cellClass: 'nf-cell-vert-align tCol',
26504
+ sortable: true,
26275
26505
  filter: true,
26276
26506
  sortColumn: this.sort.bind(this),
26277
26507
  },
@@ -26314,22 +26544,12 @@ class SessionsPageService extends ListPageServiceClass {
26314
26544
  resizable: true,
26315
26545
  cellClass: 'nf-cell-vert-align tCol',
26316
26546
  width: this.remToPx(10),
26317
- },
26318
- {
26319
- colId: 'id',
26320
- field: 'id',
26321
- headerName: 'ID',
26322
- headerComponent: TableColumnDefaultComponent,
26323
- resizable: true,
26324
- cellClass: 'nf-cell-vert-align tCol',
26325
- width: this.remToPx(10),
26326
- hide: true
26327
26547
  }
26328
26548
  ];
26329
26549
  }
26330
26550
  getData(filters, sort) {
26331
26551
  if (sort.sortBy === 'name') {
26332
- sort.sortBy = 'service';
26552
+ sort.sortBy = 'id';
26333
26553
  }
26334
26554
  // we can customize filters or sorting here before moving on...
26335
26555
  return super.getTableData('sessions', this.paging, filters, sort)
@@ -26471,11 +26691,11 @@ class SessionsPageComponent extends ListPageComponent {
26471
26691
  this.formDataChanged = event;
26472
26692
  }
26473
26693
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: SessionsPageComponent, deps: [{ token: SessionsPageService }, { token: DataTableFilterService }, { token: TabNameService }, { token: ConsoleEventsService }, { token: i5$1.MatDialog }], target: i0.ɵɵFactoryTarget.Component }); }
26474
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: SessionsPageComponent, selector: "lib-sessions", usesInheritance: true, ngImport: i0, template: "<div class=\"ziti-page-container ziti-sessions-container\">\n <lib-list-page-header [title]=\"title\"\n [tabs]=\"tabs\"\n [hideAction]=\"true\"\n (actionClicked)=\"headerActionClicked($event)\"></lib-list-page-header>\n\n <lib-data-table [tableId]=\"'sessions'\"\n [rowData]=\"rowData\"\n [columnDefinitions]=\"columnDefs\"\n (actionRequested)=\"tableAction($event)\"\n [startCount]=\"startCount\"\n [endCount]=\"endCount\"\n [totalCount]=\"totalCount\"\n [emptyMsg]=\"'No Sessions defined'\"\n [filterApplied]=\"filterApplied\"\n [filterColumn]=\"'service'\"\n [filterName]=\"'service'\"\n [menuItems]=\"svc.menuItems\"\n (gridReady)=\"gridReady($event)\"\n >\n </lib-data-table>\n</div>\n<lib-loading-indicator *ngIf=\"isLoading\" [isLoading]=\"isLoading\"></lib-loading-indicator>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: ListPageHeaderComponent, selector: "lib-list-page-header", inputs: ["title", "tabs", "showAdd", "hideAction"], outputs: ["actionClicked"] }, { kind: "component", type: DataTableComponent, selector: "lib-data-table", inputs: ["rowData", "expandRowData", "collapseRowData", "rowValidation", "isTimeSearchAvailable", "isLoading", "tableId", "options", "validateService", "rowsToggled", "tableRefreshCount", "view", "serverSideDataSource", "allowDownload", "startCount", "endCount", "totalCount", "emptyMsg", "filterApplied", "menuItems", "headerActions", "noItemsClass", "entityTypeName", "showNoItemsAdd", "currentPage", "noItemsImage", "rowHeight", "filterName", "filterColumn", "columnDefinitions", "refreshCount"], outputs: ["actionRequested", "gridReady", "dragStart", "dragLeave", "pageChanged"] }, { kind: "component", type: LoadingIndicatorComponent, selector: "lib-loading-indicator", inputs: ["isLoading"] }] }); }
26694
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: SessionsPageComponent, selector: "lib-sessions", usesInheritance: true, ngImport: i0, template: "<div class=\"ziti-page-container ziti-sessions-container\">\n <lib-list-page-header [title]=\"title\"\n [tabs]=\"tabs\"\n [hideAction]=\"true\"\n (actionClicked)=\"headerActionClicked($event)\"></lib-list-page-header>\n\n <lib-data-table [tableId]=\"'sessions'\"\n [rowData]=\"rowData\"\n [columnDefinitions]=\"columnDefs\"\n (actionRequested)=\"tableAction($event)\"\n [startCount]=\"startCount\"\n [endCount]=\"endCount\"\n [totalCount]=\"totalCount\"\n [emptyMsg]=\"'No Sessions defined'\"\n [filterApplied]=\"filterApplied\"\n [filterColumn]=\"'id'\"\n [filterName]=\"'id'\"\n [menuItems]=\"svc.menuItems\"\n [showNoItemsAdd]=\"false\"\n (gridReady)=\"gridReady($event)\"\n >\n </lib-data-table>\n</div>\n<lib-loading-indicator *ngIf=\"isLoading\" [isLoading]=\"isLoading\"></lib-loading-indicator>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: ListPageHeaderComponent, selector: "lib-list-page-header", inputs: ["title", "tabs", "showAdd", "hideAction"], outputs: ["actionClicked"] }, { kind: "component", type: DataTableComponent, selector: "lib-data-table", inputs: ["rowData", "expandRowData", "collapseRowData", "rowValidation", "isTimeSearchAvailable", "isLoading", "tableId", "options", "validateService", "rowsToggled", "tableRefreshCount", "view", "serverSideDataSource", "allowDownload", "startCount", "endCount", "totalCount", "emptyMsg", "filterApplied", "menuItems", "headerActions", "noItemsClass", "entityTypeName", "showNoItemsAdd", "currentPage", "noItemsImage", "rowHeight", "filterName", "filterColumn", "columnDefinitions", "refreshCount"], outputs: ["actionRequested", "gridReady", "dragStart", "dragLeave", "pageChanged"] }, { kind: "component", type: LoadingIndicatorComponent, selector: "lib-loading-indicator", inputs: ["isLoading"] }] }); }
26475
26695
  }
26476
26696
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: SessionsPageComponent, decorators: [{
26477
26697
  type: Component,
26478
- args: [{ selector: 'lib-sessions', template: "<div class=\"ziti-page-container ziti-sessions-container\">\n <lib-list-page-header [title]=\"title\"\n [tabs]=\"tabs\"\n [hideAction]=\"true\"\n (actionClicked)=\"headerActionClicked($event)\"></lib-list-page-header>\n\n <lib-data-table [tableId]=\"'sessions'\"\n [rowData]=\"rowData\"\n [columnDefinitions]=\"columnDefs\"\n (actionRequested)=\"tableAction($event)\"\n [startCount]=\"startCount\"\n [endCount]=\"endCount\"\n [totalCount]=\"totalCount\"\n [emptyMsg]=\"'No Sessions defined'\"\n [filterApplied]=\"filterApplied\"\n [filterColumn]=\"'service'\"\n [filterName]=\"'service'\"\n [menuItems]=\"svc.menuItems\"\n (gridReady)=\"gridReady($event)\"\n >\n </lib-data-table>\n</div>\n<lib-loading-indicator *ngIf=\"isLoading\" [isLoading]=\"isLoading\"></lib-loading-indicator>\n" }]
26698
+ args: [{ selector: 'lib-sessions', template: "<div class=\"ziti-page-container ziti-sessions-container\">\n <lib-list-page-header [title]=\"title\"\n [tabs]=\"tabs\"\n [hideAction]=\"true\"\n (actionClicked)=\"headerActionClicked($event)\"></lib-list-page-header>\n\n <lib-data-table [tableId]=\"'sessions'\"\n [rowData]=\"rowData\"\n [columnDefinitions]=\"columnDefs\"\n (actionRequested)=\"tableAction($event)\"\n [startCount]=\"startCount\"\n [endCount]=\"endCount\"\n [totalCount]=\"totalCount\"\n [emptyMsg]=\"'No Sessions defined'\"\n [filterApplied]=\"filterApplied\"\n [filterColumn]=\"'id'\"\n [filterName]=\"'id'\"\n [menuItems]=\"svc.menuItems\"\n [showNoItemsAdd]=\"false\"\n (gridReady)=\"gridReady($event)\"\n >\n </lib-data-table>\n</div>\n<lib-loading-indicator *ngIf=\"isLoading\" [isLoading]=\"isLoading\"></lib-loading-indicator>\n" }]
26479
26699
  }], ctorParameters: function () { return [{ type: SessionsPageService }, { type: DataTableFilterService }, { type: TabNameService }, { type: ConsoleEventsService }, { type: i5$1.MatDialog }]; } });
26480
26700
 
26481
26701
  class SessionFormService {
@@ -26717,7 +26937,7 @@ class SessionFormComponent extends ProjectableForm {
26717
26937
  provide: MatDialogRef,
26718
26938
  useValue: {}
26719
26939
  }
26720
- ], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div class=\"projectable-form-wrapper\"\n (keyup.enter)=\"save($event)\"\n (keyup.escape)=\"closeModal(false)\"\n>\n <lib-form-header\n [data]=\"formData\"\n [title]=\"'Session Details'\"\n [moreActions]=\"moreActions\"\n (actionRequested)=\"headerActionRequested($event)\"\n [(formView)]=\"formView\"\n [showHeaderButton]=\"false\"\n ></lib-form-header>\n <div class=\"edge-router-form-container projectable-form-container\">\n <div class=\"projectable-form-main-column form-group-row\" *ngIf=\"formView === 'simple'\">\n <div class=\"form-group-column three-fifths\">\n <lib-form-field-container [showHeader]=\"false\">\n <div class=\"form-field-label-container\">\n <div class=\"form-field-title-container\">\n <span class=\"form-field-title\">ID</span>\n </div>\n <div class=\"config-container\">\n <span>{{formData.id}}</span>\n </div>\n </div>\n <div class=\"form-field-label-container\">\n <div class=\"form-field-title-container\">\n <span class=\"form-field-title\">Service Name</span>\n </div>\n <a class=\"form-field-link\" [href]=\"'./services/' + formData.service.id\" (click)=\"serviceNameLinkClicked($event)\">\n <div class=\"config-container config-container-clickable\">\n <span>{{formData.service.name}}</span>\n </div>\n </a>\n </div>\n <div class=\"form-field-label-container\">\n <div class=\"form-field-title-container\">\n <span class=\"form-field-title\">Identity Name</span>\n </div>\n <a class=\"form-field-link\" [href]=\"'./identities/' + associatedIdentity.id\" (click)=\"identityNameLinkClicked($event)\">\n <div class=\"config-container config-container-clickable\">\n <div class=\"entity-name-and-spinner\">\n <span>{{associatedIdentity.name}}</span>\n <div class=\"spinner\" *ngIf=\"identityLoading\"></div>\n </div>\n </div>\n </a>\n </div>\n <div class=\"form-field-label-container\">\n <div class=\"form-field-title-container\">\n <span class=\"form-field-title\">API Session ID</span>\n </div>\n <a class=\"form-field-link\" [href]=\"'./api-sessions/' + formData.apiSessionId\" (click)=\"apiSessionLinkClicked($event)\">\n <div class=\"config-container config-container-clickable\">\n <span>{{formData.apiSessionId}}</span>\n </div>\n </a>\n </div>\n <div class=\"form-field-label-container\">\n <div class=\"form-field-title-container\">\n <span class=\"form-field-title\">Type</span>\n </div>\n <div class=\"config-container\">\n <span>{{formData.type}}</span>\n </div>\n </div>\n <div class=\"form-field-label-container\">\n <div class=\"form-field-title-container\">\n <span class=\"form-field-title\">Created At</span>\n </div>\n <div class=\"config-container\">\n <span>{{moment(formData.createdAt).format(\"M/D/YYYY h:mm A\")}}</span>\n </div>\n </div>\n <div class=\"form-field-label-container\">\n <div class=\"form-field-title-container\">\n <span class=\"form-field-title\">Updated At</span>\n </div>\n <div class=\"config-container\">\n <span>{{moment(formData.updatedAt).format(\"M/D/YYYY h:mm A\")}}</span>\n </div>\n </div>\n </lib-form-field-container>\n <ng-content select=\"[slot=column-1-slot-1]\"></ng-content>\n </div>\n <div class=\"form-group-column two-fifths\">\n <lib-form-field-container\n [title]=\"'Associated Entities'\"\n [label]=\"'Click for detailed view'\"\n [helpText]=\"'List the edge routers and service policies that are associated with this session. Click on the entity name to navigate to the entity\\'s detailed view.'\"\n [class]=\"'no-gap'\"\n >\n <div class=\"form-row space-between\" style=\"margin-top: 0;\">\n <div class=\"config-title-row\">\n <span class=\"form-field-title\">Edge Routers</span>\n </div>\n <span class=\"form-field-count\">{{associatedEdgeRouters.length}}</span>\n </div>\n <lib-preview-list\n [isLoading]=\"false\"\n [allNames]=\"associatedEdgeRouters\"\n [allowRemove]=\"false\"\n [clickable]=\"true\"\n [showfilter]=\"false\"\n [tooltip]=\"'View Edge Router'\"\n (itemSelected)=\"previewEdgeRouter($event, router)\"\n ></lib-preview-list>\n <div class=\"form-row space-between\">\n <div class=\"config-title-row\">\n <span class=\"form-field-title\">Service Policies</span>\n </div>\n <span class=\"form-field-count\">{{associatedServicePolicies.length}}</span>\n </div>\n <lib-preview-list\n [isLoading]=\"false\"\n [clickable]=\"true\"\n (itemSelected)=\"previewServicePolicy($event, router)\"\n [tooltip]=\"'View Service Policy'\"\n [allNames]=\"associatedServicePolicies\"\n [showfilter]=\"false\"\n ></lib-preview-list>\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: ["::ng-deep .api-session-form-wrapper .form-header-container .form-header-toggle-container{margin-right:0!important}.form-field-dropdown{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'Stroke_Color' style%3D'enable-background%3Anew 0 0 20.2 10.8%3B' version%3D'1.1' viewBox%3D'0 0 20.2 10.8' 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 %23668291%3B %7D%3C%2Fstyle%3E %3Cg%3E%09%3Cpath class%3D'st0' d%3D'M19.8%2C1.7c0%2C0.4-0.1%2C0.7-0.4%2C0.9l-8.5%2C7.3c-0.5%2C0.4-1.2%2C0.4-1.6%2C0L0.7%2C2.7C0.2%2C2.2%2C0.2%2C1.5%2C0.6%2C0.9%09%09c0.5-0.5%2C1.2-0.6%2C1.8-0.1l7.7%2C6.6l7.7-6.6c0.5-0.5%2C1.3-0.4%2C1.8%2C0.1C19.7%2C1.2%2C19.8%2C1.5%2C19.8%2C1.7z'%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E\");background-position:center right .625rem;background-repeat:no-repeat;background-size:1.125rem;padding-right:1.75rem}.disabled{opacity:.5;pointer-events:none}.config-item{max-height:var(--defaultInputHeight);margin-top:1.15rem}::ng-deep .admin-toggle{width:100%;width:35%;display:flex}::ng-deep .admin-toggle .form-field-line{display:none}::ng-deep .admin-toggle .toggle{width:100%}::ng-deep .is-admin-container .form-field-title-container.title-container-2{width:35%!important}.svc-test-result{position:absolute;transition:var(--transition);height:0;width:100%;background-color:var(--background);bottom:0;font-weight:600;padding-left:.625rem;padding-right:.625rem;border-color:var(--inputBorder);border-style:solid;border-width:var(--inputBorderWidth);border-bottom-right-radius:var(--inputBorderRadius);border-bottom-left-radius:var(--inputBorderRadius);border-top-style:none}.svc-test-result.test-result-open{height:-moz-fit-content;height:fit-content;box-shadow:0 -.125rem .6875rem 0 var(--boxShadow);padding-bottom:.9375rem;padding-top:.9375rem}.svc-test-result .close.icon-close{top:.625rem;right:.625rem;font-size:1.125rem;height:1.125rem;width:1.125rem;line-height:1.125rem}::ng-deep .admin-toggle .form-field-toggle-container:focus .form-field-label{color:var(--primaryColor)}::ng-deep .admin-toggle .form-field-toggle-container:focus .form-field-line{border-color:var(--primaryColor)}::ng-deep .admin-toggle .form-field-toggle-container:focus .toggle{border-color:var(--primaryColor);border-style:solid;border-width:var(--inputBorderWidth)}::ng-deep .admin-toggle .form-field-toggle-container:focus .toggle .switch{top:.0625rem}.entity-name-and-spinner{display:flex;flex-direction:row;align-items:center;justify-content:flex-start}.spinner{border-right-color:var(--formBase);border-top-color:var(--formBase)}\n"], dependencies: [{ kind: "directive", type: i1$4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: FormHeaderComponent, selector: "lib-form-header", inputs: ["data", "badges", "title", "moreActions", "formView", "saveDisabled", "saveTooltip", "actionButtonText", "moreActionsText", "showHeaderToggle", "showHeaderButton"], 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", "contentClass", "showHeader", "showToggle", "headerActions", "headerToggle"], outputs: ["actionRequested", "headerToggleChange"] }, { kind: "component", type: PreviewListComponent, selector: "lib-preview-list", inputs: ["label", "clickable", "isLoading", "allNames", "items", "allowRemove", "tooltip", "showfilter"], outputs: ["itemSelected", "itemRemoved"] }, { 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"] }] }); }
26940
+ ], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div class=\"projectable-form-wrapper\"\n (keyup.enter)=\"save($event)\"\n (keyup.escape)=\"closeModal(false)\"\n>\n <lib-form-header\n [data]=\"formData\"\n [title]=\"'Session Details'\"\n [moreActions]=\"moreActions\"\n (actionRequested)=\"headerActionRequested($event)\"\n [(formView)]=\"formView\"\n [showHeaderButton]=\"false\"\n ></lib-form-header>\n <div class=\"edge-router-form-container projectable-form-container\">\n <div class=\"projectable-form-main-column form-group-row\" *ngIf=\"formView === 'simple'\">\n <div class=\"form-group-column three-fifths\">\n <lib-form-field-container [showHeader]=\"false\">\n <div class=\"form-field-label-container\">\n <div class=\"form-field-title-container\">\n <span class=\"form-field-title\">ID</span>\n </div>\n <div class=\"config-container\">\n <span>{{formData.id}}</span>\n </div>\n </div>\n <div class=\"form-field-label-container\">\n <div class=\"form-field-title-container\">\n <span class=\"form-field-title\">Service Name</span>\n </div>\n <a class=\"form-field-link\" [href]=\"'./services/' + formData.service.id\" (click)=\"serviceNameLinkClicked($event)\">\n <div class=\"config-container config-container-clickable\">\n <span>{{formData.service.name}}</span>\n </div>\n </a>\n </div>\n <div class=\"form-field-label-container\">\n <div class=\"form-field-title-container\">\n <span class=\"form-field-title\">Identity Name</span>\n </div>\n <a class=\"form-field-link\" [href]=\"'./identities/' + associatedIdentity.id\" (click)=\"identityNameLinkClicked($event)\">\n <div class=\"config-container config-container-clickable\">\n <div class=\"entity-name-and-spinner\">\n <span>{{associatedIdentity.name}}</span>\n <div class=\"spinner\" *ngIf=\"identityLoading\"></div>\n </div>\n </div>\n </a>\n </div>\n <div class=\"form-field-label-container\">\n <div class=\"form-field-title-container\">\n <span class=\"form-field-title\">API Session ID</span>\n </div>\n <a class=\"form-field-link\" [href]=\"'./api-sessions/' + formData.apiSessionId\" (click)=\"apiSessionLinkClicked($event)\">\n <div class=\"config-container config-container-clickable\">\n <span>{{formData.apiSessionId}}</span>\n </div>\n </a>\n </div>\n <div class=\"form-field-label-container\">\n <div class=\"form-field-title-container\">\n <span class=\"form-field-title\">Type</span>\n </div>\n <div class=\"config-container\">\n <span>{{formData.type}}</span>\n </div>\n </div>\n <div class=\"form-field-label-container\">\n <div class=\"form-field-title-container\">\n <span class=\"form-field-title\">Created At</span>\n </div>\n <div class=\"config-container\">\n <span>{{moment(formData.createdAt).format(\"M/D/YYYY h:mm A\")}}</span>\n </div>\n </div>\n <div class=\"form-field-label-container\">\n <div class=\"form-field-title-container\">\n <span class=\"form-field-title\">Updated At</span>\n </div>\n <div class=\"config-container\">\n <span>{{moment(formData.updatedAt).format(\"M/D/YYYY h:mm A\")}}</span>\n </div>\n </div>\n </lib-form-field-container>\n <ng-content select=\"[slot=column-1-slot-1]\"></ng-content>\n </div>\n <div class=\"form-group-column two-fifths\">\n <lib-form-field-container\n [title]=\"'Associated Entities'\"\n [label]=\"'Click for detailed view'\"\n [helpText]=\"'List the edge routers and service policies that are associated with this session. Click on the entity name to navigate to the entity\\'s detailed view.'\"\n [class]=\"'no-gap'\"\n >\n <div class=\"form-row space-between\" style=\"margin-top: 0;\">\n <div class=\"config-title-row\">\n <span class=\"form-field-title\">Edge Routers</span>\n </div>\n <span class=\"form-field-count\">{{associatedEdgeRouters.length}}</span>\n </div>\n <lib-preview-list\n [isLoading]=\"false\"\n [allNames]=\"associatedEdgeRouters\"\n [allowRemove]=\"false\"\n [clickable]=\"true\"\n [showfilter]=\"false\"\n [tooltip]=\"'View Edge Router'\"\n (itemSelected)=\"previewEdgeRouter($event, router)\"\n ></lib-preview-list>\n <div class=\"form-row space-between\">\n <div class=\"config-title-row\">\n <span class=\"form-field-title\">Service Policies</span>\n </div>\n <span class=\"form-field-count\">{{associatedServicePolicies.length}}</span>\n </div>\n <lib-preview-list\n [isLoading]=\"false\"\n [clickable]=\"true\"\n (itemSelected)=\"previewServicePolicy($event, router)\"\n [tooltip]=\"'View Service Policy'\"\n [allNames]=\"associatedServicePolicies\"\n [showfilter]=\"false\"\n ></lib-preview-list>\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: ["::ng-deep .api-session-form-wrapper .form-header-container .form-header-toggle-container{margin-right:0!important}.form-field-dropdown{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'Stroke_Color' style%3D'enable-background%3Anew 0 0 20.2 10.8%3B' version%3D'1.1' viewBox%3D'0 0 20.2 10.8' 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 %23668291%3B %7D%3C%2Fstyle%3E %3Cg%3E%09%3Cpath class%3D'st0' d%3D'M19.8%2C1.7c0%2C0.4-0.1%2C0.7-0.4%2C0.9l-8.5%2C7.3c-0.5%2C0.4-1.2%2C0.4-1.6%2C0L0.7%2C2.7C0.2%2C2.2%2C0.2%2C1.5%2C0.6%2C0.9%09%09c0.5-0.5%2C1.2-0.6%2C1.8-0.1l7.7%2C6.6l7.7-6.6c0.5-0.5%2C1.3-0.4%2C1.8%2C0.1C19.7%2C1.2%2C19.8%2C1.5%2C19.8%2C1.7z'%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E\");background-position:center right .625rem;background-repeat:no-repeat;background-size:1.125rem;padding-right:1.75rem}.disabled{opacity:.5;pointer-events:none}.config-item{max-height:var(--defaultInputHeight);margin-top:1.15rem}::ng-deep .admin-toggle{width:100%;width:35%;display:flex}::ng-deep .admin-toggle .form-field-line{display:none}::ng-deep .admin-toggle .toggle{width:100%}::ng-deep .is-admin-container .form-field-title-container.title-container-2{width:35%!important}.svc-test-result{position:absolute;transition:var(--transition);height:0;width:100%;background-color:var(--background);bottom:0;font-weight:600;padding-left:.625rem;padding-right:.625rem;border-color:var(--inputBorder);border-style:solid;border-width:var(--inputBorderWidth);border-bottom-right-radius:var(--inputBorderRadius);border-bottom-left-radius:var(--inputBorderRadius);border-top-style:none}.svc-test-result.test-result-open{height:-moz-fit-content;height:fit-content;box-shadow:0 -.125rem .6875rem 0 var(--boxShadow);padding-bottom:.9375rem;padding-top:.9375rem}.svc-test-result .close.icon-close{top:.625rem;right:.625rem;font-size:1.125rem;height:1.125rem;width:1.125rem;line-height:1.125rem}::ng-deep .admin-toggle .form-field-toggle-container:focus .form-field-label{color:var(--primaryColor)}::ng-deep .admin-toggle .form-field-toggle-container:focus .form-field-line{border-color:var(--primaryColor)}::ng-deep .admin-toggle .form-field-toggle-container:focus .toggle{border-color:var(--primaryColor);border-style:solid;border-width:var(--inputBorderWidth)}::ng-deep .admin-toggle .form-field-toggle-container:focus .toggle .switch{top:.0625rem}.entity-name-and-spinner{display:flex;flex-direction:row;align-items:center;justify-content:flex-start}.spinner{border-right-color:var(--formBase);border-top-color:var(--formBase)}\n"], dependencies: [{ kind: "directive", type: i1$4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: FormHeaderComponent, selector: "lib-form-header", inputs: ["data", "badges", "title", "moreActions", "formView", "saveDisabled", "saveTooltip", "actionButtonText", "moreActionsText", "showHeaderToggle", "showHeaderButton"], 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", "contentClass", "showHeader", "showToggle", "headerActions", "headerToggle"], outputs: ["actionRequested", "headerToggleChange"] }, { kind: "component", type: PreviewListComponent, selector: "lib-preview-list", inputs: ["label", "clickable", "isLoading", "allNames", "items", "allowRemove", "tooltip", "showfilter"], outputs: ["itemSelected", "itemRemoved"] }, { kind: "component", type: LoadingIndicatorComponent, selector: "lib-loading-indicator", inputs: ["isLoading"] }, { kind: "component", type: JsonViewComponent, selector: "lib-json-view", inputs: ["data", "schema", "readOnly", "jsonInvalid", "showCopy", "showLineNumbers"], outputs: ["dataChange", "jsonChange", "jsonInvalidChange"] }] }); }
26721
26941
  }
26722
26942
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: SessionFormComponent, decorators: [{
26723
26943
  type: Component,
@@ -26804,19 +27024,57 @@ class ApiSessionsPageService extends ListPageServiceClass {
26804
27024
  };
26805
27025
  return [
26806
27026
  {
26807
- colId: 'identity',
26808
- field: 'identity.name',
26809
- headerName: 'Identity',
27027
+ colId: 'id',
27028
+ field: 'id',
27029
+ headerName: 'ID',
26810
27030
  headerComponent: TableColumnDefaultComponent,
26811
27031
  headerComponentParams: this.headerComponentParams,
26812
27032
  cellRenderer: TableCellNameComponent,
26813
27033
  cellRendererParams: { pathRoot: this.basePath },
27034
+ resizable: true,
27035
+ cellClass: 'nf-cell-vert-align tCol',
27036
+ width: this.remToPx(10),
27037
+ hide: false,
26814
27038
  onCellClicked: (data) => {
26815
27039
  if (this.hasSelectedText()) {
26816
27040
  return;
26817
27041
  }
26818
27042
  this.openEditForm(data?.data?.id);
26819
27043
  },
27044
+ },
27045
+ {
27046
+ colId: 'identity.name',
27047
+ field: 'identity.name',
27048
+ headerName: 'Identity Name',
27049
+ headerComponent: TableColumnDefaultComponent,
27050
+ cellRenderer: TableCellNameComponent,
27051
+ cellRendererParams: { pathRoot: 'identities', itemProp: 'identity.id' },
27052
+ onCellClicked: (data) => {
27053
+ if (this.hasSelectedText()) {
27054
+ return;
27055
+ }
27056
+ this.openIdentityForm(data?.data?.identityId);
27057
+ },
27058
+ resizable: true,
27059
+ cellClass: 'nf-cell-vert-align tCol',
27060
+ sortable: false,
27061
+ filter: true,
27062
+ sortColumn: this.sort.bind(this),
27063
+ },
27064
+ {
27065
+ colId: 'identity',
27066
+ field: 'identity.id',
27067
+ headerName: 'Identity ID',
27068
+ headerComponent: TableColumnDefaultComponent,
27069
+ headerComponentParams: this.headerComponentParams,
27070
+ cellRenderer: TableCellNameComponent,
27071
+ cellRendererParams: { pathRoot: 'identities', itemProp: 'identity.id' },
27072
+ onCellClicked: (data) => {
27073
+ if (this.hasSelectedText()) {
27074
+ return;
27075
+ }
27076
+ this.openIdentityForm(data?.data?.identityId);
27077
+ },
26820
27078
  resizable: true,
26821
27079
  cellClass: 'nf-cell-vert-align tCol',
26822
27080
  sortable: true,
@@ -26827,6 +27085,7 @@ class ApiSessionsPageService extends ListPageServiceClass {
26827
27085
  colId: 'ipAddress',
26828
27086
  field: 'ipAddress',
26829
27087
  headerName: 'IP Address',
27088
+ headerComponentParams: this.headerComponentParams,
26830
27089
  headerComponent: TableColumnDefaultComponent,
26831
27090
  resizable: true,
26832
27091
  cellClass: 'nf-cell-vert-align tCol',
@@ -26835,20 +27094,22 @@ class ApiSessionsPageService extends ListPageServiceClass {
26835
27094
  {
26836
27095
  colId: 'isMfaRequired',
26837
27096
  field: 'isMfaRequired',
26838
- headerName: 'Is System',
27097
+ headerName: 'MFA Required',
26839
27098
  headerComponent: TableColumnDefaultComponent,
26840
27099
  resizable: true,
26841
27100
  cellClass: 'nf-cell-vert-align tCol',
26842
27101
  width: this.remToPx(10),
27102
+ hide: true
26843
27103
  },
26844
27104
  {
26845
27105
  colId: 'isMfaComplete',
26846
27106
  field: 'isMfaComplete',
26847
- headerName: 'Is System',
27107
+ headerName: 'MFA Complete',
26848
27108
  headerComponent: TableColumnDefaultComponent,
26849
27109
  resizable: true,
26850
27110
  cellClass: 'nf-cell-vert-align tCol',
26851
27111
  width: this.remToPx(10),
27112
+ hide: true
26852
27113
  },
26853
27114
  {
26854
27115
  colId: 'lastActivity',
@@ -26861,16 +27122,6 @@ class ApiSessionsPageService extends ListPageServiceClass {
26861
27122
  cellClass: 'nf-cell-vert-align tCol',
26862
27123
  width: this.remToPx(10),
26863
27124
  },
26864
- {
26865
- colId: 'id',
26866
- field: 'id',
26867
- headerName: 'ID',
26868
- headerComponent: TableColumnDefaultComponent,
26869
- resizable: true,
26870
- cellClass: 'nf-cell-vert-align tCol',
26871
- width: this.remToPx(10),
26872
- hide: true
26873
- },
26874
27125
  {
26875
27126
  colId: 'createdAt',
26876
27127
  field: 'createdAt',
@@ -26885,9 +27136,16 @@ class ApiSessionsPageService extends ListPageServiceClass {
26885
27136
  },
26886
27137
  ];
26887
27138
  }
27139
+ openIdentityForm(itemId = '', basePath) {
27140
+ if (isEmpty(itemId)) {
27141
+ itemId = 'create';
27142
+ }
27143
+ basePath = basePath ? basePath : this.basePath;
27144
+ this.router?.navigateByUrl(`identities/${itemId}`);
27145
+ }
26888
27146
  getData(filters, sort) {
26889
27147
  if (sort.sortBy === 'name') {
26890
- sort.sortBy = 'identity';
27148
+ sort.sortBy = 'id';
26891
27149
  }
26892
27150
  // we can customize filters or sorting here before moving on...
26893
27151
  return super.getTableData('api-sessions', this.paging, filters, sort)
@@ -27029,11 +27287,11 @@ class APISessionsPageComponent extends ListPageComponent {
27029
27287
  this.formDataChanged = event;
27030
27288
  }
27031
27289
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: APISessionsPageComponent, deps: [{ token: ApiSessionsPageService }, { token: DataTableFilterService }, { token: TabNameService }, { token: ConsoleEventsService }, { token: i5$1.MatDialog }], target: i0.ɵɵFactoryTarget.Component }); }
27032
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: APISessionsPageComponent, selector: "lib-api-sessions", usesInheritance: true, ngImport: i0, template: "<div class=\"ziti-page-container ziti-api-sessions-container\">\n <lib-list-page-header [title]=\"title\"\n [tabs]=\"tabs\"\n [hideAction]=\"true\"\n (actionClicked)=\"headerActionClicked($event)\"></lib-list-page-header>\n\n <lib-data-table [tableId]=\"'api-sessions'\"\n [rowData]=\"rowData\"\n [columnDefinitions]=\"columnDefs\"\n (actionRequested)=\"tableAction($event)\"\n [startCount]=\"startCount\"\n [endCount]=\"endCount\"\n [totalCount]=\"totalCount\"\n [emptyMsg]=\"'No API Sessions defined'\"\n [filterApplied]=\"filterApplied\"\n [filterColumn]=\"'identity'\"\n [filterName]=\"'identity'\"\n [menuItems]=\"svc.menuItems\"\n (gridReady)=\"gridReady($event)\"\n >\n </lib-data-table>\n</div>\n<lib-loading-indicator *ngIf=\"isLoading\" [isLoading]=\"isLoading\"></lib-loading-indicator>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: ListPageHeaderComponent, selector: "lib-list-page-header", inputs: ["title", "tabs", "showAdd", "hideAction"], outputs: ["actionClicked"] }, { kind: "component", type: DataTableComponent, selector: "lib-data-table", inputs: ["rowData", "expandRowData", "collapseRowData", "rowValidation", "isTimeSearchAvailable", "isLoading", "tableId", "options", "validateService", "rowsToggled", "tableRefreshCount", "view", "serverSideDataSource", "allowDownload", "startCount", "endCount", "totalCount", "emptyMsg", "filterApplied", "menuItems", "headerActions", "noItemsClass", "entityTypeName", "showNoItemsAdd", "currentPage", "noItemsImage", "rowHeight", "filterName", "filterColumn", "columnDefinitions", "refreshCount"], outputs: ["actionRequested", "gridReady", "dragStart", "dragLeave", "pageChanged"] }, { kind: "component", type: LoadingIndicatorComponent, selector: "lib-loading-indicator", inputs: ["isLoading"] }] }); }
27290
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: APISessionsPageComponent, selector: "lib-api-sessions", usesInheritance: true, ngImport: i0, template: "<div class=\"ziti-page-container ziti-api-sessions-container\">\n <lib-list-page-header [title]=\"title\"\n [tabs]=\"tabs\"\n [hideAction]=\"true\"\n (actionClicked)=\"headerActionClicked($event)\"></lib-list-page-header>\n\n <lib-data-table [tableId]=\"'api-sessions'\"\n [rowData]=\"rowData\"\n [columnDefinitions]=\"columnDefs\"\n (actionRequested)=\"tableAction($event)\"\n [startCount]=\"startCount\"\n [endCount]=\"endCount\"\n [totalCount]=\"totalCount\"\n [emptyMsg]=\"'No API Sessions defined'\"\n [filterApplied]=\"filterApplied\"\n [filterColumn]=\"'id'\"\n [filterName]=\"'ID'\"\n [menuItems]=\"svc.menuItems\"\n (gridReady)=\"gridReady($event)\"\n >\n </lib-data-table>\n</div>\n<lib-loading-indicator *ngIf=\"isLoading\" [isLoading]=\"isLoading\"></lib-loading-indicator>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: ListPageHeaderComponent, selector: "lib-list-page-header", inputs: ["title", "tabs", "showAdd", "hideAction"], outputs: ["actionClicked"] }, { kind: "component", type: DataTableComponent, selector: "lib-data-table", inputs: ["rowData", "expandRowData", "collapseRowData", "rowValidation", "isTimeSearchAvailable", "isLoading", "tableId", "options", "validateService", "rowsToggled", "tableRefreshCount", "view", "serverSideDataSource", "allowDownload", "startCount", "endCount", "totalCount", "emptyMsg", "filterApplied", "menuItems", "headerActions", "noItemsClass", "entityTypeName", "showNoItemsAdd", "currentPage", "noItemsImage", "rowHeight", "filterName", "filterColumn", "columnDefinitions", "refreshCount"], outputs: ["actionRequested", "gridReady", "dragStart", "dragLeave", "pageChanged"] }, { kind: "component", type: LoadingIndicatorComponent, selector: "lib-loading-indicator", inputs: ["isLoading"] }] }); }
27033
27291
  }
27034
27292
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: APISessionsPageComponent, decorators: [{
27035
27293
  type: Component,
27036
- args: [{ selector: 'lib-api-sessions', template: "<div class=\"ziti-page-container ziti-api-sessions-container\">\n <lib-list-page-header [title]=\"title\"\n [tabs]=\"tabs\"\n [hideAction]=\"true\"\n (actionClicked)=\"headerActionClicked($event)\"></lib-list-page-header>\n\n <lib-data-table [tableId]=\"'api-sessions'\"\n [rowData]=\"rowData\"\n [columnDefinitions]=\"columnDefs\"\n (actionRequested)=\"tableAction($event)\"\n [startCount]=\"startCount\"\n [endCount]=\"endCount\"\n [totalCount]=\"totalCount\"\n [emptyMsg]=\"'No API Sessions defined'\"\n [filterApplied]=\"filterApplied\"\n [filterColumn]=\"'identity'\"\n [filterName]=\"'identity'\"\n [menuItems]=\"svc.menuItems\"\n (gridReady)=\"gridReady($event)\"\n >\n </lib-data-table>\n</div>\n<lib-loading-indicator *ngIf=\"isLoading\" [isLoading]=\"isLoading\"></lib-loading-indicator>\n" }]
27294
+ args: [{ selector: 'lib-api-sessions', template: "<div class=\"ziti-page-container ziti-api-sessions-container\">\n <lib-list-page-header [title]=\"title\"\n [tabs]=\"tabs\"\n [hideAction]=\"true\"\n (actionClicked)=\"headerActionClicked($event)\"></lib-list-page-header>\n\n <lib-data-table [tableId]=\"'api-sessions'\"\n [rowData]=\"rowData\"\n [columnDefinitions]=\"columnDefs\"\n (actionRequested)=\"tableAction($event)\"\n [startCount]=\"startCount\"\n [endCount]=\"endCount\"\n [totalCount]=\"totalCount\"\n [emptyMsg]=\"'No API Sessions defined'\"\n [filterApplied]=\"filterApplied\"\n [filterColumn]=\"'id'\"\n [filterName]=\"'ID'\"\n [menuItems]=\"svc.menuItems\"\n (gridReady)=\"gridReady($event)\"\n >\n </lib-data-table>\n</div>\n<lib-loading-indicator *ngIf=\"isLoading\" [isLoading]=\"isLoading\"></lib-loading-indicator>\n" }]
27037
27295
  }], ctorParameters: function () { return [{ type: ApiSessionsPageService }, { type: DataTableFilterService }, { type: TabNameService }, { type: ConsoleEventsService }, { type: i5$1.MatDialog }]; } });
27038
27296
 
27039
27297
  class APISessionFormService {
@@ -27240,7 +27498,7 @@ class APISessionFormComponent extends ProjectableForm {
27240
27498
  provide: MatDialogRef,
27241
27499
  useValue: {}
27242
27500
  }
27243
- ], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div class=\"projectable-form-wrapper api-session-form-wrapper\"\n (keyup.enter)=\"save($event)\"\n (keyup.escape)=\"closeModal(false)\"\n>\n <lib-form-header\n [data]=\"formData\"\n [title]=\"'API Session Details'\"\n [moreActions]=\"moreActions\"\n (actionRequested)=\"headerActionRequested($event)\"\n [(formView)]=\"formView\"\n [showHeaderButton]=\"false\"\n ></lib-form-header>\n <div class=\"edge-router-form-container projectable-form-container\">\n <div class=\"projectable-form-main-column form-group-row\" *ngIf=\"formView === 'simple'\">\n <div class=\"form-group-column\">\n <lib-form-field-container [showHeader]=\"false\">\n <div class=\"form-field-label-container\">\n <div class=\"form-field-title-container\">\n <span class=\"form-field-title\">ID</span>\n </div>\n <div class=\"config-container\">\n <span>{{formData.id}}</span>\n </div>\n </div>\n <div class=\"form-field-label-container\">\n <div class=\"form-field-title-container\">\n <span class=\"form-field-title\">Identity Name</span>\n </div>\n <a class=\"form-field-link\" [href]=\"'./services/' + formData.identity.id\" (click)=\"identityNameLinkClicked($event)\">\n <div class=\"config-container config-container-clickable\">\n <span>{{formData.identity.name}}</span>\n </div>\n </a>\n </div>\n <div class=\"form-field-label-container\">\n <div class=\"form-field-title-container\">\n <span class=\"form-field-title\">IP Address</span>\n </div>\n <div class=\"config-container\">\n <span>{{formData.ipAddress}}</span>\n </div>\n </div>\n <div class=\"form-field-label-container\">\n <div class=\"form-field-title-container\">\n <span class=\"form-field-title\">Created At</span>\n </div>\n <div class=\"config-container\">\n <span>{{moment(formData.createdAt).format(\"M/D/YYYY h:mm A\")}}</span>\n </div>\n </div>\n <div class=\"form-field-label-container\">\n <div class=\"form-field-title-container\">\n <span class=\"form-field-title\">Updated At</span>\n </div>\n <div class=\"config-container\">\n <span>{{moment(formData.updatedAt).format(\"M/D/YYYY h:mm A\")}}</span>\n </div>\n </div>\n <div class=\"form-field-label-container\">\n <div class=\"form-field-title-container\">\n <span class=\"form-field-title\">Last Activity</span>\n </div>\n <div class=\"config-container\">\n <span>{{moment(formData.lastActivity).format(\"M/D/YYYY h:mm A\")}}</span>\n </div>\n </div>\n </lib-form-field-container>\n <ng-content select=\"[slot=column-1-slot-1]\"></ng-content>\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: ["::ng-deep .api-session-form-wrapper .form-header-container{max-width:35rem!important}::ng-deep .api-session-form-wrapper .form-header-container .form-header-toggle-container{margin-right:0!important}.projectable-form-main-column.form-group-row{max-width:35rem}.form-field-dropdown{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'Stroke_Color' style%3D'enable-background%3Anew 0 0 20.2 10.8%3B' version%3D'1.1' viewBox%3D'0 0 20.2 10.8' 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 %23668291%3B %7D%3C%2Fstyle%3E %3Cg%3E%09%3Cpath class%3D'st0' d%3D'M19.8%2C1.7c0%2C0.4-0.1%2C0.7-0.4%2C0.9l-8.5%2C7.3c-0.5%2C0.4-1.2%2C0.4-1.6%2C0L0.7%2C2.7C0.2%2C2.2%2C0.2%2C1.5%2C0.6%2C0.9%09%09c0.5-0.5%2C1.2-0.6%2C1.8-0.1l7.7%2C6.6l7.7-6.6c0.5-0.5%2C1.3-0.4%2C1.8%2C0.1C19.7%2C1.2%2C19.8%2C1.5%2C19.8%2C1.7z'%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E\");background-position:center right .625rem;background-repeat:no-repeat;background-size:1.125rem;padding-right:1.75rem}.disabled{opacity:.5;pointer-events:none}.config-item{max-height:var(--defaultInputHeight);margin-top:1.15rem}::ng-deep .admin-toggle{width:100%;width:35%;display:flex}::ng-deep .admin-toggle .form-field-line{display:none}::ng-deep .admin-toggle .toggle{width:100%}::ng-deep .is-admin-container .form-field-title-container.title-container-2{width:35%!important}.svc-test-result{position:absolute;transition:var(--transition);height:0;width:100%;background-color:var(--background);bottom:0;font-weight:600;padding-left:.625rem;padding-right:.625rem;border-color:var(--inputBorder);border-style:solid;border-width:var(--inputBorderWidth);border-bottom-right-radius:var(--inputBorderRadius);border-bottom-left-radius:var(--inputBorderRadius);border-top-style:none}.svc-test-result.test-result-open{height:-moz-fit-content;height:fit-content;box-shadow:0 -.125rem .6875rem 0 var(--boxShadow);padding-bottom:.9375rem;padding-top:.9375rem}.svc-test-result .close.icon-close{top:.625rem;right:.625rem;font-size:1.125rem;height:1.125rem;width:1.125rem;line-height:1.125rem}::ng-deep .admin-toggle .form-field-toggle-container:focus .form-field-label{color:var(--primaryColor)}::ng-deep .admin-toggle .form-field-toggle-container:focus .form-field-line{border-color:var(--primaryColor)}::ng-deep .admin-toggle .form-field-toggle-container:focus .toggle{border-color:var(--primaryColor);border-style:solid;border-width:var(--inputBorderWidth)}::ng-deep .admin-toggle .form-field-toggle-container:focus .toggle .switch{top:.0625rem}.entity-name-and-spinner{display:flex;flex-direction:row;align-items:center;justify-content:flex-start}.spinner{border-right-color:var(--formBase);border-top-color:var(--formBase)}\n"], dependencies: [{ kind: "directive", type: i1$4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: FormHeaderComponent, selector: "lib-form-header", inputs: ["data", "badges", "title", "moreActions", "formView", "saveDisabled", "saveTooltip", "actionButtonText", "moreActionsText", "showHeaderToggle", "showHeaderButton"], 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", "contentClass", "showHeader", "showToggle", "headerActions", "headerToggle"], outputs: ["actionRequested", "headerToggleChange"] }, { 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"] }] }); }
27501
+ ], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div class=\"projectable-form-wrapper api-session-form-wrapper\"\n (keyup.enter)=\"save($event)\"\n (keyup.escape)=\"closeModal(false)\"\n>\n <lib-form-header\n [data]=\"formData\"\n [title]=\"'API Session Details'\"\n [moreActions]=\"moreActions\"\n (actionRequested)=\"headerActionRequested($event)\"\n [(formView)]=\"formView\"\n [showHeaderButton]=\"false\"\n ></lib-form-header>\n <div class=\"edge-router-form-container projectable-form-container\">\n <div class=\"projectable-form-main-column form-group-row\" *ngIf=\"formView === 'simple'\">\n <div class=\"form-group-column\">\n <lib-form-field-container [showHeader]=\"false\">\n <div class=\"form-field-label-container\">\n <div class=\"form-field-title-container\">\n <span class=\"form-field-title\">ID</span>\n </div>\n <div class=\"config-container\">\n <span>{{formData.id}}</span>\n </div>\n </div>\n <div class=\"form-field-label-container\">\n <div class=\"form-field-title-container\">\n <span class=\"form-field-title\">Identity Name</span>\n </div>\n <a class=\"form-field-link\" [href]=\"'./services/' + formData.identity.id\" (click)=\"identityNameLinkClicked($event)\">\n <div class=\"config-container config-container-clickable\">\n <span>{{formData.identity.name}}</span>\n </div>\n </a>\n </div>\n <div class=\"form-field-label-container\">\n <div class=\"form-field-title-container\">\n <span class=\"form-field-title\">IP Address</span>\n </div>\n <div class=\"config-container\">\n <span>{{formData.ipAddress}}</span>\n </div>\n </div>\n <div class=\"form-field-label-container\">\n <div class=\"form-field-title-container\">\n <span class=\"form-field-title\">Created At</span>\n </div>\n <div class=\"config-container\">\n <span>{{moment(formData.createdAt).format(\"M/D/YYYY h:mm A\")}}</span>\n </div>\n </div>\n <div class=\"form-field-label-container\">\n <div class=\"form-field-title-container\">\n <span class=\"form-field-title\">Updated At</span>\n </div>\n <div class=\"config-container\">\n <span>{{moment(formData.updatedAt).format(\"M/D/YYYY h:mm A\")}}</span>\n </div>\n </div>\n <div class=\"form-field-label-container\">\n <div class=\"form-field-title-container\">\n <span class=\"form-field-title\">Last Activity</span>\n </div>\n <div class=\"config-container\">\n <span>{{moment(formData.lastActivity).format(\"M/D/YYYY h:mm A\")}}</span>\n </div>\n </div>\n </lib-form-field-container>\n <ng-content select=\"[slot=column-1-slot-1]\"></ng-content>\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: ["::ng-deep .api-session-form-wrapper .form-header-container{max-width:35rem!important}::ng-deep .api-session-form-wrapper .form-header-container .form-header-toggle-container{margin-right:0!important}.projectable-form-main-column.form-group-row{max-width:35rem}.form-field-dropdown{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'Stroke_Color' style%3D'enable-background%3Anew 0 0 20.2 10.8%3B' version%3D'1.1' viewBox%3D'0 0 20.2 10.8' 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 %23668291%3B %7D%3C%2Fstyle%3E %3Cg%3E%09%3Cpath class%3D'st0' d%3D'M19.8%2C1.7c0%2C0.4-0.1%2C0.7-0.4%2C0.9l-8.5%2C7.3c-0.5%2C0.4-1.2%2C0.4-1.6%2C0L0.7%2C2.7C0.2%2C2.2%2C0.2%2C1.5%2C0.6%2C0.9%09%09c0.5-0.5%2C1.2-0.6%2C1.8-0.1l7.7%2C6.6l7.7-6.6c0.5-0.5%2C1.3-0.4%2C1.8%2C0.1C19.7%2C1.2%2C19.8%2C1.5%2C19.8%2C1.7z'%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E\");background-position:center right .625rem;background-repeat:no-repeat;background-size:1.125rem;padding-right:1.75rem}.disabled{opacity:.5;pointer-events:none}.config-item{max-height:var(--defaultInputHeight);margin-top:1.15rem}::ng-deep .admin-toggle{width:100%;width:35%;display:flex}::ng-deep .admin-toggle .form-field-line{display:none}::ng-deep .admin-toggle .toggle{width:100%}::ng-deep .is-admin-container .form-field-title-container.title-container-2{width:35%!important}.svc-test-result{position:absolute;transition:var(--transition);height:0;width:100%;background-color:var(--background);bottom:0;font-weight:600;padding-left:.625rem;padding-right:.625rem;border-color:var(--inputBorder);border-style:solid;border-width:var(--inputBorderWidth);border-bottom-right-radius:var(--inputBorderRadius);border-bottom-left-radius:var(--inputBorderRadius);border-top-style:none}.svc-test-result.test-result-open{height:-moz-fit-content;height:fit-content;box-shadow:0 -.125rem .6875rem 0 var(--boxShadow);padding-bottom:.9375rem;padding-top:.9375rem}.svc-test-result .close.icon-close{top:.625rem;right:.625rem;font-size:1.125rem;height:1.125rem;width:1.125rem;line-height:1.125rem}::ng-deep .admin-toggle .form-field-toggle-container:focus .form-field-label{color:var(--primaryColor)}::ng-deep .admin-toggle .form-field-toggle-container:focus .form-field-line{border-color:var(--primaryColor)}::ng-deep .admin-toggle .form-field-toggle-container:focus .toggle{border-color:var(--primaryColor);border-style:solid;border-width:var(--inputBorderWidth)}::ng-deep .admin-toggle .form-field-toggle-container:focus .toggle .switch{top:.0625rem}.entity-name-and-spinner{display:flex;flex-direction:row;align-items:center;justify-content:flex-start}.spinner{border-right-color:var(--formBase);border-top-color:var(--formBase)}\n"], dependencies: [{ kind: "directive", type: i1$4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: FormHeaderComponent, selector: "lib-form-header", inputs: ["data", "badges", "title", "moreActions", "formView", "saveDisabled", "saveTooltip", "actionButtonText", "moreActionsText", "showHeaderToggle", "showHeaderButton"], 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", "contentClass", "showHeader", "showToggle", "headerActions", "headerToggle"], outputs: ["actionRequested", "headerToggleChange"] }, { kind: "component", type: LoadingIndicatorComponent, selector: "lib-loading-indicator", inputs: ["isLoading"] }, { kind: "component", type: JsonViewComponent, selector: "lib-json-view", inputs: ["data", "schema", "readOnly", "jsonInvalid", "showCopy", "showLineNumbers"], outputs: ["dataChange", "jsonChange", "jsonInvalidChange"] }] }); }
27244
27502
  }
27245
27503
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: APISessionFormComponent, decorators: [{
27246
27504
  type: Component,
@@ -27269,6 +27527,147 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
27269
27527
  type: Input
27270
27528
  }] } });
27271
27529
 
27530
+ class CallbackComponent {
27531
+ constructor(oauthService, loginService, growlerService, router, route, zitiService, settingsService) {
27532
+ this.oauthService = oauthService;
27533
+ this.loginService = loginService;
27534
+ this.growlerService = growlerService;
27535
+ this.router = router;
27536
+ this.route = route;
27537
+ this.zitiService = zitiService;
27538
+ this.settingsService = settingsService;
27539
+ }
27540
+ ngOnInit() {
27541
+ try {
27542
+ const configString = localStorage.getItem('oauth_callback_config');
27543
+ const tokenType = localStorage.getItem('oauth_callback_target_token');
27544
+ const oauthConfig = JSON.parse(configString);
27545
+ const redirectRoute = this.route.snapshot.queryParamMap.get('redirectRoute');
27546
+ if (!isEmpty(oauthConfig)) {
27547
+ this.oauthService.configure(oauthConfig);
27548
+ this.oauthService.loadDiscoveryDocument().then((loadResult) => {
27549
+ console.log(loadResult);
27550
+ this.oauthService.tryLogin().then((result) => {
27551
+ if (result) {
27552
+ // Handle post-login
27553
+ let token;
27554
+ if (tokenType === 'ID') {
27555
+ token = this.oauthService.getIdToken();
27556
+ }
27557
+ else {
27558
+ token = this.oauthService.getAccessToken();
27559
+ }
27560
+ const prefix = '/edge/client/v1';
27561
+ const url = this.settingsService.settings.selectedEdgeController;
27562
+ let doNav = true;
27563
+ let isTest = true;
27564
+ if (!isEmpty(redirectRoute)) {
27565
+ doNav = false;
27566
+ isTest = true;
27567
+ }
27568
+ const claimsObj = this.loginService.decodeJwt(token);
27569
+ const claimsStr = JSON.stringify(claimsObj, null, 2);
27570
+ this.loginService.login(prefix, url, undefined, undefined, doNav, 'ext-jwt', token, isTest).then((result) => {
27571
+ if (!isEmpty(redirectRoute)) {
27572
+ this.router.navigate([redirectRoute], {
27573
+ queryParams: {
27574
+ oidcAuthResult: 'success',
27575
+ oidcAuthTokenClaims: claimsStr
27576
+ }
27577
+ });
27578
+ }
27579
+ }).catch((error) => {
27580
+ let errorMessage = this.zitiService.getErrorMessage(error);
27581
+ if (error.statusText) {
27582
+ errorMessage = error.statusText + ': ' + errorMessage;
27583
+ }
27584
+ if (error.status) {
27585
+ errorMessage = error.status + ' ' + errorMessage;
27586
+ }
27587
+ errorMessage = 'Failed to get ziti session ID from controller using OIDC token: ' + errorMessage;
27588
+ const growlerData = new GrowlerModel('error', 'Error', `Login Error`, 'Unable to initialize OAuth login. ' + errorMessage);
27589
+ this.growlerService.show(growlerData);
27590
+ if (!isEmpty(redirectRoute)) {
27591
+ this.router.navigate([redirectRoute], {
27592
+ queryParams: {
27593
+ oidcAuthResult: 'failed',
27594
+ oidcAuthErrorMessageDetail: errorMessage,
27595
+ oidcAuthErrorMessageSource: 'Ziti Controller Error',
27596
+ oidcAuthTokenClaims: claimsStr
27597
+ }
27598
+ });
27599
+ }
27600
+ else {
27601
+ this.router.navigate(['/login']);
27602
+ }
27603
+ });
27604
+ }
27605
+ else {
27606
+ const growlerData = new GrowlerModel('error', 'Error', `Login Error`, 'Unable to initialize OAuth login');
27607
+ this.growlerService.show(growlerData);
27608
+ this.router.navigate(['/login'], {
27609
+ queryParams: {
27610
+ oidcAuthResult: 'failed',
27611
+ oidcAuthErrorMessageDetail: 'Unable to initialize OAuth login. Empty response of OAuth service.',
27612
+ oidcAuthErrorMessageSource: 'OAuth Provider Error',
27613
+ }
27614
+ });
27615
+ }
27616
+ }).catch((error) => {
27617
+ console.log(error);
27618
+ const errorMessage = `${error.params ? error.params.error + ': ' + error.params.error_description : ''}`;
27619
+ const growlerData = new GrowlerModel('error', 'Error', `Login Error`, 'Unable to initialize OAuth login. ' + errorMessage);
27620
+ this.growlerService.show(growlerData);
27621
+ if (!isEmpty(redirectRoute)) {
27622
+ this.router.navigate([redirectRoute], {
27623
+ queryParams: {
27624
+ oidcAuthResult: 'failed',
27625
+ oidcAuthErrorMessageDetail: errorMessage,
27626
+ oidcAuthErrorMessageSource: 'OAuth Provider Error',
27627
+ }
27628
+ });
27629
+ }
27630
+ });
27631
+ }).catch((error) => {
27632
+ const errorMessage = `${error.params ? error.params.error + ': ' + error.params.error_description : ''}`;
27633
+ const growlerData = new GrowlerModel('error', 'Error', `Login Error`, 'Unable to initialize OAuth login. ' + errorMessage);
27634
+ this.growlerService.show(growlerData);
27635
+ if (!isEmpty(redirectRoute)) {
27636
+ this.router.navigate([redirectRoute], {
27637
+ queryParams: {
27638
+ oidcAuthResult: 'failed',
27639
+ oidcAuthErrorMessageDetail: errorMessage,
27640
+ oidcAuthErrorMessageSource: 'OAuth Provider Error',
27641
+ }
27642
+ });
27643
+ }
27644
+ });
27645
+ }
27646
+ }
27647
+ catch (e) {
27648
+ this.router.navigate(['/login']);
27649
+ }
27650
+ }
27651
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: CallbackComponent, deps: [{ token: i1$5.OAuthService }, { token: ZAC_LOGIN_SERVICE }, { token: GrowlerService }, { token: i4.Router }, { token: i4.ActivatedRoute }, { token: ZITI_DATA_SERVICE }, { token: SETTINGS_SERVICE }], target: i0.ɵɵFactoryTarget.Component }); }
27652
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: CallbackComponent, selector: "lib-callback", ngImport: i0, template: '<lib-loading-indicator [isLoading]="true"></lib-loading-indicator>', isInline: true, dependencies: [{ kind: "component", type: LoadingIndicatorComponent, selector: "lib-loading-indicator", inputs: ["isLoading"] }] }); }
27653
+ }
27654
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: CallbackComponent, decorators: [{
27655
+ type: Component,
27656
+ args: [{
27657
+ selector: 'lib-callback',
27658
+ template: '<lib-loading-indicator [isLoading]="true"></lib-loading-indicator>',
27659
+ }]
27660
+ }], ctorParameters: function () { return [{ type: i1$5.OAuthService }, { type: LoginServiceClass, decorators: [{
27661
+ type: Inject,
27662
+ args: [ZAC_LOGIN_SERVICE]
27663
+ }] }, { type: GrowlerService }, { type: i4.Router }, { type: i4.ActivatedRoute }, { type: ZitiDataService, decorators: [{
27664
+ type: Inject,
27665
+ args: [ZITI_DATA_SERVICE]
27666
+ }] }, { type: SettingsServiceClass, decorators: [{
27667
+ type: Inject,
27668
+ args: [SETTINGS_SERVICE]
27669
+ }] }]; } });
27670
+
27272
27671
  /*
27273
27672
  Copyright NetFoundry Inc.
27274
27673
 
@@ -27380,7 +27779,8 @@ class OpenZitiConsoleLibModule {
27380
27779
  SessionsPageComponent,
27381
27780
  SessionFormComponent,
27382
27781
  APISessionsPageComponent,
27383
- APISessionFormComponent], imports: [CommonModule,
27782
+ APISessionFormComponent,
27783
+ CallbackComponent], imports: [CommonModule,
27384
27784
  FormsModule,
27385
27785
  MatDialogModule,
27386
27786
  MatRadioModule,
@@ -27442,7 +27842,8 @@ class OpenZitiConsoleLibModule {
27442
27842
  SessionsPageComponent,
27443
27843
  SessionFormComponent,
27444
27844
  APISessionsPageComponent,
27445
- APISessionFormComponent] }); }
27845
+ APISessionFormComponent,
27846
+ CallbackComponent] }); }
27446
27847
  static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: OpenZitiConsoleLibModule, providers: [
27447
27848
  { provide: SHAREDZ_EXTENSION, useClass: ExtensionsNoopService },
27448
27849
  { provide: ZITI_NAVIGATOR, useValue: {} },
@@ -27565,7 +27966,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
27565
27966
  SessionsPageComponent,
27566
27967
  SessionFormComponent,
27567
27968
  APISessionsPageComponent,
27568
- APISessionFormComponent
27969
+ APISessionFormComponent,
27970
+ CallbackComponent
27569
27971
  ],
27570
27972
  imports: [
27571
27973
  CommonModule,
@@ -27636,6 +28038,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
27636
28038
  SessionFormComponent,
27637
28039
  APISessionsPageComponent,
27638
28040
  APISessionFormComponent,
28041
+ CallbackComponent
27639
28042
  ],
27640
28043
  providers: [
27641
28044
  { provide: SHAREDZ_EXTENSION, useClass: ExtensionsNoopService },
@@ -27651,7 +28054,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
27651
28054
  }] });
27652
28055
 
27653
28056
  const VERSION = {
27654
- "version": "3.12.0"
28057
+ "version": "3.12.1"
27655
28058
  };
27656
28059
 
27657
28060
  /*
@@ -29351,5 +29754,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
29351
29754
  * Generated bundle index. Do not edit.
29352
29755
  */
29353
29756
 
29354
- export { APISessionFormComponent, APISessionsPageComponent, ApiSessionsPageService, AuthPoliciesPageComponent, AuthPoliciesPageService, AuthPolicyFormComponent, AuthPolicyFormService, AuthService, BooleanToggleInputComponent, COMPONENTS, CardListComponent, CertificateAuthoritiesPageComponent, CertificateAuthoritiesPageService, CertificateAuthorityFormComponent, CertificateAuthorityFormService, CheckboxListInputComponent, ConfigTypeFormComponent, ConfigTypesPageComponent, ConfigurationFormComponent, ConfigurationService, ConfigurationsPageComponent, CsvDownloadService, DEACTIVATE_GUARD, DataTableFilterService, DeactivateGuardService, EDGE_ROUTER_EXTENSION_SERVICE, EDGE_ROUTER_POLICY_EXTENSION_SERVICE, EdgeRouter, EdgeRouterFormComponent, EdgeRouterFormService, EdgeRouterPoliciesPageComponent, EdgeRouterPoliciesPageService, EdgeRouterPolicyFormComponent, EdgeRouterPolicyFormService, EdgeRoutersPageComponent, EdgeRoutersPageService, Entity, ExtendableComponent, ExtensionsNoopService, FormFieldContainerComponent, FormFieldToggleComponent, FormHeaderComponent, GrowlerComponent, GrowlerModel, GrowlerModule, GrowlerService, IDENTITY_EXTENSION_SERVICE, IdentitiesPageComponent, IdentitiesPageService, Identity$1 as Identity, IdentityFormComponent, IdentityFormService, IdentityServicePathComponent, JwtSignerFormComponent, JwtSignerFormService, JwtSignersPageComponent, JwtSignersPageService, KEY_CODES, ListPageComponent, ListPageServiceClass, LoadingIndicatorComponent, LoggerService, LoginDialogComponent, LoginServiceClass, NetworkVisualizerComponent, NodeDataService, NodeWrapperService, NoopLoginService, NoopTabInterceptorService, NumberInputComponent, ObjectComponent, OpenZitiConsoleLibModule, PasswordInputComponent, PostureCheckFormComponent, PostureChecksPageComponent, PostureChecksPageService, ProjectableForm, ProtocolAddressPortInputComponent, ResetEnrollmentService, SERVICE_EDGE_ROUTER_POLICY_EXTENSION_SERVICE, SERVICE_EXTENSION_SERVICE, SERVICE_POLICY_EXTENSION_SERVICE, SETTINGS_SERVICE, SHAREDZ_EXTENSION, SelectorInputComponent, ServiceEdgeRouterPoliciesPageComponent, ServiceEdgeRouterPoliciesPageService, ServiceEdgeRouterPolicyFormComponent, ServiceEdgeRouterPolicyFormService, ServiceFormComponent, ServiceFormService, ServicePoliciesPageComponent, ServicePoliciesPageService, ServicePolicyFormComponent, ServicePolicyFormService, ServicesPageComponent, ServicesPageService, Session, SessionFormComponent, SessionsPageComponent, SessionsPageService, SettingsService, SettingsServiceClass, SideBannerComponent, SideModalComponent, SideNavbarComponent, SideToolbarComponent, SimpleServiceComponent, StringInputComponent, TabNameService, TerminatorFormComponent, TerminatorFormService, TerminatorsPageComponent, TerminatorsPageService, TextListInputComponent, TransitRouterFormComponent, TransitRouterFormService, TransitRoutersPageComponent, TransitRoutersPageService, VERSION, VerifyCertificateComponent, VisualizerServiceClass, ZAC_LOGIN_SERVICE, ZAC_WRAPPER_SERVICE, ZITI_DATA_SERVICE, ZITI_DOMAIN_CONTROLLER, ZITI_NAVIGATOR, ZITI_TAB_OVERRIDES, ZITI_URLS, ZacRoutingModule, ZacWrapperComponent, ZacWrapperService, ZacWrapperServiceClass, ZitiControllerDataService, ZitiDataService, playerFactory };
29757
+ export { APISessionFormComponent, APISessionsPageComponent, ApiSessionsPageService, AuthPoliciesPageComponent, AuthPoliciesPageService, AuthPolicyFormComponent, AuthPolicyFormService, AuthService, BooleanToggleInputComponent, COMPONENTS, CallbackComponent, CardListComponent, CertificateAuthoritiesPageComponent, CertificateAuthoritiesPageService, CertificateAuthorityFormComponent, CertificateAuthorityFormService, CheckboxListInputComponent, ConfigTypeFormComponent, ConfigTypesPageComponent, ConfigurationFormComponent, ConfigurationService, ConfigurationsPageComponent, CsvDownloadService, DEACTIVATE_GUARD, DataTableFilterService, DeactivateGuardService, EDGE_ROUTER_EXTENSION_SERVICE, EDGE_ROUTER_POLICY_EXTENSION_SERVICE, EdgeRouter, EdgeRouterFormComponent, EdgeRouterFormService, EdgeRouterPoliciesPageComponent, EdgeRouterPoliciesPageService, EdgeRouterPolicyFormComponent, EdgeRouterPolicyFormService, EdgeRoutersPageComponent, EdgeRoutersPageService, Entity, ExtendableComponent, ExtensionsNoopService, FormFieldContainerComponent, FormFieldToggleComponent, FormHeaderComponent, GrowlerComponent, GrowlerModel, GrowlerModule, GrowlerService, IDENTITY_EXTENSION_SERVICE, IdentitiesPageComponent, IdentitiesPageService, Identity$1 as Identity, IdentityFormComponent, IdentityFormService, IdentityServicePathComponent, JwtSignerFormComponent, JwtSignerFormService, JwtSignersPageComponent, JwtSignersPageService, KEY_CODES, ListPageComponent, ListPageServiceClass, LoadingIndicatorComponent, LoggerService, LoginDialogComponent, LoginServiceClass, NetworkVisualizerComponent, NodeDataService, NodeWrapperService, NoopLoginService, NoopTabInterceptorService, NumberInputComponent, ObjectComponent, OpenZitiConsoleLibModule, PasswordInputComponent, PostureCheckFormComponent, PostureChecksPageComponent, PostureChecksPageService, ProjectableForm, ProtocolAddressPortInputComponent, ResetEnrollmentService, SERVICE_EDGE_ROUTER_POLICY_EXTENSION_SERVICE, SERVICE_EXTENSION_SERVICE, SERVICE_POLICY_EXTENSION_SERVICE, SETTINGS_SERVICE, SHAREDZ_EXTENSION, SelectorInputComponent, ServiceEdgeRouterPoliciesPageComponent, ServiceEdgeRouterPoliciesPageService, ServiceEdgeRouterPolicyFormComponent, ServiceEdgeRouterPolicyFormService, ServiceFormComponent, ServiceFormService, ServicePoliciesPageComponent, ServicePoliciesPageService, ServicePolicyFormComponent, ServicePolicyFormService, ServicesPageComponent, ServicesPageService, Session, SessionFormComponent, SessionsPageComponent, SessionsPageService, SettingsService, SettingsServiceClass, SideBannerComponent, SideModalComponent, SideNavbarComponent, SideToolbarComponent, SimpleServiceComponent, StringInputComponent, TabNameService, TerminatorFormComponent, TerminatorFormService, TerminatorsPageComponent, TerminatorsPageService, TextListInputComponent, TransitRouterFormComponent, TransitRouterFormService, TransitRoutersPageComponent, TransitRoutersPageService, VERSION, ValidationService, VerifyCertificateComponent, VisualizerServiceClass, ZAC_LOGIN_SERVICE, ZAC_WRAPPER_SERVICE, ZITI_DATA_SERVICE, ZITI_DOMAIN_CONTROLLER, ZITI_NAVIGATOR, ZITI_TAB_OVERRIDES, ZITI_URLS, ZacRoutingModule, ZacWrapperComponent, ZacWrapperService, ZacWrapperServiceClass, ZitiControllerDataService, ZitiDataService, playerFactory };
29355
29758
  //# sourceMappingURL=openziti-ziti-console-lib.mjs.map