@gravitee/ui-policy-studio-angular 16.0.1-apim-11428-mcp-proxy-1b4e3b1 → 16.0.1-apim-11657-adapt-ui-for-llm-e538197
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/gravitee-ui-policy-studio-angular-testing.mjs +124 -1
- package/fesm2022/gravitee-ui-policy-studio-angular-testing.mjs.map +1 -1
- package/fesm2022/gravitee-ui-policy-studio-angular.mjs +256 -23
- package/fesm2022/gravitee-ui-policy-studio-angular.mjs.map +1 -1
- package/index.d.ts +7 -4
- package/package.json +1 -1
- package/testing/index.d.ts +10 -4
|
@@ -2,11 +2,11 @@ import { get, cloneDeep, uniqueId, capitalize, trim, isEmpty, flatten, uniq, toL
|
|
|
2
2
|
import * as i0 from '@angular/core';
|
|
3
3
|
import { Inject, Component, EventEmitter, Output, Input, Injectable, Pipe, computed, ChangeDetectionStrategy } from '@angular/core';
|
|
4
4
|
import { Subject, BehaviorSubject, of, EMPTY, timer } from 'rxjs';
|
|
5
|
-
import * as i5$
|
|
5
|
+
import * as i5$2 from '@angular/common';
|
|
6
6
|
import { CommonModule } from '@angular/common';
|
|
7
7
|
import * as i7 from '@gravitee/ui-particles-angular';
|
|
8
8
|
import { GioFormSlideToggleModule, GioBannerModule, GioIconsModule, GioElAssistantComponent, GioFormTagsInputModule, GIO_DIALOG_WIDTH, GioLoaderModule, GioFormJsonSchemaComponent, GioFormJsonSchemaModule, GioElPromptComponent, GioPopoverComponent, PopoverTriggerDirective, GioConfirmDialogComponent } from '@gravitee/ui-particles-angular';
|
|
9
|
-
import * as i2$
|
|
9
|
+
import * as i2$1 from '@angular/material/tooltip';
|
|
10
10
|
import { MatTooltipModule, MatTooltip } from '@angular/material/tooltip';
|
|
11
11
|
import * as i3 from '@angular/material/button';
|
|
12
12
|
import { MatButtonModule } from '@angular/material/button';
|
|
@@ -16,7 +16,7 @@ import * as i2 from '@angular/forms';
|
|
|
16
16
|
import { UntypedFormGroup, UntypedFormControl, ReactiveFormsModule, FormGroup, FormControl } from '@angular/forms';
|
|
17
17
|
import * as i4 from '@angular/material/form-field';
|
|
18
18
|
import { MatFormFieldModule } from '@angular/material/form-field';
|
|
19
|
-
import * as
|
|
19
|
+
import * as i5$1 from '@angular/material/input';
|
|
20
20
|
import { MatInputModule } from '@angular/material/input';
|
|
21
21
|
import * as i7$1 from '@angular/material/menu';
|
|
22
22
|
import { MatMenuModule } from '@angular/material/menu';
|
|
@@ -27,11 +27,11 @@ import * as i5 from '@angular/material/select';
|
|
|
27
27
|
import { MatSelectModule } from '@angular/material/select';
|
|
28
28
|
import * as i6 from '@angular/material/slide-toggle';
|
|
29
29
|
import { MatSlideToggleModule } from '@angular/material/slide-toggle';
|
|
30
|
-
import * as
|
|
30
|
+
import * as i6$1 from '@angular/material/icon';
|
|
31
31
|
import { MatIcon } from '@angular/material/icon';
|
|
32
|
-
import * as i2$
|
|
32
|
+
import * as i2$2 from '@angular/material/tabs';
|
|
33
33
|
import { MatTabsModule } from '@angular/material/tabs';
|
|
34
|
-
import * as i5$
|
|
34
|
+
import * as i5$3 from '@angular/material/chips';
|
|
35
35
|
import { MatChipsModule } from '@angular/material/chips';
|
|
36
36
|
import * as i6$2 from '@gravitee/ui-particles-angular/gio-asciidoctor';
|
|
37
37
|
import { GioAsciidoctorModule } from '@gravitee/ui-particles-angular/gio-asciidoctor';
|
|
@@ -332,7 +332,7 @@ class GioPolicyStudioFlowExecutionFormDialogComponent {
|
|
|
332
332
|
});
|
|
333
333
|
}
|
|
334
334
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: GioPolicyStudioFlowExecutionFormDialogComponent, deps: [{ token: i1.MatDialogRef }, { token: MAT_DIALOG_DATA }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
335
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.3", type: GioPolicyStudioFlowExecutionFormDialogComponent, isStandalone: true, selector: "gio-ps-flow-execution-form-dialog", ngImport: i0, template: "<!--\n\n Copyright (C) 2025 The Gravitee team (http://gravitee.io)\n \n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n \n http://www.apache.org/licenses/LICENSE-2.0\n \n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n-->\n<h2 mat-dialog-title class=\"title\">\n Flow execution\n\n <button class=\"title__closeBtn\" mat-icon-button aria-label=\"Close dialog\" [mat-dialog-close]=\"\">\n <mat-icon svgIcon=\"gio:cancel\"></mat-icon>\n </button>\n</h2>\n\n@if (flowExecutionFormGroup) {\n <mat-dialog-content class=\"content\" [formGroup]=\"flowExecutionFormGroup\">\n <div class=\"content__row\">\n <gio-banner-info>\n By default, flow selection is based on the operators defined in your flows, either when it \u201Cmatches with\u201D or \u201Cstarts with\u201D a path.\n You can choose the \"Best match\" option to select a flow from the closest path.\n </gio-banner-info>\n </div>\n <div class=\"content__row\">\n <mat-form-field>\n <mat-label>Default flow mode</mat-label>\n <mat-select formControlName=\"mode\">\n <mat-option value=\"BEST_MATCH\">Best Match</mat-option>\n <mat-option value=\"DEFAULT\">Default</mat-option>\n </mat-select>\n <mat-hint>Change how the flow selection is made</mat-hint>\n </mat-form-field>\n </div>\n <div class=\"content__row\">\n <gio-form-slide-toggle>\n <gio-form-label>Fail on flow mismatch</gio-form-label>\n Respond with an error when requests don\u2019t match any defined flow\n <mat-slide-toggle gioFormSlideToggle formControlName=\"matchRequired\"></mat-slide-toggle>\n </gio-form-slide-toggle>\n </div>\n </mat-dialog-content>\n}\n\n<mat-dialog-actions class=\"actions\" align=\"end\">\n <button [disabled]=\"readOnly\" class=\"actions__cancelBtn\" mat-button [mat-dialog-close]=\"\">Cancel</button>\n <button [disabled]=\"readOnly\" class=\"actions__saveBtn\" color=\"primary\" mat-flat-button role=\"dialog\" (click)=\"onSubmit()\">Save</button>\n</mat-dialog-actions>\n", styles: [".title__closeBtn{top:0;right:-24px;float:right}.content__row{display:flex;align-items:flex-start;gap:16px}.content__row mat-form-field{flex:1 1 auto}\n"], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i3.MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: i3.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatDialogModule }, { kind: "directive", type: i1.MatDialogClose, selector: "[mat-dialog-close], [matDialogClose]", inputs: ["aria-label", "type", "mat-dialog-close", "matDialogClose"], exportAs: ["matDialogClose"] }, { kind: "directive", type: i1.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: i1.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "directive", type: i1.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i4.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i4.MatLabel, selector: "mat-label" }, { kind: "directive", type: i4.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "ngmodule", type: MatSelectModule }, { kind: "component", type: i5.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth", "canSelectNullableOptions"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: i5.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "ngmodule", type: MatSlideToggleModule }, { kind: "component", type: i6.MatSlideToggle, selector: "mat-slide-toggle", inputs: ["name", "id", "labelPosition", "aria-label", "aria-labelledby", "aria-describedby", "required", "color", "disabled", "disableRipple", "tabIndex", "checked", "hideIcon", "disabledInteractive"], outputs: ["change", "toggleChange"], exportAs: ["matSlideToggle"] }, { kind: "ngmodule", type: GioFormSlideToggleModule }, { kind: "component", type: i7.GioFormSlideToggleComponent, selector: "gio-form-slide-toggle", inputs: ["appearance"] }, { kind: "component", type: i7.GioFormLabelComponent, selector: "gio-form-label" }, { kind: "directive", type: i7.GioFormSlideToggleDirective, selector: "[gioFormSlideToggle]" }, { kind: "ngmodule", type: GioBannerModule }, { kind: "component", type: i7.GioBannerInfoComponent, selector: "gio-banner-info" }, { kind: "ngmodule", type: GioIconsModule }, { kind: "component", type:
|
|
335
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.3", type: GioPolicyStudioFlowExecutionFormDialogComponent, isStandalone: true, selector: "gio-ps-flow-execution-form-dialog", ngImport: i0, template: "<!--\n\n Copyright (C) 2025 The Gravitee team (http://gravitee.io)\n \n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n \n http://www.apache.org/licenses/LICENSE-2.0\n \n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n-->\n<h2 mat-dialog-title class=\"title\">\n Flow execution\n\n <button class=\"title__closeBtn\" mat-icon-button aria-label=\"Close dialog\" [mat-dialog-close]=\"\">\n <mat-icon svgIcon=\"gio:cancel\"></mat-icon>\n </button>\n</h2>\n\n@if (flowExecutionFormGroup) {\n <mat-dialog-content class=\"content\" [formGroup]=\"flowExecutionFormGroup\">\n <div class=\"content__row\">\n <gio-banner-info>\n By default, flow selection is based on the operators defined in your flows, either when it \u201Cmatches with\u201D or \u201Cstarts with\u201D a path.\n You can choose the \"Best match\" option to select a flow from the closest path.\n </gio-banner-info>\n </div>\n <div class=\"content__row\">\n <mat-form-field>\n <mat-label>Default flow mode</mat-label>\n <mat-select formControlName=\"mode\">\n <mat-option value=\"BEST_MATCH\">Best Match</mat-option>\n <mat-option value=\"DEFAULT\">Default</mat-option>\n </mat-select>\n <mat-hint>Change how the flow selection is made</mat-hint>\n </mat-form-field>\n </div>\n <div class=\"content__row\">\n <gio-form-slide-toggle>\n <gio-form-label>Fail on flow mismatch</gio-form-label>\n Respond with an error when requests don\u2019t match any defined flow\n <mat-slide-toggle gioFormSlideToggle formControlName=\"matchRequired\"></mat-slide-toggle>\n </gio-form-slide-toggle>\n </div>\n </mat-dialog-content>\n}\n\n<mat-dialog-actions class=\"actions\" align=\"end\">\n <button [disabled]=\"readOnly\" class=\"actions__cancelBtn\" mat-button [mat-dialog-close]=\"\">Cancel</button>\n <button [disabled]=\"readOnly\" class=\"actions__saveBtn\" color=\"primary\" mat-flat-button role=\"dialog\" (click)=\"onSubmit()\">Save</button>\n</mat-dialog-actions>\n", styles: [".title__closeBtn{top:0;right:-24px;float:right}.content__row{display:flex;align-items:flex-start;gap:16px}.content__row mat-form-field{flex:1 1 auto}\n"], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i3.MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: i3.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatDialogModule }, { kind: "directive", type: i1.MatDialogClose, selector: "[mat-dialog-close], [matDialogClose]", inputs: ["aria-label", "type", "mat-dialog-close", "matDialogClose"], exportAs: ["matDialogClose"] }, { kind: "directive", type: i1.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: i1.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "directive", type: i1.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i4.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i4.MatLabel, selector: "mat-label" }, { kind: "directive", type: i4.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "ngmodule", type: MatSelectModule }, { kind: "component", type: i5.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth", "canSelectNullableOptions"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: i5.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "ngmodule", type: MatSlideToggleModule }, { kind: "component", type: i6.MatSlideToggle, selector: "mat-slide-toggle", inputs: ["name", "id", "labelPosition", "aria-label", "aria-labelledby", "aria-describedby", "required", "color", "disabled", "disableRipple", "tabIndex", "checked", "hideIcon", "disabledInteractive"], outputs: ["change", "toggleChange"], exportAs: ["matSlideToggle"] }, { kind: "ngmodule", type: GioFormSlideToggleModule }, { kind: "component", type: i7.GioFormSlideToggleComponent, selector: "gio-form-slide-toggle", inputs: ["appearance"] }, { kind: "component", type: i7.GioFormLabelComponent, selector: "gio-form-label" }, { kind: "directive", type: i7.GioFormSlideToggleDirective, selector: "[gioFormSlideToggle]" }, { kind: "ngmodule", type: GioBannerModule }, { kind: "component", type: i7.GioBannerInfoComponent, selector: "gio-banner-info" }, { kind: "ngmodule", type: GioIconsModule }, { kind: "component", type: i6$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }] }); }
|
|
336
336
|
}
|
|
337
337
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: GioPolicyStudioFlowExecutionFormDialogComponent, decorators: [{
|
|
338
338
|
type: Component,
|
|
@@ -418,7 +418,7 @@ class GioPolicyStudioFlowMessageFormDialogComponent {
|
|
|
418
418
|
});
|
|
419
419
|
}
|
|
420
420
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: GioPolicyStudioFlowMessageFormDialogComponent, deps: [{ token: i1.MatDialogRef }, { token: MAT_DIALOG_DATA }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
421
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.3", type: GioPolicyStudioFlowMessageFormDialogComponent, isStandalone: true, selector: "gio-ps-flow-message-form-dialog", ngImport: i0, template: "<!--\n\n Copyright (C) 2025 The Gravitee team (http://gravitee.io)\n \n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n \n http://www.apache.org/licenses/LICENSE-2.0\n \n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n-->\n<h2 mat-dialog-title class=\"title\">\n {{ mode === 'create' ? 'Create a new flow' : 'Edit flow'\n }}<button class=\"title__closeBtn\" mat-icon-button aria-label=\"Close dialog\" [mat-dialog-close]=\"false\">\n <mat-icon svgIcon=\"gio:cancel\"></mat-icon>\n </button>\n</h2>\n\n@if (flowFormGroup) {\n <mat-dialog-content class=\"content\" [formGroup]=\"flowFormGroup\">\n <p>Flows allow you to apply different policies per event phases. For example you can reroute calls based on the URL specified.</p>\n <div class=\"content__row\">\n <mat-form-field>\n <mat-label>Flow name</mat-label>\n <input matInput formControlName=\"name\" cdkFocusInitial />\n <mat-hint>Names will be automatically generated with channel and operation if left blank.</mat-hint>\n </mat-form-field>\n </div>\n <div class=\"content__row\">\n <mat-form-field>\n <mat-label>Operator</mat-label>\n <mat-select formControlName=\"channelOperator\">\n <mat-option value=\"EQUALS\">Equals</mat-option>\n <mat-option value=\"STARTS_WITH\">Starts with</mat-option>\n </mat-select>\n <mat-hint>Channel operator.</mat-hint>\n </mat-form-field>\n <mat-form-field>\n <mat-label>Channel</mat-label>\n <input matInput formControlName=\"channel\" />\n <mat-hint>Publish or Subscribe channel. This is the path of your request.</mat-hint>\n </mat-form-field>\n </div>\n <div class=\"content__row\">\n <mat-form-field>\n <mat-label>Entrypoints</mat-label>\n <mat-select multiple formControlName=\"entrypoints\">\n @for (entrypoint of entrypoints; track entrypoint) {\n <mat-option [value]=\"entrypoint.type\">{{ entrypoint.name }}</mat-option>\n }\n </mat-select>\n <mat-hint>Entrypoints where your flow will be executed. They will all be executed if left empty.</mat-hint>\n </mat-form-field>\n </div>\n <div class=\"content__row\">\n <mat-form-field>\n <mat-label>Entrypoints supported operations</mat-label>\n <mat-select multiple formControlName=\"operations\">\n <mat-option value=\"PUBLISH\">Publish</mat-option>\n <mat-option value=\"SUBSCRIBE\">Subscribe</mat-option>\n </mat-select>\n <mat-hint>They will all be supported if left empty.</mat-hint>\n </mat-form-field>\n </div>\n <div class=\"content__row\">\n <mat-form-field>\n <mat-label>Condition</mat-label>\n <input matInput formControlName=\"condition\" />\n <mat-hint>Condition to execute the flow, supports Expression Language.</mat-hint>\n <gio-el-assistant matSuffix />\n </mat-form-field>\n </div>\n </mat-dialog-content>\n}\n\n<mat-dialog-actions class=\"actions\" align=\"end\">\n <button class=\"actions__cancelBtn\" mat-button [mat-dialog-close]=\"false\">Cancel</button>\n <button class=\"actions__saveBtn\" color=\"primary\" mat-flat-button role=\"dialog\" (click)=\"onSubmit()\">\n {{ mode === 'create' ? 'Create' : 'Save' }}\n </button>\n</mat-dialog-actions>\n", styles: [".title__closeBtn{top:0;right:-24px;float:right}.content__row{display:flex;align-items:flex-start;gap:16px}.content__row mat-form-field{flex:1 1 auto}\n"], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i3.MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: i3.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatDialogModule }, { kind: "directive", type: i1.MatDialogClose, selector: "[mat-dialog-close], [matDialogClose]", inputs: ["aria-label", "type", "mat-dialog-close", "matDialogClose"], exportAs: ["matDialogClose"] }, { kind: "directive", type: i1.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: i1.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "directive", type: i1.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i4.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i4.MatLabel, selector: "mat-label" }, { kind: "directive", type: i4.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i4.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: MatSelectModule }, { kind: "component", type: i5.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth", "canSelectNullableOptions"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: i5.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type:
|
|
421
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.3", type: GioPolicyStudioFlowMessageFormDialogComponent, isStandalone: true, selector: "gio-ps-flow-message-form-dialog", ngImport: i0, template: "<!--\n\n Copyright (C) 2025 The Gravitee team (http://gravitee.io)\n \n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n \n http://www.apache.org/licenses/LICENSE-2.0\n \n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n-->\n<h2 mat-dialog-title class=\"title\">\n {{ mode === 'create' ? 'Create a new flow' : 'Edit flow'\n }}<button class=\"title__closeBtn\" mat-icon-button aria-label=\"Close dialog\" [mat-dialog-close]=\"false\">\n <mat-icon svgIcon=\"gio:cancel\"></mat-icon>\n </button>\n</h2>\n\n@if (flowFormGroup) {\n <mat-dialog-content class=\"content\" [formGroup]=\"flowFormGroup\">\n <p>Flows allow you to apply different policies per event phases. For example you can reroute calls based on the URL specified.</p>\n <div class=\"content__row\">\n <mat-form-field>\n <mat-label>Flow name</mat-label>\n <input matInput formControlName=\"name\" cdkFocusInitial />\n <mat-hint>Names will be automatically generated with channel and operation if left blank.</mat-hint>\n </mat-form-field>\n </div>\n <div class=\"content__row\">\n <mat-form-field>\n <mat-label>Operator</mat-label>\n <mat-select formControlName=\"channelOperator\">\n <mat-option value=\"EQUALS\">Equals</mat-option>\n <mat-option value=\"STARTS_WITH\">Starts with</mat-option>\n </mat-select>\n <mat-hint>Channel operator.</mat-hint>\n </mat-form-field>\n <mat-form-field>\n <mat-label>Channel</mat-label>\n <input matInput formControlName=\"channel\" />\n <mat-hint>Publish or Subscribe channel. This is the path of your request.</mat-hint>\n </mat-form-field>\n </div>\n <div class=\"content__row\">\n <mat-form-field>\n <mat-label>Entrypoints</mat-label>\n <mat-select multiple formControlName=\"entrypoints\">\n @for (entrypoint of entrypoints; track entrypoint) {\n <mat-option [value]=\"entrypoint.type\">{{ entrypoint.name }}</mat-option>\n }\n </mat-select>\n <mat-hint>Entrypoints where your flow will be executed. They will all be executed if left empty.</mat-hint>\n </mat-form-field>\n </div>\n <div class=\"content__row\">\n <mat-form-field>\n <mat-label>Entrypoints supported operations</mat-label>\n <mat-select multiple formControlName=\"operations\">\n <mat-option value=\"PUBLISH\">Publish</mat-option>\n <mat-option value=\"SUBSCRIBE\">Subscribe</mat-option>\n </mat-select>\n <mat-hint>They will all be supported if left empty.</mat-hint>\n </mat-form-field>\n </div>\n <div class=\"content__row\">\n <mat-form-field>\n <mat-label>Condition</mat-label>\n <input matInput formControlName=\"condition\" />\n <mat-hint>Condition to execute the flow, supports Expression Language.</mat-hint>\n <gio-el-assistant matSuffix />\n </mat-form-field>\n </div>\n </mat-dialog-content>\n}\n\n<mat-dialog-actions class=\"actions\" align=\"end\">\n <button class=\"actions__cancelBtn\" mat-button [mat-dialog-close]=\"false\">Cancel</button>\n <button class=\"actions__saveBtn\" color=\"primary\" mat-flat-button role=\"dialog\" (click)=\"onSubmit()\">\n {{ mode === 'create' ? 'Create' : 'Save' }}\n </button>\n</mat-dialog-actions>\n", styles: [".title__closeBtn{top:0;right:-24px;float:right}.content__row{display:flex;align-items:flex-start;gap:16px}.content__row mat-form-field{flex:1 1 auto}\n"], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i3.MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: i3.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatDialogModule }, { kind: "directive", type: i1.MatDialogClose, selector: "[mat-dialog-close], [matDialogClose]", inputs: ["aria-label", "type", "mat-dialog-close", "matDialogClose"], exportAs: ["matDialogClose"] }, { kind: "directive", type: i1.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: i1.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "directive", type: i1.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i4.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i4.MatLabel, selector: "mat-label" }, { kind: "directive", type: i4.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i4.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: MatSelectModule }, { kind: "component", type: i5.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth", "canSelectNullableOptions"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: i5.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i5$1.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "ngmodule", type: MatSlideToggleModule }, { kind: "ngmodule", type: GioFormSlideToggleModule }, { kind: "ngmodule", type: GioBannerModule }, { kind: "ngmodule", type: GioIconsModule }, { kind: "component", type: i6$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: GioElAssistantComponent, selector: "gio-el-assistant" }] }); }
|
|
422
422
|
}
|
|
423
423
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: GioPolicyStudioFlowMessageFormDialogComponent, decorators: [{
|
|
424
424
|
type: Component,
|
|
@@ -487,7 +487,7 @@ class GioPolicyStudioFlowNativeFormDialogComponent {
|
|
|
487
487
|
return isEmpty(inputName) ? this.defaultFlowName : inputName;
|
|
488
488
|
}
|
|
489
489
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: GioPolicyStudioFlowNativeFormDialogComponent, deps: [{ token: i1.MatDialogRef }, { token: MAT_DIALOG_DATA }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
490
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.3", type: GioPolicyStudioFlowNativeFormDialogComponent, isStandalone: true, selector: "gio-ps-flow-native-form-dialog", ngImport: i0, template: "<!--\n\n Copyright (C) 2025 The Gravitee team (http://gravitee.io)\n \n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n \n http://www.apache.org/licenses/LICENSE-2.0\n \n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n-->\n<h2 mat-dialog-title class=\"title\">\n {{ mode === 'create' ? 'Create a new flow' : 'Edit flow' }}\n\n <button class=\"title__closeBtn\" mat-icon-button aria-label=\"Close dialog\" [mat-dialog-close]=\"false\">\n <mat-icon svgIcon=\"gio:cancel\"></mat-icon>\n </button>\n</h2>\n\n@if (flowFormGroup) {\n <mat-dialog-content class=\"content\" [formGroup]=\"flowFormGroup\">\n <p>Flow allow you to apply different policies. Only one flow is allowed for a native API.</p>\n <div class=\"content__row\">\n <mat-form-field>\n <mat-label>Flow name</mat-label>\n <input matInput formControlName=\"name\" cdkFocusInitial />\n <mat-hint>Names will be automatically generated if left blank</mat-hint>\n </mat-form-field>\n </div>\n </mat-dialog-content>\n}\n\n<mat-dialog-actions class=\"actions\" align=\"end\">\n <button class=\"actions__cancelBtn\" mat-button [mat-dialog-close]=\"false\">Cancel</button>\n <button class=\"actions__saveBtn\" color=\"primary\" mat-flat-button role=\"dialog\" (click)=\"onSubmit()\">\n {{ mode === 'create' ? 'Create' : 'Save' }}\n </button>\n</mat-dialog-actions>\n", styles: [".title__closeBtn{top:0;right:-24px;float:right}.content__row{display:flex;align-items:flex-start;gap:16px}.content__row mat-form-field{flex:1 1 auto}\n"], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i3.MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: i3.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatDialogModule }, { kind: "directive", type: i1.MatDialogClose, selector: "[mat-dialog-close], [matDialogClose]", inputs: ["aria-label", "type", "mat-dialog-close", "matDialogClose"], exportAs: ["matDialogClose"] }, { kind: "directive", type: i1.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: i1.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "directive", type: i1.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i4.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i4.MatLabel, selector: "mat-label" }, { kind: "directive", type: i4.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "ngmodule", type: MatSelectModule }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type:
|
|
490
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.3", type: GioPolicyStudioFlowNativeFormDialogComponent, isStandalone: true, selector: "gio-ps-flow-native-form-dialog", ngImport: i0, template: "<!--\n\n Copyright (C) 2025 The Gravitee team (http://gravitee.io)\n \n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n \n http://www.apache.org/licenses/LICENSE-2.0\n \n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n-->\n<h2 mat-dialog-title class=\"title\">\n {{ mode === 'create' ? 'Create a new flow' : 'Edit flow' }}\n\n <button class=\"title__closeBtn\" mat-icon-button aria-label=\"Close dialog\" [mat-dialog-close]=\"false\">\n <mat-icon svgIcon=\"gio:cancel\"></mat-icon>\n </button>\n</h2>\n\n@if (flowFormGroup) {\n <mat-dialog-content class=\"content\" [formGroup]=\"flowFormGroup\">\n <p>Flow allow you to apply different policies. Only one flow is allowed for a native API.</p>\n <div class=\"content__row\">\n <mat-form-field>\n <mat-label>Flow name</mat-label>\n <input matInput formControlName=\"name\" cdkFocusInitial />\n <mat-hint>Names will be automatically generated if left blank</mat-hint>\n </mat-form-field>\n </div>\n </mat-dialog-content>\n}\n\n<mat-dialog-actions class=\"actions\" align=\"end\">\n <button class=\"actions__cancelBtn\" mat-button [mat-dialog-close]=\"false\">Cancel</button>\n <button class=\"actions__saveBtn\" color=\"primary\" mat-flat-button role=\"dialog\" (click)=\"onSubmit()\">\n {{ mode === 'create' ? 'Create' : 'Save' }}\n </button>\n</mat-dialog-actions>\n", styles: [".title__closeBtn{top:0;right:-24px;float:right}.content__row{display:flex;align-items:flex-start;gap:16px}.content__row mat-form-field{flex:1 1 auto}\n"], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i3.MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: i3.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatDialogModule }, { kind: "directive", type: i1.MatDialogClose, selector: "[mat-dialog-close], [matDialogClose]", inputs: ["aria-label", "type", "mat-dialog-close", "matDialogClose"], exportAs: ["matDialogClose"] }, { kind: "directive", type: i1.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: i1.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "directive", type: i1.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i4.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i4.MatLabel, selector: "mat-label" }, { kind: "directive", type: i4.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "ngmodule", type: MatSelectModule }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i5$1.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "ngmodule", type: MatSlideToggleModule }, { kind: "ngmodule", type: GioFormSlideToggleModule }, { kind: "ngmodule", type: GioBannerModule }, { kind: "ngmodule", type: GioIconsModule }, { kind: "component", type: i6$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: GioFormTagsInputModule }] }); }
|
|
491
491
|
}
|
|
492
492
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: GioPolicyStudioFlowNativeFormDialogComponent, decorators: [{
|
|
493
493
|
type: Component,
|
|
@@ -576,7 +576,7 @@ class GioPolicyStudioFlowProxyFormDialogComponent {
|
|
|
576
576
|
validationCb(METHODS_AUTOCOMPLETE.map(m => `${m}`).includes(tag.toUpperCase()));
|
|
577
577
|
}
|
|
578
578
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: GioPolicyStudioFlowProxyFormDialogComponent, deps: [{ token: i1.MatDialogRef }, { token: MAT_DIALOG_DATA }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
579
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.3", type: GioPolicyStudioFlowProxyFormDialogComponent, isStandalone: true, selector: "gio-ps-flow-proxy-form-dialog", ngImport: i0, template: "<!--\n\n Copyright (C) 2025 The Gravitee team (http://gravitee.io)\n \n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n \n http://www.apache.org/licenses/LICENSE-2.0\n \n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n-->\n<h2 mat-dialog-title class=\"title\">\n {{ mode === 'create' ? 'Create a new flow' : 'Edit flow' }}\n\n <button class=\"title__closeBtn\" mat-icon-button aria-label=\"Close dialog\" [mat-dialog-close]=\"false\">\n <mat-icon svgIcon=\"gio:cancel\"></mat-icon>\n </button>\n</h2>\n\n@if (flowFormGroup) {\n <mat-dialog-content class=\"content\" [formGroup]=\"flowFormGroup\">\n <p>\n Flows allow you to apply different policies per HTTP path and/or method. For example you can reroute calls based on the URL specified.\n </p>\n <div class=\"content__row\">\n <mat-form-field>\n <mat-label>Flow name</mat-label>\n <input matInput formControlName=\"name\" cdkFocusInitial />\n <mat-hint>Names will be automatically generated with path and method if left blank</mat-hint>\n </mat-form-field>\n </div>\n <div class=\"content__row\">\n <mat-form-field>\n <mat-label>Operator</mat-label>\n <mat-select formControlName=\"pathOperator\">\n <mat-option value=\"EQUALS\">Equals</mat-option>\n <mat-option value=\"STARTS_WITH\">Starts with</mat-option>\n </mat-select>\n <mat-hint>Path operator</mat-hint>\n </mat-form-field>\n <mat-form-field>\n <mat-label>Path</mat-label>\n <span matTextPrefix>/ </span>\n <input matInput formControlName=\"path\" />\n <mat-hint>Path</mat-hint>\n </mat-form-field>\n </div>\n <div class=\"content__row\">\n <mat-form-field>\n <mat-label>Methods for your flow</mat-label>\n <gio-form-tags-input\n formControlName=\"methods\"\n [autocompleteOptions]=\"methods\"\n [tagValidationHook]=\"tagValidationHook\"\n ></gio-form-tags-input>\n </mat-form-field>\n </div>\n <div class=\"content__row\">\n <mat-form-field>\n <mat-label>Condition</mat-label>\n <input matInput formControlName=\"condition\" />\n <mat-hint>Condition to execute the flow, supports Expression Language</mat-hint>\n <gio-el-assistant matSuffix />\n </mat-form-field>\n </div>\n </mat-dialog-content>\n}\n\n<mat-dialog-actions class=\"actions\" align=\"end\">\n <button class=\"actions__cancelBtn\" mat-button [mat-dialog-close]=\"false\">Cancel</button>\n <button class=\"actions__saveBtn\" color=\"primary\" mat-flat-button role=\"dialog\" (click)=\"onSubmit()\">\n {{ mode === 'create' ? 'Create' : 'Save' }}\n </button>\n</mat-dialog-actions>\n", styles: [".title__closeBtn{top:0;right:-24px;float:right}.content__row{display:flex;align-items:flex-start;gap:16px}.content__row mat-form-field{flex:1 1 auto}\n"], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i3.MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: i3.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatDialogModule }, { kind: "directive", type: i1.MatDialogClose, selector: "[mat-dialog-close], [matDialogClose]", inputs: ["aria-label", "type", "mat-dialog-close", "matDialogClose"], exportAs: ["matDialogClose"] }, { kind: "directive", type: i1.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: i1.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "directive", type: i1.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i4.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i4.MatLabel, selector: "mat-label" }, { kind: "directive", type: i4.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i4.MatPrefix, selector: "[matPrefix], [matIconPrefix], [matTextPrefix]", inputs: ["matTextPrefix"] }, { kind: "directive", type: i4.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: MatSelectModule }, { kind: "component", type: i5.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth", "canSelectNullableOptions"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: i5.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type:
|
|
579
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.3", type: GioPolicyStudioFlowProxyFormDialogComponent, isStandalone: true, selector: "gio-ps-flow-proxy-form-dialog", ngImport: i0, template: "<!--\n\n Copyright (C) 2025 The Gravitee team (http://gravitee.io)\n \n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n \n http://www.apache.org/licenses/LICENSE-2.0\n \n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n-->\n<h2 mat-dialog-title class=\"title\">\n {{ mode === 'create' ? 'Create a new flow' : 'Edit flow' }}\n\n <button class=\"title__closeBtn\" mat-icon-button aria-label=\"Close dialog\" [mat-dialog-close]=\"false\">\n <mat-icon svgIcon=\"gio:cancel\"></mat-icon>\n </button>\n</h2>\n\n@if (flowFormGroup) {\n <mat-dialog-content class=\"content\" [formGroup]=\"flowFormGroup\">\n <p>\n Flows allow you to apply different policies per HTTP path and/or method. For example you can reroute calls based on the URL specified.\n </p>\n <div class=\"content__row\">\n <mat-form-field>\n <mat-label>Flow name</mat-label>\n <input matInput formControlName=\"name\" cdkFocusInitial />\n <mat-hint>Names will be automatically generated with path and method if left blank</mat-hint>\n </mat-form-field>\n </div>\n <div class=\"content__row\">\n <mat-form-field>\n <mat-label>Operator</mat-label>\n <mat-select formControlName=\"pathOperator\">\n <mat-option value=\"EQUALS\">Equals</mat-option>\n <mat-option value=\"STARTS_WITH\">Starts with</mat-option>\n </mat-select>\n <mat-hint>Path operator</mat-hint>\n </mat-form-field>\n <mat-form-field>\n <mat-label>Path</mat-label>\n <span matTextPrefix>/ </span>\n <input matInput formControlName=\"path\" />\n <mat-hint>Path</mat-hint>\n </mat-form-field>\n </div>\n <div class=\"content__row\">\n <mat-form-field>\n <mat-label>Methods for your flow</mat-label>\n <gio-form-tags-input\n formControlName=\"methods\"\n [autocompleteOptions]=\"methods\"\n [tagValidationHook]=\"tagValidationHook\"\n ></gio-form-tags-input>\n </mat-form-field>\n </div>\n <div class=\"content__row\">\n <mat-form-field>\n <mat-label>Condition</mat-label>\n <input matInput formControlName=\"condition\" />\n <mat-hint>Condition to execute the flow, supports Expression Language</mat-hint>\n <gio-el-assistant matSuffix />\n </mat-form-field>\n </div>\n </mat-dialog-content>\n}\n\n<mat-dialog-actions class=\"actions\" align=\"end\">\n <button class=\"actions__cancelBtn\" mat-button [mat-dialog-close]=\"false\">Cancel</button>\n <button class=\"actions__saveBtn\" color=\"primary\" mat-flat-button role=\"dialog\" (click)=\"onSubmit()\">\n {{ mode === 'create' ? 'Create' : 'Save' }}\n </button>\n</mat-dialog-actions>\n", styles: [".title__closeBtn{top:0;right:-24px;float:right}.content__row{display:flex;align-items:flex-start;gap:16px}.content__row mat-form-field{flex:1 1 auto}\n"], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i3.MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: i3.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatDialogModule }, { kind: "directive", type: i1.MatDialogClose, selector: "[mat-dialog-close], [matDialogClose]", inputs: ["aria-label", "type", "mat-dialog-close", "matDialogClose"], exportAs: ["matDialogClose"] }, { kind: "directive", type: i1.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: i1.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "directive", type: i1.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i4.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i4.MatLabel, selector: "mat-label" }, { kind: "directive", type: i4.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i4.MatPrefix, selector: "[matPrefix], [matIconPrefix], [matTextPrefix]", inputs: ["matTextPrefix"] }, { kind: "directive", type: i4.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: MatSelectModule }, { kind: "component", type: i5.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth", "canSelectNullableOptions"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: i5.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i5$1.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "ngmodule", type: MatSlideToggleModule }, { kind: "ngmodule", type: GioFormSlideToggleModule }, { kind: "ngmodule", type: GioBannerModule }, { kind: "ngmodule", type: GioIconsModule }, { kind: "component", type: i6$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: GioFormTagsInputModule }, { kind: "component", type: i7.GioFormTagsInputComponent, selector: "gio-form-tags-input", inputs: ["aria-label", "addOnBlur", "tagValidationHook", "autocompleteOptions", "displayValueWith", "useAutocompleteOptionValueOnly", "placeholder", "required", "disabled"], outputs: ["tagClicked"] }, { kind: "component", type: GioElAssistantComponent, selector: "gio-el-assistant" }] }); }
|
|
580
580
|
}
|
|
581
581
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: GioPolicyStudioFlowProxyFormDialogComponent, decorators: [{
|
|
582
582
|
type: Component,
|
|
@@ -752,7 +752,7 @@ class GioPolicyStudioFlowMcpFormDialogComponent {
|
|
|
752
752
|
.includes(tag));
|
|
753
753
|
}
|
|
754
754
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: GioPolicyStudioFlowMcpFormDialogComponent, deps: [{ token: i1.MatDialogRef }, { token: MAT_DIALOG_DATA }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
755
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.3", type: GioPolicyStudioFlowMcpFormDialogComponent, isStandalone: true, selector: "gio-ps-flow-mcp-form-dialog", ngImport: i0, template: "<!--\n\n Copyright (C) 2025 The Gravitee team (http://gravitee.io)\n \n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n \n http://www.apache.org/licenses/LICENSE-2.0\n \n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n-->\n<h2 mat-dialog-title class=\"title\">\n {{ mode === 'create' ? 'Create a new flow' : 'Edit flow' }}\n\n <button class=\"title__closeBtn\" mat-icon-button aria-label=\"Close dialog\" [mat-dialog-close]=\"false\">\n <mat-icon svgIcon=\"gio:cancel\"></mat-icon>\n </button>\n</h2>\n\n@if (flowFormGroup) {\n <mat-dialog-content class=\"content\" [formGroup]=\"flowFormGroup\">\n <p>Flow allow you to apply different policies.</p>\n <div class=\"content__row\">\n <mat-form-field class=\"content__row__fullWidth\">\n <mat-label>Flow name</mat-label>\n <input matInput formControlName=\"name\" cdkFocusInitial />\n <mat-hint>Names will be automatically generated if left blank</mat-hint>\n </mat-form-field>\n </div>\n\n <div class=\"content__row\">\n <mat-form-field class=\"content__row__fullWidth\">\n <mat-label>MCP Methods for your flow</mat-label>\n <gio-form-tags-input\n formControlName=\"mcpMethods\"\n [autocompleteOptions]=\"methods\"\n [tagValidationHook]=\"tagValidationHook\"\n ></gio-form-tags-input>\n <mat-hint>If no method is specified, the flow will match all MCP Methods</mat-hint>\n </mat-form-field>\n </div>\n <div class=\"content__row\">\n <mat-form-field class=\"content__row__fullWidth\">\n <mat-label>Condition</mat-label>\n <input matInput formControlName=\"condition\" />\n <mat-hint>Condition to execute the flow, supports Expression Language</mat-hint>\n <gio-el-assistant matSuffix />\n </mat-form-field>\n </div>\n </mat-dialog-content>\n}\n\n<mat-dialog-actions class=\"actions\" align=\"end\">\n <button class=\"actions__cancelBtn\" mat-button [mat-dialog-close]=\"false\">Cancel</button>\n <button class=\"actions__saveBtn\" color=\"primary\" mat-flat-button role=\"dialog\" (click)=\"onSubmit()\">\n {{ mode === 'create' ? 'Create' : 'Save' }}\n </button>\n</mat-dialog-actions>\n", styles: ["@charset \"UTF-8\";.gio-top-bar-menu .gio-badge-accent{background-color:var(--gio-oem-palette--active, #ffc2ac);color:var(--gio-oem-palette--active-contrast, #1e1b1b)}.title__closeBtn{top:0;right:-24px;float:right}.content__paramTitle{font-size:14px;font-weight:700;line-height:20px;font-family:Manrope,sans-serif;letter-spacing:.4px;color:#5c5959}.content--params{margin-bottom:6px}.content__row{display:flex;align-items:flex-start;gap:16px}.content__row__fullWidth{flex:1 1 auto}.button-with-icon{display:flex;align-items:center;justify-content:space-between}\n"], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i3.MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: i3.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatDialogModule }, { kind: "directive", type: i1.MatDialogClose, selector: "[mat-dialog-close], [matDialogClose]", inputs: ["aria-label", "type", "mat-dialog-close", "matDialogClose"], exportAs: ["matDialogClose"] }, { kind: "directive", type: i1.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: i1.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "directive", type: i1.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i4.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i4.MatLabel, selector: "mat-label" }, { kind: "directive", type: i4.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i4.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: MatSelectModule }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type:
|
|
755
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.3", type: GioPolicyStudioFlowMcpFormDialogComponent, isStandalone: true, selector: "gio-ps-flow-mcp-form-dialog", ngImport: i0, template: "<!--\n\n Copyright (C) 2025 The Gravitee team (http://gravitee.io)\n \n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n \n http://www.apache.org/licenses/LICENSE-2.0\n \n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n-->\n<h2 mat-dialog-title class=\"title\">\n {{ mode === 'create' ? 'Create a new flow' : 'Edit flow' }}\n\n <button class=\"title__closeBtn\" mat-icon-button aria-label=\"Close dialog\" [mat-dialog-close]=\"false\">\n <mat-icon svgIcon=\"gio:cancel\"></mat-icon>\n </button>\n</h2>\n\n@if (flowFormGroup) {\n <mat-dialog-content class=\"content\" [formGroup]=\"flowFormGroup\">\n <p>Flow allow you to apply different policies.</p>\n <div class=\"content__row\">\n <mat-form-field class=\"content__row__fullWidth\">\n <mat-label>Flow name</mat-label>\n <input matInput formControlName=\"name\" cdkFocusInitial />\n <mat-hint>Names will be automatically generated if left blank</mat-hint>\n </mat-form-field>\n </div>\n\n <div class=\"content__row\">\n <mat-form-field class=\"content__row__fullWidth\">\n <mat-label>MCP Methods for your flow</mat-label>\n <gio-form-tags-input\n formControlName=\"mcpMethods\"\n [autocompleteOptions]=\"methods\"\n [tagValidationHook]=\"tagValidationHook\"\n ></gio-form-tags-input>\n <mat-hint>If no method is specified, the flow will match all MCP Methods</mat-hint>\n </mat-form-field>\n </div>\n <div class=\"content__row\">\n <mat-form-field class=\"content__row__fullWidth\">\n <mat-label>Condition</mat-label>\n <input matInput formControlName=\"condition\" />\n <mat-hint>Condition to execute the flow, supports Expression Language</mat-hint>\n <gio-el-assistant matSuffix />\n </mat-form-field>\n </div>\n </mat-dialog-content>\n}\n\n<mat-dialog-actions class=\"actions\" align=\"end\">\n <button class=\"actions__cancelBtn\" mat-button [mat-dialog-close]=\"false\">Cancel</button>\n <button class=\"actions__saveBtn\" color=\"primary\" mat-flat-button role=\"dialog\" (click)=\"onSubmit()\">\n {{ mode === 'create' ? 'Create' : 'Save' }}\n </button>\n</mat-dialog-actions>\n", styles: ["@charset \"UTF-8\";.gio-top-bar-menu .gio-badge-accent{background-color:var(--gio-oem-palette--active, #ffc2ac);color:var(--gio-oem-palette--active-contrast, #1e1b1b)}.title__closeBtn{top:0;right:-24px;float:right}.content__paramTitle{font-size:14px;font-weight:700;line-height:20px;font-family:Manrope,sans-serif;letter-spacing:.4px;color:#5c5959}.content--params{margin-bottom:6px}.content__row{display:flex;align-items:flex-start;gap:16px}.content__row__fullWidth{flex:1 1 auto}.button-with-icon{display:flex;align-items:center;justify-content:space-between}\n"], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i3.MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: i3.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatDialogModule }, { kind: "directive", type: i1.MatDialogClose, selector: "[mat-dialog-close], [matDialogClose]", inputs: ["aria-label", "type", "mat-dialog-close", "matDialogClose"], exportAs: ["matDialogClose"] }, { kind: "directive", type: i1.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: i1.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "directive", type: i1.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i4.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i4.MatLabel, selector: "mat-label" }, { kind: "directive", type: i4.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i4.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: MatSelectModule }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i5$1.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "ngmodule", type: MatSlideToggleModule }, { kind: "ngmodule", type: GioFormSlideToggleModule }, { kind: "ngmodule", type: GioBannerModule }, { kind: "ngmodule", type: GioIconsModule }, { kind: "component", type: i6$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: GioFormTagsInputModule }, { kind: "component", type: i7.GioFormTagsInputComponent, selector: "gio-form-tags-input", inputs: ["aria-label", "addOnBlur", "tagValidationHook", "autocompleteOptions", "displayValueWith", "useAutocompleteOptionValueOnly", "placeholder", "required", "disabled"], outputs: ["tagClicked"] }, { kind: "component", type: GioElAssistantComponent, selector: "gio-el-assistant" }] }); }
|
|
756
756
|
}
|
|
757
757
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: GioPolicyStudioFlowMcpFormDialogComponent, decorators: [{
|
|
758
758
|
type: Component,
|
|
@@ -775,6 +775,160 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImpor
|
|
|
775
775
|
args: [MAT_DIALOG_DATA]
|
|
776
776
|
}] }] });
|
|
777
777
|
|
|
778
|
+
/*
|
|
779
|
+
* Copyright (C) 2015 The Gravitee team (http://gravitee.io)
|
|
780
|
+
*
|
|
781
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
782
|
+
* you may not use this file except in compliance with the License.
|
|
783
|
+
* You may obtain a copy of the License at
|
|
784
|
+
*
|
|
785
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
786
|
+
*
|
|
787
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
788
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
789
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
790
|
+
* See the License for the specific language governing permissions and
|
|
791
|
+
* limitations under the License.
|
|
792
|
+
*/
|
|
793
|
+
const LLM_METHODS = [
|
|
794
|
+
{
|
|
795
|
+
groupLabel: 'Lifecycle Methods',
|
|
796
|
+
groupOptions: [
|
|
797
|
+
{ value: 'initialize', label: 'initialize' },
|
|
798
|
+
{ value: 'notifications/initialized', label: 'notifications/initialized' },
|
|
799
|
+
{ value: 'ping', label: 'ping' },
|
|
800
|
+
{ value: 'notifications/progress', label: 'notifications/progress' },
|
|
801
|
+
],
|
|
802
|
+
},
|
|
803
|
+
{
|
|
804
|
+
groupLabel: 'Tool Methods',
|
|
805
|
+
groupOptions: [
|
|
806
|
+
{ value: 'tools/list', label: 'tools/list' },
|
|
807
|
+
{ value: 'tools/call', label: 'tools/call' },
|
|
808
|
+
{ value: 'notifications/tools/list_changed', label: 'notifications/tools/list_changed' },
|
|
809
|
+
],
|
|
810
|
+
},
|
|
811
|
+
{
|
|
812
|
+
groupLabel: 'Resources Methods',
|
|
813
|
+
groupOptions: [
|
|
814
|
+
{ value: 'resources/list', label: 'resources/list' },
|
|
815
|
+
{ value: 'resources/read', label: 'resources/read' },
|
|
816
|
+
{ value: 'notifications/resources/list_changed', label: 'notifications/resources/list_changed' },
|
|
817
|
+
{ value: 'notifications/resources/updated', label: 'notifications/resources/updated' },
|
|
818
|
+
{ value: 'resources/templates/list', label: 'resources/templates/list' },
|
|
819
|
+
{ value: 'resources/subscribe', label: 'resources/subscribe' },
|
|
820
|
+
{ value: 'resources/unsubscribe', label: 'resources/unsubscribe' },
|
|
821
|
+
],
|
|
822
|
+
},
|
|
823
|
+
{
|
|
824
|
+
groupLabel: 'Prompt Methods',
|
|
825
|
+
groupOptions: [
|
|
826
|
+
{ value: 'prompts/list', label: 'prompts/list' },
|
|
827
|
+
{ value: 'prompts/get', label: 'prompts/get' },
|
|
828
|
+
{ value: 'notifications/prompts/list_changed', label: 'notifications/prompts/list_changed' },
|
|
829
|
+
{ value: 'completion/complete', label: 'completion/complete' },
|
|
830
|
+
],
|
|
831
|
+
},
|
|
832
|
+
{
|
|
833
|
+
groupLabel: 'Logging Methods',
|
|
834
|
+
groupOptions: [
|
|
835
|
+
{ value: 'logging/setLevel', label: 'logging/setLevel' },
|
|
836
|
+
{ value: 'notifications/message', label: 'notifications/message' },
|
|
837
|
+
],
|
|
838
|
+
},
|
|
839
|
+
{
|
|
840
|
+
groupLabel: 'Roots Methods',
|
|
841
|
+
groupOptions: [
|
|
842
|
+
{ value: 'roots/list', label: 'roots/list' },
|
|
843
|
+
{ value: 'notifications/roots/list_changed', label: 'notifications/roots/list_changed' },
|
|
844
|
+
],
|
|
845
|
+
},
|
|
846
|
+
{
|
|
847
|
+
groupLabel: 'Sampling Methods',
|
|
848
|
+
groupOptions: [{ value: 'sampling/createMessage', label: 'sampling/createMessage' }],
|
|
849
|
+
},
|
|
850
|
+
{
|
|
851
|
+
groupLabel: 'Elicitation Methods',
|
|
852
|
+
groupOptions: [{ value: 'elicitation/create', label: 'elicitation/create' }],
|
|
853
|
+
},
|
|
854
|
+
];
|
|
855
|
+
class GioPolicyStudioFlowLlmFormDialogComponent {
|
|
856
|
+
constructor(dialogRef, flowDialogData) {
|
|
857
|
+
this.dialogRef = dialogRef;
|
|
858
|
+
this.mode = 'create';
|
|
859
|
+
this.methods = LLM_METHODS;
|
|
860
|
+
this.existingFlow = cloneDeep(flowDialogData?.flow);
|
|
861
|
+
this.mode = this.existingFlow ? 'edit' : 'create';
|
|
862
|
+
const llmSelector = flowDialogData?.flow?.selectors?.find(s => s.type === 'LLM');
|
|
863
|
+
const conditionSelector = flowDialogData?.flow?.selectors?.find(s => s.type === 'CONDITION');
|
|
864
|
+
this.flowFormGroup = new FormGroup({
|
|
865
|
+
name: new FormControl(flowDialogData?.flow?.name ?? ''),
|
|
866
|
+
llmMethods: new FormControl(llmSelector?.methods ?? []),
|
|
867
|
+
condition: new FormControl(conditionSelector?.condition ?? ''),
|
|
868
|
+
});
|
|
869
|
+
this.defaultFlowName = capitalize(flowDialogData.parentGroupName) + ' flow';
|
|
870
|
+
}
|
|
871
|
+
onSubmit() {
|
|
872
|
+
const llmSelectorToSave = {
|
|
873
|
+
type: 'LLM',
|
|
874
|
+
methods: this.flowFormGroup?.get('llmMethods')?.value ?? undefined,
|
|
875
|
+
};
|
|
876
|
+
const conditionValue = this.flowFormGroup?.get('condition')?.value ?? undefined;
|
|
877
|
+
const conditionSelectorToSave = conditionValue
|
|
878
|
+
? {
|
|
879
|
+
type: 'CONDITION',
|
|
880
|
+
condition: conditionValue,
|
|
881
|
+
}
|
|
882
|
+
: undefined;
|
|
883
|
+
const flowToSave = {
|
|
884
|
+
// New id for new flow
|
|
885
|
+
_id: uniqueId('flow_'),
|
|
886
|
+
// If existing flow, keep root props
|
|
887
|
+
...this.existingFlow,
|
|
888
|
+
// Mark as changed
|
|
889
|
+
_hasChanged: true,
|
|
890
|
+
// Add changes
|
|
891
|
+
name: this.getFlowName(),
|
|
892
|
+
enabled: this.existingFlow ? this.existingFlow.enabled : true,
|
|
893
|
+
selectors: conditionSelectorToSave ? [llmSelectorToSave, conditionSelectorToSave] : [llmSelectorToSave],
|
|
894
|
+
};
|
|
895
|
+
this.dialogRef.close({
|
|
896
|
+
...flowToSave,
|
|
897
|
+
});
|
|
898
|
+
}
|
|
899
|
+
getFlowName() {
|
|
900
|
+
const inputName = trim(this.flowFormGroup?.get('name')?.value ?? '');
|
|
901
|
+
return isEmpty(inputName) ? this.defaultFlowName : inputName;
|
|
902
|
+
}
|
|
903
|
+
tagValidationHook(tag, validationCb) {
|
|
904
|
+
validationCb(LLM_METHODS.flatMap(group => group.groupOptions.map(m => m.value))
|
|
905
|
+
.map(m => `${m}`)
|
|
906
|
+
.includes(tag));
|
|
907
|
+
}
|
|
908
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: GioPolicyStudioFlowLlmFormDialogComponent, deps: [{ token: i1.MatDialogRef }, { token: MAT_DIALOG_DATA }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
909
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.3", type: GioPolicyStudioFlowLlmFormDialogComponent, isStandalone: true, selector: "gio-ps-flow-llm-form-dialog", ngImport: i0, template: "<!--\n\n Copyright (C) 2025 The Gravitee team (http://gravitee.io)\n \n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n \n http://www.apache.org/licenses/LICENSE-2.0\n \n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n-->\n<h2 mat-dialog-title class=\"title\">\n {{ mode === 'create' ? 'Create a new flow' : 'Edit flow' }}\n\n <button class=\"title__closeBtn\" mat-icon-button aria-label=\"Close dialog\" [mat-dialog-close]=\"false\">\n <mat-icon svgIcon=\"gio:cancel\"></mat-icon>\n </button>\n</h2>\n\n@if (flowFormGroup) {\n <mat-dialog-content class=\"content\" [formGroup]=\"flowFormGroup\">\n <p>Flow allow you to apply different policies.</p>\n <div class=\"content__row\">\n <mat-form-field class=\"content__row__fullWidth\">\n <mat-label>Flow name</mat-label>\n <input matInput formControlName=\"name\" cdkFocusInitial />\n <mat-hint>Names will be automatically generated if left blank</mat-hint>\n </mat-form-field>\n </div>\n\n <div class=\"content__row\">\n <mat-form-field class=\"content__row__fullWidth\">\n <mat-label>LLM Methods for your flow</mat-label>\n <gio-form-tags-input\n formControlName=\"llmMethods\"\n [autocompleteOptions]=\"methods\"\n [tagValidationHook]=\"tagValidationHook\"\n ></gio-form-tags-input>\n <mat-hint>If no method is specified, the flow will match all LLM Methods</mat-hint>\n </mat-form-field>\n </div>\n <div class=\"content__row\">\n <mat-form-field class=\"content__row__fullWidth\">\n <mat-label>Condition</mat-label>\n <input matInput formControlName=\"condition\" />\n <mat-hint>Condition to execute the flow, supports Expression Language</mat-hint>\n <gio-el-assistant matSuffix />\n </mat-form-field>\n </div>\n </mat-dialog-content>\n}\n\n<mat-dialog-actions class=\"actions\" align=\"end\">\n <button class=\"actions__cancelBtn\" mat-button [mat-dialog-close]=\"false\">Cancel</button>\n <button class=\"actions__saveBtn\" color=\"primary\" mat-flat-button role=\"dialog\" (click)=\"onSubmit()\">\n {{ mode === 'create' ? 'Create' : 'Save' }}\n </button>\n</mat-dialog-actions>\n", styles: ["@charset \"UTF-8\";.gio-top-bar-menu .gio-badge-accent{background-color:var(--gio-oem-palette--active, #ffc2ac);color:var(--gio-oem-palette--active-contrast, #1e1b1b)}.title__closeBtn{top:0;right:-24px;float:right}.content__paramTitle{font-size:14px;font-weight:700;line-height:20px;font-family:Manrope,sans-serif;letter-spacing:.4px;color:#5c5959}.content--params{margin-bottom:6px}.content__row{display:flex;align-items:flex-start;gap:16px}.content__row__fullWidth{flex:1 1 auto}.button-with-icon{display:flex;align-items:center;justify-content:space-between}\n"], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i3.MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: i3.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatDialogModule }, { kind: "directive", type: i1.MatDialogClose, selector: "[mat-dialog-close], [matDialogClose]", inputs: ["aria-label", "type", "mat-dialog-close", "matDialogClose"], exportAs: ["matDialogClose"] }, { kind: "directive", type: i1.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: i1.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "directive", type: i1.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i4.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i4.MatLabel, selector: "mat-label" }, { kind: "directive", type: i4.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i4.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: MatSelectModule }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i5$1.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "ngmodule", type: MatSlideToggleModule }, { kind: "ngmodule", type: GioFormSlideToggleModule }, { kind: "ngmodule", type: GioBannerModule }, { kind: "ngmodule", type: GioIconsModule }, { kind: "component", type: i6$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: GioFormTagsInputModule }, { kind: "component", type: i7.GioFormTagsInputComponent, selector: "gio-form-tags-input", inputs: ["aria-label", "addOnBlur", "tagValidationHook", "autocompleteOptions", "displayValueWith", "useAutocompleteOptionValueOnly", "placeholder", "required", "disabled"], outputs: ["tagClicked"] }, { kind: "component", type: GioElAssistantComponent, selector: "gio-el-assistant" }] }); }
|
|
910
|
+
}
|
|
911
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: GioPolicyStudioFlowLlmFormDialogComponent, decorators: [{
|
|
912
|
+
type: Component,
|
|
913
|
+
args: [{ imports: [
|
|
914
|
+
ReactiveFormsModule,
|
|
915
|
+
MatButtonModule,
|
|
916
|
+
MatDialogModule,
|
|
917
|
+
MatFormFieldModule,
|
|
918
|
+
MatSelectModule,
|
|
919
|
+
MatInputModule,
|
|
920
|
+
MatSlideToggleModule,
|
|
921
|
+
GioFormSlideToggleModule,
|
|
922
|
+
GioBannerModule,
|
|
923
|
+
GioIconsModule,
|
|
924
|
+
GioFormTagsInputModule,
|
|
925
|
+
GioElAssistantComponent,
|
|
926
|
+
], selector: 'gio-ps-flow-llm-form-dialog', template: "<!--\n\n Copyright (C) 2025 The Gravitee team (http://gravitee.io)\n \n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n \n http://www.apache.org/licenses/LICENSE-2.0\n \n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n-->\n<h2 mat-dialog-title class=\"title\">\n {{ mode === 'create' ? 'Create a new flow' : 'Edit flow' }}\n\n <button class=\"title__closeBtn\" mat-icon-button aria-label=\"Close dialog\" [mat-dialog-close]=\"false\">\n <mat-icon svgIcon=\"gio:cancel\"></mat-icon>\n </button>\n</h2>\n\n@if (flowFormGroup) {\n <mat-dialog-content class=\"content\" [formGroup]=\"flowFormGroup\">\n <p>Flow allow you to apply different policies.</p>\n <div class=\"content__row\">\n <mat-form-field class=\"content__row__fullWidth\">\n <mat-label>Flow name</mat-label>\n <input matInput formControlName=\"name\" cdkFocusInitial />\n <mat-hint>Names will be automatically generated if left blank</mat-hint>\n </mat-form-field>\n </div>\n\n <div class=\"content__row\">\n <mat-form-field class=\"content__row__fullWidth\">\n <mat-label>LLM Methods for your flow</mat-label>\n <gio-form-tags-input\n formControlName=\"llmMethods\"\n [autocompleteOptions]=\"methods\"\n [tagValidationHook]=\"tagValidationHook\"\n ></gio-form-tags-input>\n <mat-hint>If no method is specified, the flow will match all LLM Methods</mat-hint>\n </mat-form-field>\n </div>\n <div class=\"content__row\">\n <mat-form-field class=\"content__row__fullWidth\">\n <mat-label>Condition</mat-label>\n <input matInput formControlName=\"condition\" />\n <mat-hint>Condition to execute the flow, supports Expression Language</mat-hint>\n <gio-el-assistant matSuffix />\n </mat-form-field>\n </div>\n </mat-dialog-content>\n}\n\n<mat-dialog-actions class=\"actions\" align=\"end\">\n <button class=\"actions__cancelBtn\" mat-button [mat-dialog-close]=\"false\">Cancel</button>\n <button class=\"actions__saveBtn\" color=\"primary\" mat-flat-button role=\"dialog\" (click)=\"onSubmit()\">\n {{ mode === 'create' ? 'Create' : 'Save' }}\n </button>\n</mat-dialog-actions>\n", styles: ["@charset \"UTF-8\";.gio-top-bar-menu .gio-badge-accent{background-color:var(--gio-oem-palette--active, #ffc2ac);color:var(--gio-oem-palette--active-contrast, #1e1b1b)}.title__closeBtn{top:0;right:-24px;float:right}.content__paramTitle{font-size:14px;font-weight:700;line-height:20px;font-family:Manrope,sans-serif;letter-spacing:.4px;color:#5c5959}.content--params{margin-bottom:6px}.content__row{display:flex;align-items:flex-start;gap:16px}.content__row__fullWidth{flex:1 1 auto}.button-with-icon{display:flex;align-items:center;justify-content:space-between}\n"] }]
|
|
927
|
+
}], ctorParameters: () => [{ type: i1.MatDialogRef }, { type: undefined, decorators: [{
|
|
928
|
+
type: Inject,
|
|
929
|
+
args: [MAT_DIALOG_DATA]
|
|
930
|
+
}] }] });
|
|
931
|
+
|
|
778
932
|
/*
|
|
779
933
|
* Copyright (C) 2022 The Gravitee team (http://gravitee.io)
|
|
780
934
|
*
|
|
@@ -887,6 +1041,29 @@ class GioPolicyStudioFlowsMenuComponent {
|
|
|
887
1041
|
}
|
|
888
1042
|
pathOrChannelLabel = '';
|
|
889
1043
|
}
|
|
1044
|
+
// LLM Proxy
|
|
1045
|
+
const llmSelector = flow.selectors?.find(s => s.type === 'LLM');
|
|
1046
|
+
if (llmSelector) {
|
|
1047
|
+
if (llmSelector.methods && llmSelector.methods.length > 0) {
|
|
1048
|
+
// Keep only 2 first methods and add +X badge if there are more
|
|
1049
|
+
const methodsToKeep = llmSelector.methods.slice(0, 2);
|
|
1050
|
+
const methodsLength = llmSelector.methods.length;
|
|
1051
|
+
badges.push(...methodsToKeep.map(method => ({ label: method, class: `gio-badge-neutral` })));
|
|
1052
|
+
if (methodsLength > 2) {
|
|
1053
|
+
badges.push({
|
|
1054
|
+
label: `+${methodsLength - 2}`,
|
|
1055
|
+
class: 'gio-badge-neutral',
|
|
1056
|
+
});
|
|
1057
|
+
}
|
|
1058
|
+
}
|
|
1059
|
+
else {
|
|
1060
|
+
badges.push({
|
|
1061
|
+
label: 'All Methods',
|
|
1062
|
+
class: 'gio-badge-neutral',
|
|
1063
|
+
});
|
|
1064
|
+
}
|
|
1065
|
+
pathOrChannelLabel = '';
|
|
1066
|
+
}
|
|
890
1067
|
const conditionSelector = flow.selectors?.find(s => s.type === 'CONDITION');
|
|
891
1068
|
if (conditionSelector && conditionSelector.condition) {
|
|
892
1069
|
hasCondition = true;
|
|
@@ -1018,6 +1195,19 @@ class GioPolicyStudioFlowsMenuComponent {
|
|
|
1018
1195
|
})
|
|
1019
1196
|
.afterClosed();
|
|
1020
1197
|
break;
|
|
1198
|
+
case 'LLM_PROXY':
|
|
1199
|
+
dialogResult = this.matDialog
|
|
1200
|
+
.open(GioPolicyStudioFlowLlmFormDialogComponent, {
|
|
1201
|
+
data: {
|
|
1202
|
+
parentGroupName: flowGroup.name,
|
|
1203
|
+
flow: undefined,
|
|
1204
|
+
},
|
|
1205
|
+
role: 'alertdialog',
|
|
1206
|
+
id: 'gioPsFlowFormDialog',
|
|
1207
|
+
width: GIO_DIALOG_WIDTH.MEDIUM,
|
|
1208
|
+
})
|
|
1209
|
+
.afterClosed();
|
|
1210
|
+
break;
|
|
1021
1211
|
default:
|
|
1022
1212
|
throw new Error(`Unsupported API type ${this.apiType}`);
|
|
1023
1213
|
}
|
|
@@ -1145,6 +1335,19 @@ class GioPolicyStudioFlowsMenuComponent {
|
|
|
1145
1335
|
})
|
|
1146
1336
|
.afterClosed();
|
|
1147
1337
|
break;
|
|
1338
|
+
case 'LLM_PROXY':
|
|
1339
|
+
dialogResult = this.matDialog
|
|
1340
|
+
.open(GioPolicyStudioFlowLlmFormDialogComponent, {
|
|
1341
|
+
data: {
|
|
1342
|
+
parentGroupName: flowToEdit._parentFlowGroupName,
|
|
1343
|
+
flow: flowToEdit,
|
|
1344
|
+
},
|
|
1345
|
+
role: 'alertdialog',
|
|
1346
|
+
id: 'gioPsFlowFormDialog',
|
|
1347
|
+
width: GIO_DIALOG_WIDTH.MEDIUM,
|
|
1348
|
+
})
|
|
1349
|
+
.afterClosed();
|
|
1350
|
+
break;
|
|
1148
1351
|
default:
|
|
1149
1352
|
throw new Error(`Unsupported API type ${this.apiType}`);
|
|
1150
1353
|
}
|
|
@@ -1185,7 +1388,7 @@ class GioPolicyStudioFlowsMenuComponent {
|
|
|
1185
1388
|
this.selectedFlowIdChange.emit(duplicatedFlow._id);
|
|
1186
1389
|
}
|
|
1187
1390
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: GioPolicyStudioFlowsMenuComponent, deps: [{ token: i1.MatDialog }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
1188
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.3", type: GioPolicyStudioFlowsMenuComponent, isStandalone: true, selector: "gio-ps-flows-menu", inputs: { readOnly: "readOnly", loading: "loading", apiType: "apiType", flowExecution: "flowExecution", flowsGroups: "flowsGroups", selectedFlowId: "selectedFlowId", entrypoints: "entrypoints", entrypointsInfo: "entrypointsInfo" }, outputs: { selectedFlowIdChange: "selectedFlowIdChange", flowsGroupsChange: "flowsGroupsChange", flowExecutionChange: "flowExecutionChange", deleteFlow: "deleteFlow" }, usesOnChanges: true, ngImport: i0, template: "<!--\n\n Copyright (C) 2025 The Gravitee team (http://gravitee.io)\n \n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n \n http://www.apache.org/licenses/LICENSE-2.0\n \n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n-->\n\n<div class=\"header\">\n <div class=\"header__label\">\n Flows <mat-icon svgIcon=\"gio:info\" matTooltip=\"Flows allow you to apply different policies on your API event phases\"></mat-icon>\n </div>\n @if (apiType !== 'NATIVE' && apiType !== 'MCP_PROXY') {\n <div class=\"header__configBtn\">\n <button class=\"header__configBtn_edit\" mat-stroked-button [disabled]=\"loading\" (click)=\"onConfigureExecution(flowExecution)\">\n <mat-icon [svgIcon]=\"readOnly ? 'gio:eye-empty' : 'gio:settings'\"></mat-icon>\n </button>\n </div>\n }\n</div>\n@if (!loading) {\n <div class=\"searchBar\">\n <mat-form-field class=\"searchBar__input\">\n <mat-icon matPrefix>search</mat-icon>\n <input matInput placeholder=\"Search by name, path, or group...\" [formControl]=\"searchControl\" />\n @if (searchControl.value) {\n <button matSuffix mat-icon-button aria-label=\"Clear\" (click)=\"resetSearchTerm()\">\n <mat-icon>close</mat-icon>\n </button>\n }\n </mat-form-field>\n </div>\n}\n\n@if (!loading) {\n <div class=\"list\" cdkDropListGroup>\n @for (flowsGroup of filteredFlowGroupMenuItems; track flowsGroup._id) {\n <div\n class=\"list__flowsGroup\"\n cdkDropList\n [cdkDropListData]=\"flowsGroup\"\n [cdkDropListEnterPredicate]=\"enterPredicate\"\n (cdkDropListDropped)=\"onDropFlow($event)\"\n >\n <div class=\"list__flowsGroup__header\">\n <div class=\"list__flowsGroup__header__label\">\n <span>{{ (flowsGroup._isPlan ? 'Plan: ' : '') + flowsGroup.name }}</span>\n </div>\n <div class=\"list__flowsGroup__header__addBtn\">\n @if (apiType === 'NATIVE') {\n <span [matTooltipDisabled]=\"flowsGroup.flows.length < 1\" matTooltip=\"Only one flow is allowed for a native API\">\n <button mat-button [disabled]=\"readOnly || flowsGroup.flows.length > 0\" (click)=\"onAddFlow(flowsGroup)\">\n <mat-icon svgIcon=\"gio:plus\" matTooltip=\"New flow\"></mat-icon>\n </button>\n </span>\n } @else {\n <button mat-button [disabled]=\"readOnly\" (click)=\"onAddFlow(flowsGroup)\">\n <mat-icon svgIcon=\"gio:plus\" matTooltip=\"New flow\"></mat-icon>\n </button>\n }\n </div>\n </div>\n <div class=\"list__flowsGroup__flows\">\n @if (flowsGroup.flows.length > 0) {\n @for (flow of flowsGroup.flows; track flow._id) {\n <div\n class=\"list__flowsGroup__flows__flow\"\n [class.selected]=\"flow.selected\"\n [class.disabled]=\"!flow.enabled\"\n (click)=\"selectFlow(flowsGroup._id, flow._id)\"\n (mouseout)=\"flow.mouseOver = false\"\n (mouseover)=\"flow.mouseOver = true\"\n cdkDrag\n >\n <div class=\"list__flowsGroup__flows__flow__left\">\n @if (flow.name) {\n <div class=\"list__flowsGroup__flows__flow__left__name\" [attr.title]=\"flow.name\">\n {{ flow.name }}\n </div>\n }\n @if (apiType !== 'NATIVE') {\n <div class=\"list__flowsGroup__flows__flow__left__infos\">\n <div class=\"list__flowsGroup__flows__flow__left__infos__badges\">\n @for (badge of flow.badges; track badge.label) {\n <span class=\"list__flowsGroup__flows__flow__left__infos__badges__badge\" [ngClass]=\"badge.class\">{{\n badge.label\n }}</span>\n }\n </div>\n <div class=\"list__flowsGroup__flows__flow__left__infos__pathOrChannelLabel\">\n @if (flow.pathOrChannelLabel !== undefined) {\n <span [attr.title]=\"flow.pathOrChannelLabel\" [innerHTML]=\"flow.pathOrChannelLabel\"></span>\n } @else {\n <em>Empty</em>\n }\n </div>\n @if (flow.hasCondition) {\n <span class=\"list__flowsGroup__flows__flow__left__infos__conditionBadge gio-badge-neutral\" matTooltip=\"Conditioned\"\n ><mat-icon svgIcon=\"gio:if\"></mat-icon\n ></span>\n }\n </div>\n }\n </div>\n <div class=\"list__flowsGroup__flows__flow__right\">\n <button\n class=\"list__flowsGroup__flows__flow__right__name__menu\"\n mat-button\n [disabled]=\"readOnly\"\n [matMenuTriggerFor]=\"flowMenu\"\n (click)=\"$event.stopPropagation()\"\n >\n <mat-icon svgIcon=\"gio:more-vertical\"></mat-icon>\n </button>\n <mat-menu #flowMenu=\"matMenu\">\n <button [disabled]=\"readOnly\" mat-menu-item (click)=\"onDisableFlow(flow._id)\">\n <mat-icon [svgIcon]=\"flow.enabled ? 'gio:prohibition' : 'gio:check-circled-outline'\"></mat-icon>\n <span>{{ flow.enabled ? 'Disable' : 'Enable' }}</span>\n </button>\n <button mat-menu-item (click)=\"onEditFlow(flow._id)\"><mat-icon svgIcon=\"gio:edit-pencil\"></mat-icon> Edit</button>\n <button mat-menu-item (click)=\"onDeleteFlow(flow._id)\"><mat-icon svgIcon=\"gio:trash\"></mat-icon> Delete</button>\n @if (apiType !== 'NATIVE') {\n <button mat-menu-item (click)=\"onDuplicateFlow(flowsGroup._id, flow._id)\">\n <mat-icon svgIcon=\"gio:copy\"></mat-icon> Duplicate\n </button>\n }\n </mat-menu>\n </div>\n </div>\n }\n } @else {\n <div class=\"list__flowsGroup__no-flows\">No flows yet</div>\n }\n </div>\n </div>\n }\n </div>\n} @else {\n <div class=\"loadingList\">\n <gio-loader></gio-loader>\n </div>\n}\n", styles: ["@charset \"UTF-8\";.gio-top-bar-menu .gio-badge-accent{background-color:var(--gio-oem-palette--active, #ffc2ac);color:var(--gio-oem-palette--active-contrast, #1e1b1b)}:host{display:flex;height:100%;max-height:100%;flex-direction:column;padding-top:16px}.header{display:flex;align-items:center;padding:0 16px;margin-bottom:14px}.header__label{font-family:Kanit,Helvetica Neue,sans-serif;font-size:16px;font-weight:500;letter-spacing:.4px;line-height:24px;display:flex;flex:1 1 auto;align-items:center;margin-bottom:0;gap:8px}.header__configBtn{margin-left:8px}.searchBar{display:flex;padding:0 16px}.searchBar__input{flex:1 1 auto}.list{padding:0 16px;overflow-y:overlay}.list__flowsGroup{display:flex;flex-direction:column;padding-bottom:8px;gap:8px}.list__flowsGroup__header{display:flex;align-items:center;padding:8px 0 0;border-radius:8px}.list__flowsGroup__header__label{font-size:14px;font-weight:700;line-height:20px;font-family:Manrope,sans-serif;letter-spacing:.4px;display:flex;overflow:hidden;flex:1 1 auto;align-items:center;gap:8px}.list__flowsGroup__header__label>mat-icon{width:22px;height:22px;flex:0 0 auto}.list__flowsGroup__header__label>span{display:-webkit-box;overflow:hidden;flex:1 1 auto;-webkit-box-orient:vertical;-webkit-line-clamp:2}.list__flowsGroup__header__addBtn{margin-left:8px}.list__flowsGroup__flows{display:flex;flex-direction:column;gap:8px}.list__flowsGroup__flows__flow{display:flex;overflow:hidden;height:68px;flex-direction:row;align-items:center;justify-content:space-between;padding:7px;border:1px solid #b2aaa9;border-radius:8px;background-color:#fff}.list__flowsGroup__flows__flow.disabled{border:1px solid rgba(178,170,169,0);background-color:#f7f7f8cc;text-decoration:line-through}.list__flowsGroup__flows__flow:hover,.list__flowsGroup__flows__flow.selected{padding:6px;border:2px solid #ffa685;cursor:pointer}.list__flowsGroup__flows__flow__left{display:flex;overflow:hidden;flex:1 1 auto;flex-direction:column;gap:8px}.list__flowsGroup__flows__flow__left__name{overflow:hidden;padding-left:4px;text-overflow:ellipsis;white-space:nowrap}.list__flowsGroup__flows__flow__left__infos{display:flex;align-items:center}.list__flowsGroup__flows__flow__left__infos__badges{flex:0 0 auto}.list__flowsGroup__flows__flow__left__infos__badges__badge{width:auto}.list__flowsGroup__flows__flow__left__infos__pathOrChannelLabel{overflow:hidden;flex:1 1 auto;direction:rtl;text-align:left;text-overflow:ellipsis;white-space:nowrap}.list__flowsGroup__flows__flow__left__infos__pathOrChannelLabel span{direction:ltr;unicode-bidi:bidi-override}.list__flowsGroup__flows__flow__left__infos__conditionBadge{flex:0 0 auto}.list__flowsGroup__no-flows{font-style:italic}.list__flowsGroup.cdk-drop-list-dragging{pointer-events:none}.list__flowsGroup .cdk-drag-preview{box-sizing:border-box;border-radius:4px;box-shadow:0 5px 5px -3px #0003,0 8px 10px 1px #00000024,0 3px 14px 2px #0000001f}.list__flowsGroup .cdk-drag-placeholder *{opacity:0}.list__flowsGroup .cdk-drag-animating{transition:transform .25s cubic-bezier(0,0,.2,1)}.list__flowsGroup.cdk-drop-list-dragging .list__flowsGroup__flows__flow:not(.cdk-drag-placeholder){transition:transform .25s cubic-bezier(0,0,.2,1)}.loadingList{display:flex;height:100%;flex-direction:column;align-items:center;justify-content:center}\n"], dependencies: [{ kind: "ngmodule", type: GioIconsModule }, { kind: "component", type: i2$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i2$2.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i3.MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: i3.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i5$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: GioLoaderModule }, { kind: "component", type: i7.GioLoaderComponent, selector: "gio-loader" }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i7$1.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i7$1.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i7$1.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "ngmodule", type: DragDropModule }, { kind: "directive", type: i8.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer", "cdkDropListHasAnchor"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i8.CdkDropListGroup, selector: "[cdkDropListGroup]", inputs: ["cdkDropListGroupDisabled"], exportAs: ["cdkDropListGroup"] }, { kind: "directive", type: i8.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i6$1.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "component", type: i4.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i4.MatPrefix, selector: "[matPrefix], [matIconPrefix], [matTextPrefix]", inputs: ["matTextPrefix"] }, { kind: "directive", type: i4.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: MatFormFieldModule }] }); }
|
|
1391
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.3", type: GioPolicyStudioFlowsMenuComponent, isStandalone: true, selector: "gio-ps-flows-menu", inputs: { readOnly: "readOnly", loading: "loading", apiType: "apiType", flowExecution: "flowExecution", flowsGroups: "flowsGroups", selectedFlowId: "selectedFlowId", entrypoints: "entrypoints", entrypointsInfo: "entrypointsInfo" }, outputs: { selectedFlowIdChange: "selectedFlowIdChange", flowsGroupsChange: "flowsGroupsChange", flowExecutionChange: "flowExecutionChange", deleteFlow: "deleteFlow" }, usesOnChanges: true, ngImport: i0, template: "<!--\n\n Copyright (C) 2025 The Gravitee team (http://gravitee.io)\n \n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n \n http://www.apache.org/licenses/LICENSE-2.0\n \n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n-->\n\n<div class=\"header\">\n <div class=\"header__label\">\n Flows <mat-icon svgIcon=\"gio:info\" matTooltip=\"Flows allow you to apply different policies on your API event phases\"></mat-icon>\n </div>\n @if (apiType !== 'NATIVE') {\n <div class=\"header__configBtn\">\n <button class=\"header__configBtn_edit\" mat-stroked-button [disabled]=\"loading\" (click)=\"onConfigureExecution(flowExecution)\">\n <mat-icon [svgIcon]=\"readOnly ? 'gio:eye-empty' : 'gio:settings'\"></mat-icon>\n </button>\n </div>\n }\n</div>\n@if (!loading) {\n <div class=\"searchBar\">\n <mat-form-field class=\"searchBar__input\">\n <mat-icon matPrefix>search</mat-icon>\n <input matInput placeholder=\"Search by name, path, or group...\" [formControl]=\"searchControl\" />\n @if (searchControl.value) {\n <button matSuffix mat-icon-button aria-label=\"Clear\" (click)=\"resetSearchTerm()\">\n <mat-icon>close</mat-icon>\n </button>\n }\n </mat-form-field>\n </div>\n}\n\n@if (!loading) {\n <div class=\"list\" cdkDropListGroup>\n @for (flowsGroup of filteredFlowGroupMenuItems; track flowsGroup._id) {\n <div\n class=\"list__flowsGroup\"\n cdkDropList\n [cdkDropListData]=\"flowsGroup\"\n [cdkDropListEnterPredicate]=\"enterPredicate\"\n (cdkDropListDropped)=\"onDropFlow($event)\"\n >\n <div class=\"list__flowsGroup__header\">\n <div class=\"list__flowsGroup__header__label\">\n <span>{{ (flowsGroup._isPlan ? 'Plan: ' : '') + flowsGroup.name }}</span>\n </div>\n <div class=\"list__flowsGroup__header__addBtn\">\n @if (apiType === 'NATIVE') {\n <span [matTooltipDisabled]=\"flowsGroup.flows.length < 1\" matTooltip=\"Only one flow is allowed for a native API\">\n <button mat-button [disabled]=\"readOnly || flowsGroup.flows.length > 0\" (click)=\"onAddFlow(flowsGroup)\">\n <mat-icon svgIcon=\"gio:plus\" matTooltip=\"New flow\"></mat-icon>\n </button>\n </span>\n } @else {\n <button mat-button [disabled]=\"readOnly\" (click)=\"onAddFlow(flowsGroup)\">\n <mat-icon svgIcon=\"gio:plus\" matTooltip=\"New flow\"></mat-icon>\n </button>\n }\n </div>\n </div>\n <div class=\"list__flowsGroup__flows\">\n @if (flowsGroup.flows.length > 0) {\n @for (flow of flowsGroup.flows; track flow._id) {\n <div\n class=\"list__flowsGroup__flows__flow\"\n [class.selected]=\"flow.selected\"\n [class.disabled]=\"!flow.enabled\"\n (click)=\"selectFlow(flowsGroup._id, flow._id)\"\n (mouseout)=\"flow.mouseOver = false\"\n (mouseover)=\"flow.mouseOver = true\"\n cdkDrag\n >\n <div class=\"list__flowsGroup__flows__flow__left\">\n @if (flow.name) {\n <div class=\"list__flowsGroup__flows__flow__left__name\" [attr.title]=\"flow.name\">\n {{ flow.name }}\n </div>\n }\n @if (apiType !== 'NATIVE') {\n <div class=\"list__flowsGroup__flows__flow__left__infos\">\n <div class=\"list__flowsGroup__flows__flow__left__infos__badges\">\n @for (badge of flow.badges; track badge.label) {\n <span class=\"list__flowsGroup__flows__flow__left__infos__badges__badge\" [ngClass]=\"badge.class\">{{\n badge.label\n }}</span>\n }\n </div>\n <div class=\"list__flowsGroup__flows__flow__left__infos__pathOrChannelLabel\">\n @if (flow.pathOrChannelLabel !== undefined) {\n <span [attr.title]=\"flow.pathOrChannelLabel\" [innerHTML]=\"flow.pathOrChannelLabel\"></span>\n } @else {\n <em>Empty</em>\n }\n </div>\n @if (flow.hasCondition) {\n <span class=\"list__flowsGroup__flows__flow__left__infos__conditionBadge gio-badge-neutral\" matTooltip=\"Conditioned\"\n ><mat-icon svgIcon=\"gio:if\"></mat-icon\n ></span>\n }\n </div>\n }\n </div>\n <div class=\"list__flowsGroup__flows__flow__right\">\n <button\n class=\"list__flowsGroup__flows__flow__right__name__menu\"\n mat-button\n [disabled]=\"readOnly\"\n [matMenuTriggerFor]=\"flowMenu\"\n (click)=\"$event.stopPropagation()\"\n >\n <mat-icon svgIcon=\"gio:more-vertical\"></mat-icon>\n </button>\n <mat-menu #flowMenu=\"matMenu\">\n <button [disabled]=\"readOnly\" mat-menu-item (click)=\"onDisableFlow(flow._id)\">\n <mat-icon [svgIcon]=\"flow.enabled ? 'gio:prohibition' : 'gio:check-circled-outline'\"></mat-icon>\n <span>{{ flow.enabled ? 'Disable' : 'Enable' }}</span>\n </button>\n <button mat-menu-item (click)=\"onEditFlow(flow._id)\"><mat-icon svgIcon=\"gio:edit-pencil\"></mat-icon> Edit</button>\n <button mat-menu-item (click)=\"onDeleteFlow(flow._id)\"><mat-icon svgIcon=\"gio:trash\"></mat-icon> Delete</button>\n @if (apiType !== 'NATIVE') {\n <button mat-menu-item (click)=\"onDuplicateFlow(flowsGroup._id, flow._id)\">\n <mat-icon svgIcon=\"gio:copy\"></mat-icon> Duplicate\n </button>\n }\n </mat-menu>\n </div>\n </div>\n }\n } @else {\n <div class=\"list__flowsGroup__no-flows\">No flows yet</div>\n }\n </div>\n </div>\n }\n </div>\n} @else {\n <div class=\"loadingList\">\n <gio-loader></gio-loader>\n </div>\n}\n", styles: ["@charset \"UTF-8\";.gio-top-bar-menu .gio-badge-accent{background-color:var(--gio-oem-palette--active, #ffc2ac);color:var(--gio-oem-palette--active-contrast, #1e1b1b)}:host{display:flex;height:100%;max-height:100%;flex-direction:column;padding-top:16px}.header{display:flex;align-items:center;padding:0 16px;margin-bottom:14px}.header__label{font-family:Kanit,Helvetica Neue,sans-serif;font-size:16px;font-weight:500;letter-spacing:.4px;line-height:24px;display:flex;flex:1 1 auto;align-items:center;margin-bottom:0;gap:8px}.header__configBtn{margin-left:8px}.searchBar{display:flex;padding:0 16px}.searchBar__input{flex:1 1 auto}.list{padding:0 16px;overflow-y:overlay}.list__flowsGroup{display:flex;flex-direction:column;padding-bottom:8px;gap:8px}.list__flowsGroup__header{display:flex;align-items:center;padding:8px 0 0;border-radius:8px}.list__flowsGroup__header__label{font-size:14px;font-weight:700;line-height:20px;font-family:Manrope,sans-serif;letter-spacing:.4px;display:flex;overflow:hidden;flex:1 1 auto;align-items:center;gap:8px}.list__flowsGroup__header__label>mat-icon{width:22px;height:22px;flex:0 0 auto}.list__flowsGroup__header__label>span{display:-webkit-box;overflow:hidden;flex:1 1 auto;-webkit-box-orient:vertical;-webkit-line-clamp:2}.list__flowsGroup__header__addBtn{margin-left:8px}.list__flowsGroup__flows{display:flex;flex-direction:column;gap:8px}.list__flowsGroup__flows__flow{display:flex;overflow:hidden;height:68px;flex-direction:row;align-items:center;justify-content:space-between;padding:7px;border:1px solid #b2aaa9;border-radius:8px;background-color:#fff}.list__flowsGroup__flows__flow.disabled{border:1px solid rgba(178,170,169,0);background-color:#f7f7f8cc;text-decoration:line-through}.list__flowsGroup__flows__flow:hover,.list__flowsGroup__flows__flow.selected{padding:6px;border:2px solid #ffa685;cursor:pointer}.list__flowsGroup__flows__flow__left{display:flex;overflow:hidden;flex:1 1 auto;flex-direction:column;gap:8px}.list__flowsGroup__flows__flow__left__name{overflow:hidden;padding-left:4px;text-overflow:ellipsis;white-space:nowrap}.list__flowsGroup__flows__flow__left__infos{display:flex;align-items:center}.list__flowsGroup__flows__flow__left__infos__badges{flex:0 0 auto}.list__flowsGroup__flows__flow__left__infos__badges__badge{width:auto}.list__flowsGroup__flows__flow__left__infos__pathOrChannelLabel{overflow:hidden;flex:1 1 auto;direction:rtl;text-align:left;text-overflow:ellipsis;white-space:nowrap}.list__flowsGroup__flows__flow__left__infos__pathOrChannelLabel span{direction:ltr;unicode-bidi:bidi-override}.list__flowsGroup__flows__flow__left__infos__conditionBadge{flex:0 0 auto}.list__flowsGroup__no-flows{font-style:italic}.list__flowsGroup.cdk-drop-list-dragging{pointer-events:none}.list__flowsGroup .cdk-drag-preview{box-sizing:border-box;border-radius:4px;box-shadow:0 5px 5px -3px #0003,0 8px 10px 1px #00000024,0 3px 14px 2px #0000001f}.list__flowsGroup .cdk-drag-placeholder *{opacity:0}.list__flowsGroup .cdk-drag-animating{transition:transform .25s cubic-bezier(0,0,.2,1)}.list__flowsGroup.cdk-drop-list-dragging .list__flowsGroup__flows__flow:not(.cdk-drag-placeholder){transition:transform .25s cubic-bezier(0,0,.2,1)}.loadingList{display:flex;height:100%;flex-direction:column;align-items:center;justify-content:center}\n"], dependencies: [{ kind: "ngmodule", type: GioIconsModule }, { kind: "component", type: i6$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i2$1.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i3.MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: i3.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i5$2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: GioLoaderModule }, { kind: "component", type: i7.GioLoaderComponent, selector: "gio-loader" }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i7$1.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i7$1.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i7$1.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "ngmodule", type: DragDropModule }, { kind: "directive", type: i8.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer", "cdkDropListHasAnchor"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i8.CdkDropListGroup, selector: "[cdkDropListGroup]", inputs: ["cdkDropListGroupDisabled"], exportAs: ["cdkDropListGroup"] }, { kind: "directive", type: i8.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i5$1.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "component", type: i4.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i4.MatPrefix, selector: "[matPrefix], [matIconPrefix], [matTextPrefix]", inputs: ["matTextPrefix"] }, { kind: "directive", type: i4.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: MatFormFieldModule }] }); }
|
|
1189
1392
|
}
|
|
1190
1393
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: GioPolicyStudioFlowsMenuComponent, decorators: [{
|
|
1191
1394
|
type: Component,
|
|
@@ -1200,7 +1403,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImpor
|
|
|
1200
1403
|
MatInputModule,
|
|
1201
1404
|
ReactiveFormsModule,
|
|
1202
1405
|
MatFormFieldModule,
|
|
1203
|
-
], selector: 'gio-ps-flows-menu', template: "<!--\n\n Copyright (C) 2025 The Gravitee team (http://gravitee.io)\n \n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n \n http://www.apache.org/licenses/LICENSE-2.0\n \n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n-->\n\n<div class=\"header\">\n <div class=\"header__label\">\n Flows <mat-icon svgIcon=\"gio:info\" matTooltip=\"Flows allow you to apply different policies on your API event phases\"></mat-icon>\n </div>\n @if (apiType !== 'NATIVE' && apiType !== 'MCP_PROXY') {\n <div class=\"header__configBtn\">\n <button class=\"header__configBtn_edit\" mat-stroked-button [disabled]=\"loading\" (click)=\"onConfigureExecution(flowExecution)\">\n <mat-icon [svgIcon]=\"readOnly ? 'gio:eye-empty' : 'gio:settings'\"></mat-icon>\n </button>\n </div>\n }\n</div>\n@if (!loading) {\n <div class=\"searchBar\">\n <mat-form-field class=\"searchBar__input\">\n <mat-icon matPrefix>search</mat-icon>\n <input matInput placeholder=\"Search by name, path, or group...\" [formControl]=\"searchControl\" />\n @if (searchControl.value) {\n <button matSuffix mat-icon-button aria-label=\"Clear\" (click)=\"resetSearchTerm()\">\n <mat-icon>close</mat-icon>\n </button>\n }\n </mat-form-field>\n </div>\n}\n\n@if (!loading) {\n <div class=\"list\" cdkDropListGroup>\n @for (flowsGroup of filteredFlowGroupMenuItems; track flowsGroup._id) {\n <div\n class=\"list__flowsGroup\"\n cdkDropList\n [cdkDropListData]=\"flowsGroup\"\n [cdkDropListEnterPredicate]=\"enterPredicate\"\n (cdkDropListDropped)=\"onDropFlow($event)\"\n >\n <div class=\"list__flowsGroup__header\">\n <div class=\"list__flowsGroup__header__label\">\n <span>{{ (flowsGroup._isPlan ? 'Plan: ' : '') + flowsGroup.name }}</span>\n </div>\n <div class=\"list__flowsGroup__header__addBtn\">\n @if (apiType === 'NATIVE') {\n <span [matTooltipDisabled]=\"flowsGroup.flows.length < 1\" matTooltip=\"Only one flow is allowed for a native API\">\n <button mat-button [disabled]=\"readOnly || flowsGroup.flows.length > 0\" (click)=\"onAddFlow(flowsGroup)\">\n <mat-icon svgIcon=\"gio:plus\" matTooltip=\"New flow\"></mat-icon>\n </button>\n </span>\n } @else {\n <button mat-button [disabled]=\"readOnly\" (click)=\"onAddFlow(flowsGroup)\">\n <mat-icon svgIcon=\"gio:plus\" matTooltip=\"New flow\"></mat-icon>\n </button>\n }\n </div>\n </div>\n <div class=\"list__flowsGroup__flows\">\n @if (flowsGroup.flows.length > 0) {\n @for (flow of flowsGroup.flows; track flow._id) {\n <div\n class=\"list__flowsGroup__flows__flow\"\n [class.selected]=\"flow.selected\"\n [class.disabled]=\"!flow.enabled\"\n (click)=\"selectFlow(flowsGroup._id, flow._id)\"\n (mouseout)=\"flow.mouseOver = false\"\n (mouseover)=\"flow.mouseOver = true\"\n cdkDrag\n >\n <div class=\"list__flowsGroup__flows__flow__left\">\n @if (flow.name) {\n <div class=\"list__flowsGroup__flows__flow__left__name\" [attr.title]=\"flow.name\">\n {{ flow.name }}\n </div>\n }\n @if (apiType !== 'NATIVE') {\n <div class=\"list__flowsGroup__flows__flow__left__infos\">\n <div class=\"list__flowsGroup__flows__flow__left__infos__badges\">\n @for (badge of flow.badges; track badge.label) {\n <span class=\"list__flowsGroup__flows__flow__left__infos__badges__badge\" [ngClass]=\"badge.class\">{{\n badge.label\n }}</span>\n }\n </div>\n <div class=\"list__flowsGroup__flows__flow__left__infos__pathOrChannelLabel\">\n @if (flow.pathOrChannelLabel !== undefined) {\n <span [attr.title]=\"flow.pathOrChannelLabel\" [innerHTML]=\"flow.pathOrChannelLabel\"></span>\n } @else {\n <em>Empty</em>\n }\n </div>\n @if (flow.hasCondition) {\n <span class=\"list__flowsGroup__flows__flow__left__infos__conditionBadge gio-badge-neutral\" matTooltip=\"Conditioned\"\n ><mat-icon svgIcon=\"gio:if\"></mat-icon\n ></span>\n }\n </div>\n }\n </div>\n <div class=\"list__flowsGroup__flows__flow__right\">\n <button\n class=\"list__flowsGroup__flows__flow__right__name__menu\"\n mat-button\n [disabled]=\"readOnly\"\n [matMenuTriggerFor]=\"flowMenu\"\n (click)=\"$event.stopPropagation()\"\n >\n <mat-icon svgIcon=\"gio:more-vertical\"></mat-icon>\n </button>\n <mat-menu #flowMenu=\"matMenu\">\n <button [disabled]=\"readOnly\" mat-menu-item (click)=\"onDisableFlow(flow._id)\">\n <mat-icon [svgIcon]=\"flow.enabled ? 'gio:prohibition' : 'gio:check-circled-outline'\"></mat-icon>\n <span>{{ flow.enabled ? 'Disable' : 'Enable' }}</span>\n </button>\n <button mat-menu-item (click)=\"onEditFlow(flow._id)\"><mat-icon svgIcon=\"gio:edit-pencil\"></mat-icon> Edit</button>\n <button mat-menu-item (click)=\"onDeleteFlow(flow._id)\"><mat-icon svgIcon=\"gio:trash\"></mat-icon> Delete</button>\n @if (apiType !== 'NATIVE') {\n <button mat-menu-item (click)=\"onDuplicateFlow(flowsGroup._id, flow._id)\">\n <mat-icon svgIcon=\"gio:copy\"></mat-icon> Duplicate\n </button>\n }\n </mat-menu>\n </div>\n </div>\n }\n } @else {\n <div class=\"list__flowsGroup__no-flows\">No flows yet</div>\n }\n </div>\n </div>\n }\n </div>\n} @else {\n <div class=\"loadingList\">\n <gio-loader></gio-loader>\n </div>\n}\n", styles: ["@charset \"UTF-8\";.gio-top-bar-menu .gio-badge-accent{background-color:var(--gio-oem-palette--active, #ffc2ac);color:var(--gio-oem-palette--active-contrast, #1e1b1b)}:host{display:flex;height:100%;max-height:100%;flex-direction:column;padding-top:16px}.header{display:flex;align-items:center;padding:0 16px;margin-bottom:14px}.header__label{font-family:Kanit,Helvetica Neue,sans-serif;font-size:16px;font-weight:500;letter-spacing:.4px;line-height:24px;display:flex;flex:1 1 auto;align-items:center;margin-bottom:0;gap:8px}.header__configBtn{margin-left:8px}.searchBar{display:flex;padding:0 16px}.searchBar__input{flex:1 1 auto}.list{padding:0 16px;overflow-y:overlay}.list__flowsGroup{display:flex;flex-direction:column;padding-bottom:8px;gap:8px}.list__flowsGroup__header{display:flex;align-items:center;padding:8px 0 0;border-radius:8px}.list__flowsGroup__header__label{font-size:14px;font-weight:700;line-height:20px;font-family:Manrope,sans-serif;letter-spacing:.4px;display:flex;overflow:hidden;flex:1 1 auto;align-items:center;gap:8px}.list__flowsGroup__header__label>mat-icon{width:22px;height:22px;flex:0 0 auto}.list__flowsGroup__header__label>span{display:-webkit-box;overflow:hidden;flex:1 1 auto;-webkit-box-orient:vertical;-webkit-line-clamp:2}.list__flowsGroup__header__addBtn{margin-left:8px}.list__flowsGroup__flows{display:flex;flex-direction:column;gap:8px}.list__flowsGroup__flows__flow{display:flex;overflow:hidden;height:68px;flex-direction:row;align-items:center;justify-content:space-between;padding:7px;border:1px solid #b2aaa9;border-radius:8px;background-color:#fff}.list__flowsGroup__flows__flow.disabled{border:1px solid rgba(178,170,169,0);background-color:#f7f7f8cc;text-decoration:line-through}.list__flowsGroup__flows__flow:hover,.list__flowsGroup__flows__flow.selected{padding:6px;border:2px solid #ffa685;cursor:pointer}.list__flowsGroup__flows__flow__left{display:flex;overflow:hidden;flex:1 1 auto;flex-direction:column;gap:8px}.list__flowsGroup__flows__flow__left__name{overflow:hidden;padding-left:4px;text-overflow:ellipsis;white-space:nowrap}.list__flowsGroup__flows__flow__left__infos{display:flex;align-items:center}.list__flowsGroup__flows__flow__left__infos__badges{flex:0 0 auto}.list__flowsGroup__flows__flow__left__infos__badges__badge{width:auto}.list__flowsGroup__flows__flow__left__infos__pathOrChannelLabel{overflow:hidden;flex:1 1 auto;direction:rtl;text-align:left;text-overflow:ellipsis;white-space:nowrap}.list__flowsGroup__flows__flow__left__infos__pathOrChannelLabel span{direction:ltr;unicode-bidi:bidi-override}.list__flowsGroup__flows__flow__left__infos__conditionBadge{flex:0 0 auto}.list__flowsGroup__no-flows{font-style:italic}.list__flowsGroup.cdk-drop-list-dragging{pointer-events:none}.list__flowsGroup .cdk-drag-preview{box-sizing:border-box;border-radius:4px;box-shadow:0 5px 5px -3px #0003,0 8px 10px 1px #00000024,0 3px 14px 2px #0000001f}.list__flowsGroup .cdk-drag-placeholder *{opacity:0}.list__flowsGroup .cdk-drag-animating{transition:transform .25s cubic-bezier(0,0,.2,1)}.list__flowsGroup.cdk-drop-list-dragging .list__flowsGroup__flows__flow:not(.cdk-drag-placeholder){transition:transform .25s cubic-bezier(0,0,.2,1)}.loadingList{display:flex;height:100%;flex-direction:column;align-items:center;justify-content:center}\n"] }]
|
|
1406
|
+
], selector: 'gio-ps-flows-menu', template: "<!--\n\n Copyright (C) 2025 The Gravitee team (http://gravitee.io)\n \n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n \n http://www.apache.org/licenses/LICENSE-2.0\n \n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n-->\n\n<div class=\"header\">\n <div class=\"header__label\">\n Flows <mat-icon svgIcon=\"gio:info\" matTooltip=\"Flows allow you to apply different policies on your API event phases\"></mat-icon>\n </div>\n @if (apiType !== 'NATIVE') {\n <div class=\"header__configBtn\">\n <button class=\"header__configBtn_edit\" mat-stroked-button [disabled]=\"loading\" (click)=\"onConfigureExecution(flowExecution)\">\n <mat-icon [svgIcon]=\"readOnly ? 'gio:eye-empty' : 'gio:settings'\"></mat-icon>\n </button>\n </div>\n }\n</div>\n@if (!loading) {\n <div class=\"searchBar\">\n <mat-form-field class=\"searchBar__input\">\n <mat-icon matPrefix>search</mat-icon>\n <input matInput placeholder=\"Search by name, path, or group...\" [formControl]=\"searchControl\" />\n @if (searchControl.value) {\n <button matSuffix mat-icon-button aria-label=\"Clear\" (click)=\"resetSearchTerm()\">\n <mat-icon>close</mat-icon>\n </button>\n }\n </mat-form-field>\n </div>\n}\n\n@if (!loading) {\n <div class=\"list\" cdkDropListGroup>\n @for (flowsGroup of filteredFlowGroupMenuItems; track flowsGroup._id) {\n <div\n class=\"list__flowsGroup\"\n cdkDropList\n [cdkDropListData]=\"flowsGroup\"\n [cdkDropListEnterPredicate]=\"enterPredicate\"\n (cdkDropListDropped)=\"onDropFlow($event)\"\n >\n <div class=\"list__flowsGroup__header\">\n <div class=\"list__flowsGroup__header__label\">\n <span>{{ (flowsGroup._isPlan ? 'Plan: ' : '') + flowsGroup.name }}</span>\n </div>\n <div class=\"list__flowsGroup__header__addBtn\">\n @if (apiType === 'NATIVE') {\n <span [matTooltipDisabled]=\"flowsGroup.flows.length < 1\" matTooltip=\"Only one flow is allowed for a native API\">\n <button mat-button [disabled]=\"readOnly || flowsGroup.flows.length > 0\" (click)=\"onAddFlow(flowsGroup)\">\n <mat-icon svgIcon=\"gio:plus\" matTooltip=\"New flow\"></mat-icon>\n </button>\n </span>\n } @else {\n <button mat-button [disabled]=\"readOnly\" (click)=\"onAddFlow(flowsGroup)\">\n <mat-icon svgIcon=\"gio:plus\" matTooltip=\"New flow\"></mat-icon>\n </button>\n }\n </div>\n </div>\n <div class=\"list__flowsGroup__flows\">\n @if (flowsGroup.flows.length > 0) {\n @for (flow of flowsGroup.flows; track flow._id) {\n <div\n class=\"list__flowsGroup__flows__flow\"\n [class.selected]=\"flow.selected\"\n [class.disabled]=\"!flow.enabled\"\n (click)=\"selectFlow(flowsGroup._id, flow._id)\"\n (mouseout)=\"flow.mouseOver = false\"\n (mouseover)=\"flow.mouseOver = true\"\n cdkDrag\n >\n <div class=\"list__flowsGroup__flows__flow__left\">\n @if (flow.name) {\n <div class=\"list__flowsGroup__flows__flow__left__name\" [attr.title]=\"flow.name\">\n {{ flow.name }}\n </div>\n }\n @if (apiType !== 'NATIVE') {\n <div class=\"list__flowsGroup__flows__flow__left__infos\">\n <div class=\"list__flowsGroup__flows__flow__left__infos__badges\">\n @for (badge of flow.badges; track badge.label) {\n <span class=\"list__flowsGroup__flows__flow__left__infos__badges__badge\" [ngClass]=\"badge.class\">{{\n badge.label\n }}</span>\n }\n </div>\n <div class=\"list__flowsGroup__flows__flow__left__infos__pathOrChannelLabel\">\n @if (flow.pathOrChannelLabel !== undefined) {\n <span [attr.title]=\"flow.pathOrChannelLabel\" [innerHTML]=\"flow.pathOrChannelLabel\"></span>\n } @else {\n <em>Empty</em>\n }\n </div>\n @if (flow.hasCondition) {\n <span class=\"list__flowsGroup__flows__flow__left__infos__conditionBadge gio-badge-neutral\" matTooltip=\"Conditioned\"\n ><mat-icon svgIcon=\"gio:if\"></mat-icon\n ></span>\n }\n </div>\n }\n </div>\n <div class=\"list__flowsGroup__flows__flow__right\">\n <button\n class=\"list__flowsGroup__flows__flow__right__name__menu\"\n mat-button\n [disabled]=\"readOnly\"\n [matMenuTriggerFor]=\"flowMenu\"\n (click)=\"$event.stopPropagation()\"\n >\n <mat-icon svgIcon=\"gio:more-vertical\"></mat-icon>\n </button>\n <mat-menu #flowMenu=\"matMenu\">\n <button [disabled]=\"readOnly\" mat-menu-item (click)=\"onDisableFlow(flow._id)\">\n <mat-icon [svgIcon]=\"flow.enabled ? 'gio:prohibition' : 'gio:check-circled-outline'\"></mat-icon>\n <span>{{ flow.enabled ? 'Disable' : 'Enable' }}</span>\n </button>\n <button mat-menu-item (click)=\"onEditFlow(flow._id)\"><mat-icon svgIcon=\"gio:edit-pencil\"></mat-icon> Edit</button>\n <button mat-menu-item (click)=\"onDeleteFlow(flow._id)\"><mat-icon svgIcon=\"gio:trash\"></mat-icon> Delete</button>\n @if (apiType !== 'NATIVE') {\n <button mat-menu-item (click)=\"onDuplicateFlow(flowsGroup._id, flow._id)\">\n <mat-icon svgIcon=\"gio:copy\"></mat-icon> Duplicate\n </button>\n }\n </mat-menu>\n </div>\n </div>\n }\n } @else {\n <div class=\"list__flowsGroup__no-flows\">No flows yet</div>\n }\n </div>\n </div>\n }\n </div>\n} @else {\n <div class=\"loadingList\">\n <gio-loader></gio-loader>\n </div>\n}\n", styles: ["@charset \"UTF-8\";.gio-top-bar-menu .gio-badge-accent{background-color:var(--gio-oem-palette--active, #ffc2ac);color:var(--gio-oem-palette--active-contrast, #1e1b1b)}:host{display:flex;height:100%;max-height:100%;flex-direction:column;padding-top:16px}.header{display:flex;align-items:center;padding:0 16px;margin-bottom:14px}.header__label{font-family:Kanit,Helvetica Neue,sans-serif;font-size:16px;font-weight:500;letter-spacing:.4px;line-height:24px;display:flex;flex:1 1 auto;align-items:center;margin-bottom:0;gap:8px}.header__configBtn{margin-left:8px}.searchBar{display:flex;padding:0 16px}.searchBar__input{flex:1 1 auto}.list{padding:0 16px;overflow-y:overlay}.list__flowsGroup{display:flex;flex-direction:column;padding-bottom:8px;gap:8px}.list__flowsGroup__header{display:flex;align-items:center;padding:8px 0 0;border-radius:8px}.list__flowsGroup__header__label{font-size:14px;font-weight:700;line-height:20px;font-family:Manrope,sans-serif;letter-spacing:.4px;display:flex;overflow:hidden;flex:1 1 auto;align-items:center;gap:8px}.list__flowsGroup__header__label>mat-icon{width:22px;height:22px;flex:0 0 auto}.list__flowsGroup__header__label>span{display:-webkit-box;overflow:hidden;flex:1 1 auto;-webkit-box-orient:vertical;-webkit-line-clamp:2}.list__flowsGroup__header__addBtn{margin-left:8px}.list__flowsGroup__flows{display:flex;flex-direction:column;gap:8px}.list__flowsGroup__flows__flow{display:flex;overflow:hidden;height:68px;flex-direction:row;align-items:center;justify-content:space-between;padding:7px;border:1px solid #b2aaa9;border-radius:8px;background-color:#fff}.list__flowsGroup__flows__flow.disabled{border:1px solid rgba(178,170,169,0);background-color:#f7f7f8cc;text-decoration:line-through}.list__flowsGroup__flows__flow:hover,.list__flowsGroup__flows__flow.selected{padding:6px;border:2px solid #ffa685;cursor:pointer}.list__flowsGroup__flows__flow__left{display:flex;overflow:hidden;flex:1 1 auto;flex-direction:column;gap:8px}.list__flowsGroup__flows__flow__left__name{overflow:hidden;padding-left:4px;text-overflow:ellipsis;white-space:nowrap}.list__flowsGroup__flows__flow__left__infos{display:flex;align-items:center}.list__flowsGroup__flows__flow__left__infos__badges{flex:0 0 auto}.list__flowsGroup__flows__flow__left__infos__badges__badge{width:auto}.list__flowsGroup__flows__flow__left__infos__pathOrChannelLabel{overflow:hidden;flex:1 1 auto;direction:rtl;text-align:left;text-overflow:ellipsis;white-space:nowrap}.list__flowsGroup__flows__flow__left__infos__pathOrChannelLabel span{direction:ltr;unicode-bidi:bidi-override}.list__flowsGroup__flows__flow__left__infos__conditionBadge{flex:0 0 auto}.list__flowsGroup__no-flows{font-style:italic}.list__flowsGroup.cdk-drop-list-dragging{pointer-events:none}.list__flowsGroup .cdk-drag-preview{box-sizing:border-box;border-radius:4px;box-shadow:0 5px 5px -3px #0003,0 8px 10px 1px #00000024,0 3px 14px 2px #0000001f}.list__flowsGroup .cdk-drag-placeholder *{opacity:0}.list__flowsGroup .cdk-drag-animating{transition:transform .25s cubic-bezier(0,0,.2,1)}.list__flowsGroup.cdk-drop-list-dragging .list__flowsGroup__flows__flow:not(.cdk-drag-placeholder){transition:transform .25s cubic-bezier(0,0,.2,1)}.loadingList{display:flex;height:100%;flex-direction:column;align-items:center;justify-content:center}\n"] }]
|
|
1204
1407
|
}], ctorParameters: () => [{ type: i1.MatDialog }], propDecorators: { readOnly: [{
|
|
1205
1408
|
type: Input
|
|
1206
1409
|
}], loading: [{
|
|
@@ -1396,7 +1599,7 @@ class GioPolicyStudioStepFormComponent {
|
|
|
1396
1599
|
});
|
|
1397
1600
|
}
|
|
1398
1601
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: GioPolicyStudioStepFormComponent, deps: [{ token: GioPolicyStudioService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
1399
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.3", type: GioPolicyStudioStepFormComponent, isStandalone: true, selector: "gio-ps-step-form", inputs: { readOnly: "readOnly", step: "step", flowPhase: "flowPhase", apiType: "apiType", genericPolicy: "genericPolicy" }, outputs: { stepChange: "stepChange", isValid: "isValid" }, usesOnChanges: true, ngImport: i0, template: "<!--\n\n Copyright (C) 2025 The Gravitee team (http://gravitee.io)\n \n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n \n http://www.apache.org/licenses/LICENSE-2.0\n \n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n-->\n\n<div class=\"settings\">\n <div class=\"settings__header\">Settings</div>\n\n <div class=\"settings__content\">\n @if (stepForm && (policySchema$ | async); as policySchema) {\n <ng-container [formGroup]=\"stepForm\">\n <mat-form-field>\n <mat-label>Description</mat-label>\n <textarea matInput formControlName=\"description\" cdkFocusInitial></textarea>\n <mat-hint>Describe how your policy works.</mat-hint>\n </mat-form-field>\n <mat-form-field>\n <mat-label>Trigger condition</mat-label>\n <input matInput formControlName=\"condition\" />\n <mat-hint>The condition to execute this policy. Supports Expression Language.</mat-hint>\n <gio-el-assistant matSuffix />\n </mat-form-field>\n @if (isMessage) {\n <mat-form-field>\n <mat-label>Message trigger condition</mat-label>\n <input matInput formControlName=\"messageCondition\" />\n <mat-hint>The condition to execute this policy on message. Supports Expression Language.</mat-hint>\n <gio-el-assistant matSuffix />\n </mat-form-field>\n }\n @if (policySchema) {\n <gio-form-json-schema\n [jsonSchema]=\"$any(policySchema)\"\n [context]=\"context\"\n (ready)=\"onJsonSchemaReady($event)\"\n formControlName=\"configuration\"\n ></gio-form-json-schema>\n }\n </ng-container>\n } @else {\n <gio-loader></gio-loader>\n }\n </div>\n</div>\n\n<div class=\"documentation\">\n <div class=\"documentation__header\">Documentation</div>\n\n <div class=\"documentation__content\">\n @if (infoBanner) {\n <gio-banner-warning>\n Prerequisite message\n <span gioBannerBody>{{ infoBanner }}</span>\n </gio-banner-warning>\n }\n @if (policyDocumentation$ | async; as policyDocumentation) {\n @switch (policyDocumentation.language) {\n @case ('ASCIIDOC') {\n <gio-asciidoctor [content]=\"policyDocumentation.content\"></gio-asciidoctor>\n }\n @case ('MARKDOWN') {\n <markdown class=\"documentation__content__markdown\" [data]=\"policyDocumentation.content\"></markdown>\n }\n }\n } @else {\n <gio-loader></gio-loader>\n }\n </div>\n</div>\n", styles: ["@charset \"UTF-8\";.gio-top-bar-menu .gio-badge-accent{background-color:var(--gio-oem-palette--active, #ffc2ac);color:var(--gio-oem-palette--active-contrast, #1e1b1b)}:host{display:flex;flex-direction:row;border:1px solid #d2cecd;border-radius:8px}::ng-deep gio-ps-step-form .documentation__content__markdown table{overflow:hidden;width:100%;border:1px solid #d2cecd;border-radius:4px;margin-bottom:12px;border-collapse:separate;border-spacing:0}::ng-deep gio-ps-step-form .documentation__content__markdown table th,::ng-deep gio-ps-step-form .documentation__content__markdown table td{padding:8px;border-bottom:1px solid #d2cecd}::ng-deep gio-ps-step-form .documentation__content__markdown table tr:last-child td{border-bottom:none}::ng-deep gio-ps-step-form .documentation__content__markdown table th:first-child{border-top-left-radius:4px}::ng-deep gio-ps-step-form .documentation__content__markdown table th:last-child{border-top-right-radius:4px}::ng-deep gio-ps-step-form .documentation__content__markdown table tr:last-child td:first-child{border-bottom-left-radius:4px}::ng-deep gio-ps-step-form .documentation__content__markdown table tr:last-child td:last-child{border-bottom-right-radius:4px}.settings{display:flex;flex:0 0 50%;flex-direction:column}.settings__header{border-right:1px solid #d2cecd}.settings__content{display:flex;flex:1 1 auto;flex-direction:column;padding:16px;border-right:1px solid #d2cecd}.documentation{display:flex;overflow:auto;flex:0 0 50%;flex-direction:column}.documentation__content{overflow:auto;flex:1 1 auto;padding:16px}.settings__header,.documentation__header{padding:16px;border-bottom:1px solid #d2cecd;font-size:14px;font-weight:700;line-height:20px;font-family:Manrope,sans-serif;letter-spacing:.4px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type:
|
|
1602
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.3", type: GioPolicyStudioStepFormComponent, isStandalone: true, selector: "gio-ps-step-form", inputs: { readOnly: "readOnly", step: "step", flowPhase: "flowPhase", apiType: "apiType", genericPolicy: "genericPolicy" }, outputs: { stepChange: "stepChange", isValid: "isValid" }, usesOnChanges: true, ngImport: i0, template: "<!--\n\n Copyright (C) 2025 The Gravitee team (http://gravitee.io)\n \n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n \n http://www.apache.org/licenses/LICENSE-2.0\n \n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n-->\n\n<div class=\"settings\">\n <div class=\"settings__header\">Settings</div>\n\n <div class=\"settings__content\">\n @if (stepForm && (policySchema$ | async); as policySchema) {\n <ng-container [formGroup]=\"stepForm\">\n <mat-form-field>\n <mat-label>Description</mat-label>\n <textarea matInput formControlName=\"description\" cdkFocusInitial></textarea>\n <mat-hint>Describe how your policy works.</mat-hint>\n </mat-form-field>\n <mat-form-field>\n <mat-label>Trigger condition</mat-label>\n <input matInput formControlName=\"condition\" />\n <mat-hint>The condition to execute this policy. Supports Expression Language.</mat-hint>\n <gio-el-assistant matSuffix />\n </mat-form-field>\n @if (isMessage) {\n <mat-form-field>\n <mat-label>Message trigger condition</mat-label>\n <input matInput formControlName=\"messageCondition\" />\n <mat-hint>The condition to execute this policy on message. Supports Expression Language.</mat-hint>\n <gio-el-assistant matSuffix />\n </mat-form-field>\n }\n @if (policySchema) {\n <gio-form-json-schema\n [jsonSchema]=\"$any(policySchema)\"\n [context]=\"context\"\n (ready)=\"onJsonSchemaReady($event)\"\n formControlName=\"configuration\"\n ></gio-form-json-schema>\n }\n </ng-container>\n } @else {\n <gio-loader></gio-loader>\n }\n </div>\n</div>\n\n<div class=\"documentation\">\n <div class=\"documentation__header\">Documentation</div>\n\n <div class=\"documentation__content\">\n @if (infoBanner) {\n <gio-banner-warning>\n Prerequisite message\n <span gioBannerBody>{{ infoBanner }}</span>\n </gio-banner-warning>\n }\n @if (policyDocumentation$ | async; as policyDocumentation) {\n @switch (policyDocumentation.language) {\n @case ('ASCIIDOC') {\n <gio-asciidoctor [content]=\"policyDocumentation.content\"></gio-asciidoctor>\n }\n @case ('MARKDOWN') {\n <markdown class=\"documentation__content__markdown\" [data]=\"policyDocumentation.content\"></markdown>\n }\n }\n } @else {\n <gio-loader></gio-loader>\n }\n </div>\n</div>\n", styles: ["@charset \"UTF-8\";.gio-top-bar-menu .gio-badge-accent{background-color:var(--gio-oem-palette--active, #ffc2ac);color:var(--gio-oem-palette--active-contrast, #1e1b1b)}:host{display:flex;flex-direction:row;border:1px solid #d2cecd;border-radius:8px}::ng-deep gio-ps-step-form .documentation__content__markdown table{overflow:hidden;width:100%;border:1px solid #d2cecd;border-radius:4px;margin-bottom:12px;border-collapse:separate;border-spacing:0}::ng-deep gio-ps-step-form .documentation__content__markdown table th,::ng-deep gio-ps-step-form .documentation__content__markdown table td{padding:8px;border-bottom:1px solid #d2cecd}::ng-deep gio-ps-step-form .documentation__content__markdown table tr:last-child td{border-bottom:none}::ng-deep gio-ps-step-form .documentation__content__markdown table th:first-child{border-top-left-radius:4px}::ng-deep gio-ps-step-form .documentation__content__markdown table th:last-child{border-top-right-radius:4px}::ng-deep gio-ps-step-form .documentation__content__markdown table tr:last-child td:first-child{border-bottom-left-radius:4px}::ng-deep gio-ps-step-form .documentation__content__markdown table tr:last-child td:last-child{border-bottom-right-radius:4px}.settings{display:flex;flex:0 0 50%;flex-direction:column}.settings__header{border-right:1px solid #d2cecd}.settings__content{display:flex;flex:1 1 auto;flex-direction:column;padding:16px;border-right:1px solid #d2cecd}.documentation{display:flex;overflow:auto;flex:0 0 50%;flex-direction:column}.documentation__content{overflow:auto;flex:1 1 auto;padding:16px}.settings__header,.documentation__header{padding:16px;border-bottom:1px solid #d2cecd;font-size:14px;font-weight:700;line-height:20px;font-family:Manrope,sans-serif;letter-spacing:.4px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i5$1.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "component", type: i4.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i4.MatLabel, selector: "mat-label" }, { kind: "directive", type: i4.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i4.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "ngmodule", type: GioFormJsonSchemaModule }, { kind: "component", type: i7.GioFormJsonSchemaComponent, selector: "gio-form-json-schema", inputs: ["jsonSchema", "context", "options"], outputs: ["ready"] }, { kind: "ngmodule", type: GioAsciidoctorModule }, { kind: "component", type: i6$2.GioAsciidoctorComponent, selector: "gio-asciidoctor", inputs: ["content", "src"] }, { kind: "ngmodule", type: GioLoaderModule }, { kind: "component", type: i7.GioLoaderComponent, selector: "gio-loader" }, { kind: "ngmodule", type: GioBannerModule }, { kind: "component", type: i7.GioBannerWarningComponent, selector: "gio-banner-warning" }, { kind: "directive", type: i7.GioBannerBodyDirective, selector: "[gioBannerBody]" }, { kind: "component", type: MarkdownComponent, selector: "markdown, [markdown]", inputs: ["data", "src", "disableSanitizer", "inline", "clipboard", "clipboardButtonComponent", "clipboardButtonTemplate", "emoji", "katex", "katexOptions", "mermaid", "mermaidOptions", "lineHighlight", "line", "lineOffset", "lineNumbers", "start", "commandLine", "filterOutput", "host", "prompt", "output", "user"], outputs: ["error", "load", "ready"] }, { kind: "component", type: GioElAssistantComponent, selector: "gio-el-assistant" }, { kind: "pipe", type: i5$2.AsyncPipe, name: "async" }] }); }
|
|
1400
1603
|
}
|
|
1401
1604
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: GioPolicyStudioStepFormComponent, decorators: [{
|
|
1402
1605
|
type: Component,
|
|
@@ -1485,6 +1688,8 @@ class GioPolicyStudioPoliciesCatalogDialogComponent {
|
|
|
1485
1688
|
return genericPolicy.flowPhaseCompatibility?.NATIVE_KAFKA?.includes(flowDialogData.flowPhase);
|
|
1486
1689
|
case 'MCP_PROXY':
|
|
1487
1690
|
return genericPolicy.flowPhaseCompatibility?.HTTP_MCP_PROXY?.includes(flowDialogData.flowPhase);
|
|
1691
|
+
case 'LLM_PROXY':
|
|
1692
|
+
return genericPolicy.flowPhaseCompatibility?.HTTP_LLM_PROXY?.includes(flowDialogData.flowPhase);
|
|
1488
1693
|
default:
|
|
1489
1694
|
throw new Error('Unknown API type');
|
|
1490
1695
|
}
|
|
@@ -1554,7 +1759,7 @@ class GioPolicyStudioPoliciesCatalogDialogComponent {
|
|
|
1554
1759
|
this.isUnlicensed = false;
|
|
1555
1760
|
}
|
|
1556
1761
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: GioPolicyStudioPoliciesCatalogDialogComponent, deps: [{ token: i1.MatDialogRef }, { token: MAT_DIALOG_DATA }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
1557
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.3", type: GioPolicyStudioPoliciesCatalogDialogComponent, isStandalone: true, selector: "gio-ps-policies-catalog-dialog", ngImport: i0, template: "<!--\n\n Copyright (C) 2025 The Gravitee team (http://gravitee.io)\n \n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n \n http://www.apache.org/licenses/LICENSE-2.0\n \n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n-->\n<h2 mat-dialog-title class=\"title\">\n @if (selectedPolicy) {\n <button class=\"title__goBackBtn\" mat-stroked-button (click)=\"onGoBack()\">\n <mat-icon svgIcon=\"gio:arrow-left\"></mat-icon>\n Go back\n </button>\n }\n Policies for <span class=\"title__phase\">{{ flowPhaseLabel }}</span> phase\n\n <button class=\"title__closeBtn\" mat-icon-button aria-label=\"Close dialog\" [mat-dialog-close]=\"\">\n <mat-icon svgIcon=\"gio:cancel\"></mat-icon>\n </button>\n</h2>\n\n<ng-container>\n @if (!selectedPolicy) {\n <mat-dialog-content class=\"policiesCatalog\">\n <div class=\"policiesCatalog__filters\" [formGroup]=\"filtersForm\">\n <mat-form-field class=\"policiesCatalog__filters__search\" appearance=\"outline\">\n <mat-label>Search</mat-label>\n <input matInput formControlName=\"search\" cdkFocusInitial />\n @if (filtersForm.get('search')?.value) {\n <button matIconSuffix mat-icon-button aria-label=\"Clear\" (click)=\"filtersForm.get('search')?.setValue('')\">\n <mat-icon svgIcon=\"gio:cancel\"></mat-icon>\n </button>\n }\n </mat-form-field>\n @if (categories.length > 1) {\n <mat-chip-listbox\n class=\"policiesCatalog__filters__categories\"\n aria-label=\"Categories selection\"\n multiple\n formControlName=\"categories\"\n >\n @for (category of categories; track category) {\n <mat-chip-option [selected]=\"category\" [value]=\"category\">{{ category | titlecase }} </mat-chip-option>\n }\n </mat-chip-listbox>\n }\n </div>\n @if (policies.length) {\n <div class=\"policiesCatalog__list\">\n @for (policy of policies; track policy) {\n <div class=\"policiesCatalog__list__policy\">\n <div class=\"policiesCatalog__list__policy__head\">\n <mat-icon class=\"policiesCatalog__list__policy__head__icon\" [svgIcon]=\"policy.icon ?? 'gio:puzzle'\"></mat-icon>\n @if (policy.name) {\n <span class=\"policiesCatalog__list__policy__head__name\">{{ policy.name }}</span>\n }\n @if (policy.genericPolicy.type === 'SHARED_POLICY_GROUP') {\n <span class=\"gio-badge-neutral policiesCatalog__list__policy__head__badge\" matTooltip=\"Shared Policy Group\">\n <mat-icon svgIcon=\"gio:users\"></mat-icon>\n </span>\n }\n </div>\n @if (policy.deployed === false) {\n <div class=\"policiesCatalog__list__policy__enterprise\">\n <mat-icon\n class=\"policiesCatalog__list__policy__enterprise__lock\"\n [svgIcon]=\"'gio:lock'\"\n matTooltip=\"This policy is only available for users with an enterprise license.\"\n ></mat-icon>\n </div>\n }\n @if (policy.description) {\n <div class=\"policiesCatalog__list__policy__description\">{{ policy.description }}</div>\n }\n <button class=\"policiesCatalog__list__policy__selectBtn\" mat-stroked-button role=\"dialog\" (click)=\"onSelectPolicy(policy)\">\n Select\n </button>\n </div>\n }\n </div>\n } @else {\n <div class=\"emptyPoliciesCatalog\">No policies available.</div>\n }\n </mat-dialog-content>\n }\n</ng-container>\n\n@if (selectedPolicy) {\n <mat-dialog-content class=\"policyForm\">\n @if (isUnlicensed) {\n <gio-banner type=\"error\" icon=\"gio:universe\">\n This policy is only available for users with an enterprise license.\n <span gioBannerBody>Request a license to upgrade your account and unlock this policy</span>\n <div gioBannerAction>\n @if (trialUrl) {\n <a mat-stroked-button [href]=\"trialUrl\" target=\"_blank\">Request upgrade</a>\n }\n </div>\n </gio-banner>\n }\n <div class=\"policyForm__info\">\n <div class=\"policyForm__info__head\">\n <mat-icon class=\"policyForm__info__head__icon\" [svgIcon]=\"selectedPolicy.icon ?? 'gio:puzzle'\"></mat-icon>\n @if (selectedPolicy.name) {\n <span class=\"policyForm__info__head__name\">{{ selectedPolicy.name }}</span>\n }\n @if (selectedPolicy.type === 'SHARED_POLICY_GROUP') {\n <span class=\"gio-badge-neutral policiesCatalog__list__policy__head__badge\">\n <mat-icon svgIcon=\"gio:users\"></mat-icon> Shared Policy Group\n </span>\n }\n </div>\n @if (selectedPolicy.description) {\n <div class=\"policyForm__info__description\">{{ selectedPolicy.description }}</div>\n }\n </div>\n <gio-ps-step-form\n [genericPolicy]=\"selectedPolicy\"\n [flowPhase]=\"flowPhase\"\n [apiType]=\"apiType\"\n (stepChange)=\"onStepChange($event)\"\n (isValid)=\"onIsValid($event)\"\n ></gio-ps-step-form>\n </mat-dialog-content>\n}\n\n<mat-dialog-actions class=\"actions\" align=\"end\">\n <button class=\"actions__cancelBtn\" mat-button [mat-dialog-close]=\"\">Cancel</button>\n @if (selectedPolicy) {\n <button\n class=\"actions__addBtn\"\n color=\"primary\"\n mat-flat-button\n role=\"dialog\"\n [disabled]=\"!isValid || isUnlicensed\"\n (click)=\"onAddPolicy()\"\n >\n Add policy\n </button>\n }\n</mat-dialog-actions>\n", styles: ["@charset \"UTF-8\";.gio-top-bar-menu .gio-badge-accent{background-color:var(--gio-oem-palette--active, #ffc2ac);color:var(--gio-oem-palette--active-contrast, #1e1b1b)}.title__goBackBtn{margin-right:8px;line-height:normal}.title__closeBtn{top:0;right:-24px;float:right}.policiesCatalog__filters{display:flex;flex-direction:column;padding:0 0 8px;gap:8px}.policiesCatalog__filters__search{width:100%;height:54px;padding-bottom:0}.policiesCatalog__list{--grid-layout-gap: 16px;--grid-column-count: 3;--grid-item-min-width: 200px;--gap-count: calc(var(--grid-column-count) - 1);--total-gap-width: calc(var(--gap-count) * var(--grid-layout-gap));--grid-item-max-width: calc((100% - var(--total-gap-width)) / var(--grid-column-count));display:grid;grid-gap:var(--grid-layout-gap);grid-template-columns:repeat(auto-fill,minmax(max(var(--grid-item-min-width),var(--grid-item-max-width)),1fr))}.policiesCatalog__list__policy{position:relative;display:flex;flex-direction:column;align-items:flex-start;justify-content:space-between;padding:16px;border:1px solid #d2cecd;border-radius:8px;gap:4px}.policiesCatalog__list__policy__head{display:flex;align-items:center;align-self:stretch}.policiesCatalog__list__policy__head__icon{min-width:24px;flex:0 0 24px;margin-right:8px}.policiesCatalog__list__policy__head__name{overflow:hidden;flex:1 1 auto;text-overflow:ellipsis;white-space:nowrap}.policiesCatalog__list__policy__head__badge{float:left}.policiesCatalog__list__policy__enterprise{position:absolute;top:0;right:0;padding:8px 8px 8px 16px;border-radius:0 8px 0 38px;background:#f7f7f8;color:#da3b00}.policiesCatalog__list__policy__enterprise__lock{min-width:16px;max-width:16px;color:#da3b00}.policiesCatalog__list__policy__description{font-size:12px;font-weight:400;line-height:16px;font-family:Manrope,sans-serif;letter-spacing:normal;display:-webkit-box;overflow:hidden;-webkit-box-orient:vertical;color:#322f2f;-webkit-line-clamp:2}.policiesCatalog__list__policy__description:empty{display:none}.policiesCatalog__list__policy__selectBtn{margin-top:8px}.policyForm__goBackBtn{margin:16px 0}.policyForm__info{display:flex;max-width:100%;flex-direction:column;align-items:flex-start;padding-bottom:16px;gap:4px}.policyForm__info__head{display:flex;align-items:center}.policyForm__info__head__icon{min-width:24px;flex:1 1 24px;margin-right:8px}.policyForm__info__head__name{flex:1 1 auto}.policyForm__info__description{font-size:12px;font-weight:400;line-height:16px;font-family:Manrope,sans-serif;letter-spacing:normal;color:#322f2f}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i3.MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: i3.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatDialogModule }, { kind: "directive", type: i1.MatDialogClose, selector: "[mat-dialog-close], [matDialogClose]", inputs: ["aria-label", "type", "mat-dialog-close", "matDialogClose"], exportAs: ["matDialogClose"] }, { kind: "directive", type: i1.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: i1.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "directive", type: i1.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i4.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i4.MatLabel, selector: "mat-label" }, { kind: "directive", type: i4.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: MatChipsModule }, { kind: "component", type: i5$2.MatChipListbox, selector: "mat-chip-listbox", inputs: ["multiple", "aria-orientation", "selectable", "compareWith", "required", "hideSingleSelectionIndicator", "value"], outputs: ["change"] }, { kind: "component", type: i5$2.MatChipOption, selector: "mat-basic-chip-option, [mat-basic-chip-option], mat-chip-option, [mat-chip-option]", inputs: ["selectable", "selected"], outputs: ["selectionChange"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i6$1.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "ngmodule", type: GioBannerModule }, { kind: "component", type: i7.GioBannerComponent, selector: "gio-banner", inputs: ["type", "icon", "collapsible"] }, { kind: "directive", type: i7.GioBannerBodyDirective, selector: "[gioBannerBody]" }, { kind: "directive", type: i7.GioBannerActionDirective, selector: "[gioBannerAction]" }, { kind: "ngmodule", type: GioIconsModule }, { kind: "component", type: i2$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: GioPolicyStudioStepFormComponent, selector: "gio-ps-step-form", inputs: ["readOnly", "step", "flowPhase", "apiType", "genericPolicy"], outputs: ["stepChange", "isValid"] }, { kind: "directive", type: MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "pipe", type: i5$1.TitleCasePipe, name: "titlecase" }] }); }
|
|
1762
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.3", type: GioPolicyStudioPoliciesCatalogDialogComponent, isStandalone: true, selector: "gio-ps-policies-catalog-dialog", ngImport: i0, template: "<!--\n\n Copyright (C) 2025 The Gravitee team (http://gravitee.io)\n \n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n \n http://www.apache.org/licenses/LICENSE-2.0\n \n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n-->\n<h2 mat-dialog-title class=\"title\">\n @if (selectedPolicy) {\n <button class=\"title__goBackBtn\" mat-stroked-button (click)=\"onGoBack()\">\n <mat-icon svgIcon=\"gio:arrow-left\"></mat-icon>\n Go back\n </button>\n }\n Policies for <span class=\"title__phase\">{{ flowPhaseLabel }}</span> phase\n\n <button class=\"title__closeBtn\" mat-icon-button aria-label=\"Close dialog\" [mat-dialog-close]=\"\">\n <mat-icon svgIcon=\"gio:cancel\"></mat-icon>\n </button>\n</h2>\n\n<ng-container>\n @if (!selectedPolicy) {\n <mat-dialog-content class=\"policiesCatalog\">\n <div class=\"policiesCatalog__filters\" [formGroup]=\"filtersForm\">\n <mat-form-field class=\"policiesCatalog__filters__search\" appearance=\"outline\">\n <mat-label>Search</mat-label>\n <input matInput formControlName=\"search\" cdkFocusInitial />\n @if (filtersForm.get('search')?.value) {\n <button matIconSuffix mat-icon-button aria-label=\"Clear\" (click)=\"filtersForm.get('search')?.setValue('')\">\n <mat-icon svgIcon=\"gio:cancel\"></mat-icon>\n </button>\n }\n </mat-form-field>\n @if (categories.length > 1) {\n <mat-chip-listbox\n class=\"policiesCatalog__filters__categories\"\n aria-label=\"Categories selection\"\n multiple\n formControlName=\"categories\"\n >\n @for (category of categories; track category) {\n <mat-chip-option [selected]=\"category\" [value]=\"category\">{{ category | titlecase }} </mat-chip-option>\n }\n </mat-chip-listbox>\n }\n </div>\n @if (policies.length) {\n <div class=\"policiesCatalog__list\">\n @for (policy of policies; track policy) {\n <div class=\"policiesCatalog__list__policy\">\n <div class=\"policiesCatalog__list__policy__head\">\n <mat-icon class=\"policiesCatalog__list__policy__head__icon\" [svgIcon]=\"policy.icon ?? 'gio:puzzle'\"></mat-icon>\n @if (policy.name) {\n <span class=\"policiesCatalog__list__policy__head__name\">{{ policy.name }}</span>\n }\n @if (policy.genericPolicy.type === 'SHARED_POLICY_GROUP') {\n <span class=\"gio-badge-neutral policiesCatalog__list__policy__head__badge\" matTooltip=\"Shared Policy Group\">\n <mat-icon svgIcon=\"gio:users\"></mat-icon>\n </span>\n }\n </div>\n @if (policy.deployed === false) {\n <div class=\"policiesCatalog__list__policy__enterprise\">\n <mat-icon\n class=\"policiesCatalog__list__policy__enterprise__lock\"\n [svgIcon]=\"'gio:lock'\"\n matTooltip=\"This policy is only available for users with an enterprise license.\"\n ></mat-icon>\n </div>\n }\n @if (policy.description) {\n <div class=\"policiesCatalog__list__policy__description\">{{ policy.description }}</div>\n }\n <button class=\"policiesCatalog__list__policy__selectBtn\" mat-stroked-button role=\"dialog\" (click)=\"onSelectPolicy(policy)\">\n Select\n </button>\n </div>\n }\n </div>\n } @else {\n <div class=\"emptyPoliciesCatalog\">No policies available.</div>\n }\n </mat-dialog-content>\n }\n</ng-container>\n\n@if (selectedPolicy) {\n <mat-dialog-content class=\"policyForm\">\n @if (isUnlicensed) {\n <gio-banner type=\"error\" icon=\"gio:universe\">\n This policy is only available for users with an enterprise license.\n <span gioBannerBody>Request a license to upgrade your account and unlock this policy</span>\n <div gioBannerAction>\n @if (trialUrl) {\n <a mat-stroked-button [href]=\"trialUrl\" target=\"_blank\">Request upgrade</a>\n }\n </div>\n </gio-banner>\n }\n <div class=\"policyForm__info\">\n <div class=\"policyForm__info__head\">\n <mat-icon class=\"policyForm__info__head__icon\" [svgIcon]=\"selectedPolicy.icon ?? 'gio:puzzle'\"></mat-icon>\n @if (selectedPolicy.name) {\n <span class=\"policyForm__info__head__name\">{{ selectedPolicy.name }}</span>\n }\n @if (selectedPolicy.type === 'SHARED_POLICY_GROUP') {\n <span class=\"gio-badge-neutral policiesCatalog__list__policy__head__badge\">\n <mat-icon svgIcon=\"gio:users\"></mat-icon> Shared Policy Group\n </span>\n }\n </div>\n @if (selectedPolicy.description) {\n <div class=\"policyForm__info__description\">{{ selectedPolicy.description }}</div>\n }\n </div>\n <gio-ps-step-form\n [genericPolicy]=\"selectedPolicy\"\n [flowPhase]=\"flowPhase\"\n [apiType]=\"apiType\"\n (stepChange)=\"onStepChange($event)\"\n (isValid)=\"onIsValid($event)\"\n ></gio-ps-step-form>\n </mat-dialog-content>\n}\n\n<mat-dialog-actions class=\"actions\" align=\"end\">\n <button class=\"actions__cancelBtn\" mat-button [mat-dialog-close]=\"\">Cancel</button>\n @if (selectedPolicy) {\n <button\n class=\"actions__addBtn\"\n color=\"primary\"\n mat-flat-button\n role=\"dialog\"\n [disabled]=\"!isValid || isUnlicensed\"\n (click)=\"onAddPolicy()\"\n >\n Add policy\n </button>\n }\n</mat-dialog-actions>\n", styles: ["@charset \"UTF-8\";.gio-top-bar-menu .gio-badge-accent{background-color:var(--gio-oem-palette--active, #ffc2ac);color:var(--gio-oem-palette--active-contrast, #1e1b1b)}.title__goBackBtn{margin-right:8px;line-height:normal}.title__closeBtn{top:0;right:-24px;float:right}.policiesCatalog__filters{display:flex;flex-direction:column;padding:0 0 8px;gap:8px}.policiesCatalog__filters__search{width:100%;height:54px;padding-bottom:0}.policiesCatalog__list{--grid-layout-gap: 16px;--grid-column-count: 3;--grid-item-min-width: 200px;--gap-count: calc(var(--grid-column-count) - 1);--total-gap-width: calc(var(--gap-count) * var(--grid-layout-gap));--grid-item-max-width: calc((100% - var(--total-gap-width)) / var(--grid-column-count));display:grid;grid-gap:var(--grid-layout-gap);grid-template-columns:repeat(auto-fill,minmax(max(var(--grid-item-min-width),var(--grid-item-max-width)),1fr))}.policiesCatalog__list__policy{position:relative;display:flex;flex-direction:column;align-items:flex-start;justify-content:space-between;padding:16px;border:1px solid #d2cecd;border-radius:8px;gap:4px}.policiesCatalog__list__policy__head{display:flex;align-items:center;align-self:stretch}.policiesCatalog__list__policy__head__icon{min-width:24px;flex:0 0 24px;margin-right:8px}.policiesCatalog__list__policy__head__name{overflow:hidden;flex:1 1 auto;text-overflow:ellipsis;white-space:nowrap}.policiesCatalog__list__policy__head__badge{float:left}.policiesCatalog__list__policy__enterprise{position:absolute;top:0;right:0;padding:8px 8px 8px 16px;border-radius:0 8px 0 38px;background:#f7f7f8;color:#da3b00}.policiesCatalog__list__policy__enterprise__lock{min-width:16px;max-width:16px;color:#da3b00}.policiesCatalog__list__policy__description{font-size:12px;font-weight:400;line-height:16px;font-family:Manrope,sans-serif;letter-spacing:normal;display:-webkit-box;overflow:hidden;-webkit-box-orient:vertical;color:#322f2f;-webkit-line-clamp:2}.policiesCatalog__list__policy__description:empty{display:none}.policiesCatalog__list__policy__selectBtn{margin-top:8px}.policyForm__goBackBtn{margin:16px 0}.policyForm__info{display:flex;max-width:100%;flex-direction:column;align-items:flex-start;padding-bottom:16px;gap:4px}.policyForm__info__head{display:flex;align-items:center}.policyForm__info__head__icon{min-width:24px;flex:1 1 24px;margin-right:8px}.policyForm__info__head__name{flex:1 1 auto}.policyForm__info__description{font-size:12px;font-weight:400;line-height:16px;font-family:Manrope,sans-serif;letter-spacing:normal;color:#322f2f}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i3.MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: i3.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatDialogModule }, { kind: "directive", type: i1.MatDialogClose, selector: "[mat-dialog-close], [matDialogClose]", inputs: ["aria-label", "type", "mat-dialog-close", "matDialogClose"], exportAs: ["matDialogClose"] }, { kind: "directive", type: i1.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: i1.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "directive", type: i1.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i4.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i4.MatLabel, selector: "mat-label" }, { kind: "directive", type: i4.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: MatChipsModule }, { kind: "component", type: i5$3.MatChipListbox, selector: "mat-chip-listbox", inputs: ["multiple", "aria-orientation", "selectable", "compareWith", "required", "hideSingleSelectionIndicator", "value"], outputs: ["change"] }, { kind: "component", type: i5$3.MatChipOption, selector: "mat-basic-chip-option, [mat-basic-chip-option], mat-chip-option, [mat-chip-option]", inputs: ["selectable", "selected"], outputs: ["selectionChange"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i5$1.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "ngmodule", type: GioBannerModule }, { kind: "component", type: i7.GioBannerComponent, selector: "gio-banner", inputs: ["type", "icon", "collapsible"] }, { kind: "directive", type: i7.GioBannerBodyDirective, selector: "[gioBannerBody]" }, { kind: "directive", type: i7.GioBannerActionDirective, selector: "[gioBannerAction]" }, { kind: "ngmodule", type: GioIconsModule }, { kind: "component", type: i6$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: GioPolicyStudioStepFormComponent, selector: "gio-ps-step-form", inputs: ["readOnly", "step", "flowPhase", "apiType", "genericPolicy"], outputs: ["stepChange", "isValid"] }, { kind: "directive", type: MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "pipe", type: i5$2.TitleCasePipe, name: "titlecase" }] }); }
|
|
1558
1763
|
}
|
|
1559
1764
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: GioPolicyStudioPoliciesCatalogDialogComponent, decorators: [{
|
|
1560
1765
|
type: Component,
|
|
@@ -1608,7 +1813,7 @@ class GioPolicyStudioStepEditDialogComponent {
|
|
|
1608
1813
|
});
|
|
1609
1814
|
}
|
|
1610
1815
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: GioPolicyStudioStepEditDialogComponent, deps: [{ token: i1.MatDialogRef }, { token: MAT_DIALOG_DATA }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
1611
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.3", type: GioPolicyStudioStepEditDialogComponent, isStandalone: true, selector: "gio-ps-step-edit-dialog", ngImport: i0, template: "<!--\n\n Copyright (C) 2025 The Gravitee team (http://gravitee.io)\n \n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n \n http://www.apache.org/licenses/LICENSE-2.0\n \n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n-->\n<h2 mat-dialog-title class=\"title\">\n <mat-icon class=\"title__icon\" [svgIcon]=\"genericPolicy.icon ?? 'gio:puzzle'\"></mat-icon>\n\n @if (step.name) {\n <span class=\"title__name\">\n {{ step.name }}\n @if (genericPolicy.type === 'SHARED_POLICY_GROUP') {\n <span class=\"gio-badge-neutral policiesCatalog__list__policy__head__badge\">\n <mat-icon svgIcon=\"gio:users\"></mat-icon> Shared Policy Group\n </span>\n }\n </span>\n }\n\n <button class=\"title__closeBtn\" mat-icon-button aria-label=\"Close dialog\" [mat-dialog-close]=\"\">\n <mat-icon svgIcon=\"gio:cancel\"></mat-icon>\n </button>\n\n <div class=\"title__description\">\n {{ genericPolicy.description }}\n </div>\n</h2>\n\n<mat-dialog-content class=\"content\">\n <gio-ps-step-form\n [readOnly]=\"readOnly\"\n [genericPolicy]=\"genericPolicy\"\n [flowPhase]=\"flowPhase\"\n [apiType]=\"apiType\"\n [(step)]=\"step\"\n (isValid)=\"isValid = $event\"\n ></gio-ps-step-form>\n</mat-dialog-content>\n\n<mat-dialog-actions class=\"actions\" align=\"end\">\n <button class=\"actions__cancelBtn\" mat-button [mat-dialog-close]=\"\">Cancel</button>\n <button class=\"actions__saveBtn\" color=\"primary\" mat-flat-button role=\"dialog\" (click)=\"onSave()\" [disabled]=\"!isValid\">Save</button>\n</mat-dialog-actions>\n", styles: ["@charset \"UTF-8\";.gio-top-bar-menu .gio-badge-accent{background-color:var(--gio-oem-palette--active, #ffc2ac);color:var(--gio-oem-palette--active-contrast, #1e1b1b)}.title__icon{margin-right:8px}.title__closeBtn{top:0;right:-24px;float:right}.title__description{font-size:12px;font-weight:400;line-height:16px;font-family:Manrope,sans-serif;letter-spacing:normal;color:#322f2f}\n"], dependencies: [{ kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i3.MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: i3.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatDialogModule }, { kind: "directive", type: i1.MatDialogClose, selector: "[mat-dialog-close], [matDialogClose]", inputs: ["aria-label", "type", "mat-dialog-close", "matDialogClose"], exportAs: ["matDialogClose"] }, { kind: "directive", type: i1.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: i1.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "directive", type: i1.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "ngmodule", type: GioIconsModule }, { kind: "component", type:
|
|
1816
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.3", type: GioPolicyStudioStepEditDialogComponent, isStandalone: true, selector: "gio-ps-step-edit-dialog", ngImport: i0, template: "<!--\n\n Copyright (C) 2025 The Gravitee team (http://gravitee.io)\n \n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n \n http://www.apache.org/licenses/LICENSE-2.0\n \n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n-->\n<h2 mat-dialog-title class=\"title\">\n <mat-icon class=\"title__icon\" [svgIcon]=\"genericPolicy.icon ?? 'gio:puzzle'\"></mat-icon>\n\n @if (step.name) {\n <span class=\"title__name\">\n {{ step.name }}\n @if (genericPolicy.type === 'SHARED_POLICY_GROUP') {\n <span class=\"gio-badge-neutral policiesCatalog__list__policy__head__badge\">\n <mat-icon svgIcon=\"gio:users\"></mat-icon> Shared Policy Group\n </span>\n }\n </span>\n }\n\n <button class=\"title__closeBtn\" mat-icon-button aria-label=\"Close dialog\" [mat-dialog-close]=\"\">\n <mat-icon svgIcon=\"gio:cancel\"></mat-icon>\n </button>\n\n <div class=\"title__description\">\n {{ genericPolicy.description }}\n </div>\n</h2>\n\n<mat-dialog-content class=\"content\">\n <gio-ps-step-form\n [readOnly]=\"readOnly\"\n [genericPolicy]=\"genericPolicy\"\n [flowPhase]=\"flowPhase\"\n [apiType]=\"apiType\"\n [(step)]=\"step\"\n (isValid)=\"isValid = $event\"\n ></gio-ps-step-form>\n</mat-dialog-content>\n\n<mat-dialog-actions class=\"actions\" align=\"end\">\n <button class=\"actions__cancelBtn\" mat-button [mat-dialog-close]=\"\">Cancel</button>\n <button class=\"actions__saveBtn\" color=\"primary\" mat-flat-button role=\"dialog\" (click)=\"onSave()\" [disabled]=\"!isValid\">Save</button>\n</mat-dialog-actions>\n", styles: ["@charset \"UTF-8\";.gio-top-bar-menu .gio-badge-accent{background-color:var(--gio-oem-palette--active, #ffc2ac);color:var(--gio-oem-palette--active-contrast, #1e1b1b)}.title__icon{margin-right:8px}.title__closeBtn{top:0;right:-24px;float:right}.title__description{font-size:12px;font-weight:400;line-height:16px;font-family:Manrope,sans-serif;letter-spacing:normal;color:#322f2f}\n"], dependencies: [{ kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i3.MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: i3.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatDialogModule }, { kind: "directive", type: i1.MatDialogClose, selector: "[mat-dialog-close], [matDialogClose]", inputs: ["aria-label", "type", "mat-dialog-close", "matDialogClose"], exportAs: ["matDialogClose"] }, { kind: "directive", type: i1.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: i1.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "directive", type: i1.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "ngmodule", type: GioIconsModule }, { kind: "component", type: i6$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: GioPolicyStudioStepFormComponent, selector: "gio-ps-step-form", inputs: ["readOnly", "step", "flowPhase", "apiType", "genericPolicy"], outputs: ["stepChange", "isValid"] }] }); }
|
|
1612
1817
|
}
|
|
1613
1818
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: GioPolicyStudioStepEditDialogComponent, decorators: [{
|
|
1614
1819
|
type: Component,
|
|
@@ -1729,7 +1934,7 @@ ${this.policyNotFound === 'SHARED_POLICY_GROUP' ? 'Note: The Gateway will ignore
|
|
|
1729
1934
|
this.movedLeft.emit();
|
|
1730
1935
|
}
|
|
1731
1936
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: GioPolicyStudioDetailsPhaseStepComponent, deps: [{ token: i1.MatDialog }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
1732
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.3", type: GioPolicyStudioDetailsPhaseStepComponent, isStandalone: true, selector: "gio-ps-flow-details-phase-step", inputs: { readOnly: "readOnly", step: "step", genericPolicies: "genericPolicies", flowPhase: "flowPhase", apiType: "apiType", disableMoveRight: "disableMoveRight", disableMoveLeft: "disableMoveLeft" }, outputs: { stepChange: "stepChange", deleted: "deleted", disabled: "disabled", duplicated: "duplicated", movedRight: "movedRight", movedLeft: "movedLeft" }, usesOnChanges: true, ngImport: i0, template: "<!--\n\n Copyright (C) 2025 The Gravitee team (http://gravitee.io)\n \n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n \n http://www.apache.org/licenses/LICENSE-2.0\n \n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n-->\n\n<div class=\"info\">\n <div class=\"info__head\">\n <mat-icon class=\"info__head__icon\" [svgIcon]=\"genericPolicy?.icon ?? 'gio:puzzle'\"></mat-icon>\n\n @if (step.name) {\n <span class=\"info__head__name\">{{ step.name }}</span>\n }\n\n @if (genericPolicy?.type === 'SHARED_POLICY_GROUP') {\n <span class=\"gio-badge-neutral\" matTooltip=\"Shared Policy Group\">\n <mat-icon svgIcon=\"gio:users\"></mat-icon>\n </span>\n }\n @if (getPrerequisiteMessage) {\n <mat-icon class=\"info__head__info\" svgIcon=\"gio:info\" [matTooltip]=\"getPrerequisiteMessage\"></mat-icon>\n }\n @if (policyNotFound !== false) {\n <span\n class=\"gio-badge-error\"\n [matTooltip]=\"policyNotFound === 'SHARED_POLICY_GROUP' ? 'Shared Policy Group not found' : 'Policy not found'\"\n >\n @if (policyNotFound === 'SHARED_POLICY_GROUP') {\n <mat-icon svgIcon=\"gio:users\"></mat-icon> \n }\n <mat-icon svgIcon=\"gio:alert-circle\"></mat-icon>\n </span>\n }\n </div>\n\n @if (step.description) {\n <div class=\"info__description\">{{ step.description }}</div>\n }\n</div>\n\n<button class=\"menuBtn\" mat-icon-button [matMenuTriggerFor]=\"policyMenu\"><mat-icon svgIcon=\"gio:more-vertical\"></mat-icon></button>\n\n<mat-menu #policyMenu=\"matMenu\">\n <button mat-menu-item (click)=\"onEditOrView()\">\n <mat-icon [svgIcon]=\"readOnly ? 'gio:eye-empty' : 'gio:edit-pencil'\"></mat-icon>\n <span>{{ readOnly ? 'View' : 'Edit' }}</span>\n </button>\n\n <button [disabled]=\"readOnly\" mat-menu-item (click)=\"onDisable()\">\n <mat-icon [svgIcon]=\"step.enabled ? 'gio:prohibition' : 'gio:check-circled-outline'\"></mat-icon>\n <span>{{ step.enabled ? 'Disable' : 'Enable' }}</span>\n </button>\n\n <button [disabled]=\"readOnly\" mat-menu-item (click)=\"onDelete()\">\n <mat-icon svgIcon=\"gio:trash\"></mat-icon>\n <span>Delete</span>\n </button>\n <button [disabled]=\"readOnly\" mat-menu-item (click)=\"onDuplicate()\">\n <mat-icon svgIcon=\"gio:copy\"></mat-icon>\n <span>Duplicate</span>\n </button>\n @if (disableMoveRight) {\n <button [disabled]=\"readOnly\" mat-menu-item (click)=\"onMoveRight()\">\n <mat-icon svgIcon=\"gio:arrow-right\"></mat-icon>\n <span>Move right</span>\n </button>\n }\n @if (disableMoveLeft) {\n <button [disabled]=\"readOnly\" mat-menu-item (click)=\"onMoveLeft()\">\n <mat-icon svgIcon=\"gio:arrow-left\"></mat-icon>\n <span>Move left</span>\n </button>\n }\n</mat-menu>\n", styles: ["@charset \"UTF-8\";.gio-top-bar-menu .gio-badge-accent{background-color:var(--gio-oem-palette--active, #ffc2ac);color:var(--gio-oem-palette--active-contrast, #1e1b1b)}:host{display:flex;align-items:center;padding:8px;border:1px solid #da3b00;border-radius:8px}:host-context(.disabled){border:1px solid rgba(210,206,205,0);background-color:#f7f7f8;opacity:.5;text-decoration:line-through}.info{display:flex;max-width:300px;flex-direction:column;margin-left:4px;gap:4px}.info__head{display:flex;align-items:center}.info__head__icon{min-width:24px;flex:1 1 24px;margin-right:8px}.info__head__name{overflow:hidden;flex:1 1 auto;text-overflow:ellipsis;white-space:nowrap}.info__description{font-size:12px;font-weight:400;line-height:16px;font-family:Manrope,sans-serif;letter-spacing:normal;display:-webkit-box;overflow:hidden;-webkit-box-orient:vertical;color:#322f2f;-webkit-line-clamp:2}.info__description:empty{display:none}\n"], dependencies: [{ kind: "ngmodule", type: GioIconsModule }, { kind: "component", type:
|
|
1937
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.3", type: GioPolicyStudioDetailsPhaseStepComponent, isStandalone: true, selector: "gio-ps-flow-details-phase-step", inputs: { readOnly: "readOnly", step: "step", genericPolicies: "genericPolicies", flowPhase: "flowPhase", apiType: "apiType", disableMoveRight: "disableMoveRight", disableMoveLeft: "disableMoveLeft" }, outputs: { stepChange: "stepChange", deleted: "deleted", disabled: "disabled", duplicated: "duplicated", movedRight: "movedRight", movedLeft: "movedLeft" }, usesOnChanges: true, ngImport: i0, template: "<!--\n\n Copyright (C) 2025 The Gravitee team (http://gravitee.io)\n \n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n \n http://www.apache.org/licenses/LICENSE-2.0\n \n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n-->\n\n<div class=\"info\">\n <div class=\"info__head\">\n <mat-icon class=\"info__head__icon\" [svgIcon]=\"genericPolicy?.icon ?? 'gio:puzzle'\"></mat-icon>\n\n @if (step.name) {\n <span class=\"info__head__name\">{{ step.name }}</span>\n }\n\n @if (genericPolicy?.type === 'SHARED_POLICY_GROUP') {\n <span class=\"gio-badge-neutral\" matTooltip=\"Shared Policy Group\">\n <mat-icon svgIcon=\"gio:users\"></mat-icon>\n </span>\n }\n @if (getPrerequisiteMessage) {\n <mat-icon class=\"info__head__info\" svgIcon=\"gio:info\" [matTooltip]=\"getPrerequisiteMessage\"></mat-icon>\n }\n @if (policyNotFound !== false) {\n <span\n class=\"gio-badge-error\"\n [matTooltip]=\"policyNotFound === 'SHARED_POLICY_GROUP' ? 'Shared Policy Group not found' : 'Policy not found'\"\n >\n @if (policyNotFound === 'SHARED_POLICY_GROUP') {\n <mat-icon svgIcon=\"gio:users\"></mat-icon> \n }\n <mat-icon svgIcon=\"gio:alert-circle\"></mat-icon>\n </span>\n }\n </div>\n\n @if (step.description) {\n <div class=\"info__description\">{{ step.description }}</div>\n }\n</div>\n\n<button class=\"menuBtn\" mat-icon-button [matMenuTriggerFor]=\"policyMenu\"><mat-icon svgIcon=\"gio:more-vertical\"></mat-icon></button>\n\n<mat-menu #policyMenu=\"matMenu\">\n <button mat-menu-item (click)=\"onEditOrView()\">\n <mat-icon [svgIcon]=\"readOnly ? 'gio:eye-empty' : 'gio:edit-pencil'\"></mat-icon>\n <span>{{ readOnly ? 'View' : 'Edit' }}</span>\n </button>\n\n <button [disabled]=\"readOnly\" mat-menu-item (click)=\"onDisable()\">\n <mat-icon [svgIcon]=\"step.enabled ? 'gio:prohibition' : 'gio:check-circled-outline'\"></mat-icon>\n <span>{{ step.enabled ? 'Disable' : 'Enable' }}</span>\n </button>\n\n <button [disabled]=\"readOnly\" mat-menu-item (click)=\"onDelete()\">\n <mat-icon svgIcon=\"gio:trash\"></mat-icon>\n <span>Delete</span>\n </button>\n <button [disabled]=\"readOnly\" mat-menu-item (click)=\"onDuplicate()\">\n <mat-icon svgIcon=\"gio:copy\"></mat-icon>\n <span>Duplicate</span>\n </button>\n @if (disableMoveRight) {\n <button [disabled]=\"readOnly\" mat-menu-item (click)=\"onMoveRight()\">\n <mat-icon svgIcon=\"gio:arrow-right\"></mat-icon>\n <span>Move right</span>\n </button>\n }\n @if (disableMoveLeft) {\n <button [disabled]=\"readOnly\" mat-menu-item (click)=\"onMoveLeft()\">\n <mat-icon svgIcon=\"gio:arrow-left\"></mat-icon>\n <span>Move left</span>\n </button>\n }\n</mat-menu>\n", styles: ["@charset \"UTF-8\";.gio-top-bar-menu .gio-badge-accent{background-color:var(--gio-oem-palette--active, #ffc2ac);color:var(--gio-oem-palette--active-contrast, #1e1b1b)}:host{display:flex;align-items:center;padding:8px;border:1px solid #da3b00;border-radius:8px}:host-context(.disabled){border:1px solid rgba(210,206,205,0);background-color:#f7f7f8;opacity:.5;text-decoration:line-through}.info{display:flex;max-width:300px;flex-direction:column;margin-left:4px;gap:4px}.info__head{display:flex;align-items:center}.info__head__icon{min-width:24px;flex:1 1 24px;margin-right:8px}.info__head__name{overflow:hidden;flex:1 1 auto;text-overflow:ellipsis;white-space:nowrap}.info__description{font-size:12px;font-weight:400;line-height:16px;font-family:Manrope,sans-serif;letter-spacing:normal;display:-webkit-box;overflow:hidden;-webkit-box-orient:vertical;color:#322f2f;-webkit-line-clamp:2}.info__description:empty{display:none}\n"], dependencies: [{ kind: "ngmodule", type: GioIconsModule }, { kind: "component", type: i6$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i3.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i7$1.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i7$1.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i7$1.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i2$1.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }] }); }
|
|
1733
1938
|
}
|
|
1734
1939
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: GioPolicyStudioDetailsPhaseStepComponent, decorators: [{
|
|
1735
1940
|
type: Component,
|
|
@@ -1897,7 +2102,7 @@ class GioPolicyStudioDetailsPhaseComponent {
|
|
|
1897
2102
|
this.stepsChange.emit([...this.steps.slice(0, index - 1), this.steps[index], this.steps[index - 1], ...this.steps.slice(index + 1)]);
|
|
1898
2103
|
}
|
|
1899
2104
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: GioPolicyStudioDetailsPhaseComponent, deps: [{ token: i1.MatDialog }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
1900
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.3", type: GioPolicyStudioDetailsPhaseComponent, isStandalone: true, selector: "gio-ps-flow-details-phase", inputs: { readOnly: "readOnly", steps: "steps", name: "name", description: "description", startConnector: "startConnector", endConnector: "endConnector", apiType: "apiType", genericPolicies: "genericPolicies", policyFlowPhase: "policyFlowPhase", trialUrl: "trialUrl", disabledNotYetAvailable: "disabledNotYetAvailable" }, outputs: { stepsChange: "stepsChange" }, usesOnChanges: true, ngImport: i0, template: "<!--\n\n Copyright (C) 2025 The Gravitee team (http://gravitee.io)\n \n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n \n http://www.apache.org/licenses/LICENSE-2.0\n \n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n-->\n\n<div class=\"header\">\n <span class=\"header__name\">\n {{ name }}\n </span>\n <span class=\"header__description\">\n {{ description }}\n </span>\n\n @if (!hasStartAndEndConnectors && !disabledNotYetAvailable) {\n <span class=\"header__infoIcon\" matTooltip=\"Policies might not be evaluated\" matTooltipPosition=\"before\">\n <mat-icon svgIcon=\"gio:info\"></mat-icon>\n </span>\n }\n</div>\n\n@if (disabledNotYetAvailable) {\n <div class=\"disabledContent\">\n <gio-banner-info>\n Coming soon\n <span gioBannerBody> This feature is not yet available in the current version of the API Studio. Stay tuned for updates. </span>\n </gio-banner-info>\n </div>\n} @else if (hasStartAndEndConnectors) {\n <div class=\"wrapper\">\n <div class=\"content\">\n @for (stepVM of stepsVM; track stepVM._id; let isFirst = $first) {\n <div class=\"content__step\">\n <!-- Connector -->\n @if (stepVM.type === 'connectors') {\n <div class=\"content__step__connector\">\n @for (connector of stepVM.connectors; track connector) {\n <span class=\"gio-badge-white content__step__connector__badge\">\n @if (connector.icon) {\n <mat-icon [svgIcon]=\"connector.icon\" class=\"content__step__connector__badge__icon\"></mat-icon>\n }\n {{ connector.name }}\n </span>\n }\n </div>\n <!-- Add policy button after first connector -->\n @if (isFirst) {\n <mat-icon class=\"content__step__rightArrow\" svgIcon=\"gio:arrow-right\"></mat-icon>\n <button [disabled]=\"readOnly\" class=\"content__step__addBtn\" mat-button (click)=\"onAddPolicy(-1)\">\n <mat-icon svgIcon=\"gio:plus\"></mat-icon>\n </button>\n <mat-icon class=\"content__step__rightArrow\" svgIcon=\"gio:arrow-right\"></mat-icon>\n }\n }\n\n <!-- Policy -->\n @if (stepVM.type === 'step') {\n <div class=\"content__step__policy\">\n @if (stepVM.step?.condition) {\n <div class=\"content__step__policy__condition\" [class.disabled]=\"!stepVM.step.enabled\">\n <span class=\"gio-badge-neutral\" [matTooltip]=\"'Condition: ' + stepVM.step.condition\"\n ><mat-icon svgIcon=\"gio:if\"></mat-icon> {{ stepVM.step.condition }}</span\n >\n </div>\n }\n\n <gio-ps-flow-details-phase-step\n class=\"content__step__step\"\n [readOnly]=\"readOnly\"\n [class.disabled]=\"!stepVM.step.enabled\"\n [genericPolicies]=\"genericPolicies\"\n [step]=\"stepVM.step\"\n [flowPhase]=\"policyFlowPhase\"\n [apiType]=\"apiType\"\n (stepChange)=\"onStepChange(stepVM.index, $event)\"\n (deleted)=\"onStepDeleted(stepVM.index)\"\n (disabled)=\"onStepDisabled(stepVM.index)\"\n (duplicated)=\"onStepDuplicated(stepVM.index)\"\n [disableMoveRight]=\"stepVM.index !== this.steps.length - 1\"\n (movedRight)=\"onStepMovedRight(stepVM.index)\"\n [disableMoveLeft]=\"stepVM.index !== 0\"\n (movedLeft)=\"onStepMovedLeft(stepVM.index)\"\n ></gio-ps-flow-details-phase-step>\n </div>\n\n <!-- Add policy button -->\n <mat-icon class=\"content__step__rightArrow\" svgIcon=\"gio:arrow-right\"></mat-icon>\n <button [disabled]=\"readOnly\" class=\"content__step__addBtn\" mat-button (click)=\"onAddPolicy(stepVM.index)\">\n <mat-icon svgIcon=\"gio:plus\"></mat-icon>\n </button>\n <mat-icon class=\"content__step__rightArrow\" svgIcon=\"gio:arrow-right\"></mat-icon>\n }\n </div>\n }\n </div>\n </div>\n} @else {\n <div class=\"disabledContent\">\n <gio-banner-warning>\n Policies might not be evaluated\n <span gioBannerBody>\n Your current flow settings are not applicable to this phase. Select supporting endpoints and operations in the flow configuration to\n enable this phase.\n </span>\n </gio-banner-warning>\n </div>\n}\n", styles: ["@charset \"UTF-8\";.gio-top-bar-menu .gio-badge-accent{background-color:var(--gio-oem-palette--active, #ffc2ac);color:var(--gio-oem-palette--active-contrast, #1e1b1b)}:host{display:flex;overflow:hidden;min-height:215px;flex-direction:column;padding-top:16px;border:1px solid #d2cecd;border-radius:8px;background-color:#fff}.header{display:flex;padding:0 16px;gap:8px}.header__name{flex:0 1 auto;font-size:14px;font-weight:700;line-height:20px;font-family:Manrope,sans-serif;letter-spacing:.4px}.header__description{flex:1 1 auto;font-size:14px;font-weight:500;line-height:22px;font-family:Manrope,sans-serif;letter-spacing:.4px;color:#322f2f}.wrapper{position:relative;flex:1 1 auto;overflow-y:auto}.content{position:absolute;display:flex;width:max-content;height:100%;align-items:center;padding:0 16px}.content__step{display:flex;align-items:center}.content__step__connector{display:flex;flex-direction:column;gap:8px}.content__step__connector__badge{border:1px solid #ffa685;border-radius:16px}.content__step__connector__badge__icon{margin-right:4px}.content__step__rightArrow{width:16px;height:16px;margin:0 8px;color:#b2aaa9}.content__step__policy{position:relative;display:flex;flex-direction:row;align-items:center}.content__step__policy__condition{position:absolute;top:-32px;right:0;left:0;display:flex;flex-direction:column}.content__step__policy__condition.disabled{opacity:.5;text-decoration:line-through}.content__step__policy__condition span{display:inline-block;overflow:hidden;text-overflow:ellipsis;text-transform:none;white-space:nowrap}.content__step__policy__condition span mat-icon{margin-right:4px}.disabledContent{display:flex;flex-direction:column;padding:16px}\n"], dependencies: [{ kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i2$
|
|
2105
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.3", type: GioPolicyStudioDetailsPhaseComponent, isStandalone: true, selector: "gio-ps-flow-details-phase", inputs: { readOnly: "readOnly", steps: "steps", name: "name", description: "description", startConnector: "startConnector", endConnector: "endConnector", apiType: "apiType", genericPolicies: "genericPolicies", policyFlowPhase: "policyFlowPhase", trialUrl: "trialUrl", disabledNotYetAvailable: "disabledNotYetAvailable" }, outputs: { stepsChange: "stepsChange" }, usesOnChanges: true, ngImport: i0, template: "<!--\n\n Copyright (C) 2025 The Gravitee team (http://gravitee.io)\n \n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n \n http://www.apache.org/licenses/LICENSE-2.0\n \n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n-->\n\n<div class=\"header\">\n <span class=\"header__name\">\n {{ name }}\n </span>\n <span class=\"header__description\">\n {{ description }}\n </span>\n\n @if (!hasStartAndEndConnectors && !disabledNotYetAvailable) {\n <span class=\"header__infoIcon\" matTooltip=\"Policies might not be evaluated\" matTooltipPosition=\"before\">\n <mat-icon svgIcon=\"gio:info\"></mat-icon>\n </span>\n }\n</div>\n\n@if (disabledNotYetAvailable) {\n <div class=\"disabledContent\">\n <gio-banner-info>\n Coming soon\n <span gioBannerBody> This feature is not yet available in the current version of the API Studio. Stay tuned for updates. </span>\n </gio-banner-info>\n </div>\n} @else if (hasStartAndEndConnectors) {\n <div class=\"wrapper\">\n <div class=\"content\">\n @for (stepVM of stepsVM; track stepVM._id; let isFirst = $first) {\n <div class=\"content__step\">\n <!-- Connector -->\n @if (stepVM.type === 'connectors') {\n <div class=\"content__step__connector\">\n @for (connector of stepVM.connectors; track connector) {\n <span class=\"gio-badge-white content__step__connector__badge\">\n @if (connector.icon) {\n <mat-icon [svgIcon]=\"connector.icon\" class=\"content__step__connector__badge__icon\"></mat-icon>\n }\n {{ connector.name }}\n </span>\n }\n </div>\n <!-- Add policy button after first connector -->\n @if (isFirst) {\n <mat-icon class=\"content__step__rightArrow\" svgIcon=\"gio:arrow-right\"></mat-icon>\n <button [disabled]=\"readOnly\" class=\"content__step__addBtn\" mat-button (click)=\"onAddPolicy(-1)\">\n <mat-icon svgIcon=\"gio:plus\"></mat-icon>\n </button>\n <mat-icon class=\"content__step__rightArrow\" svgIcon=\"gio:arrow-right\"></mat-icon>\n }\n }\n\n <!-- Policy -->\n @if (stepVM.type === 'step') {\n <div class=\"content__step__policy\">\n @if (stepVM.step?.condition) {\n <div class=\"content__step__policy__condition\" [class.disabled]=\"!stepVM.step.enabled\">\n <span class=\"gio-badge-neutral\" [matTooltip]=\"'Condition: ' + stepVM.step.condition\"\n ><mat-icon svgIcon=\"gio:if\"></mat-icon> {{ stepVM.step.condition }}</span\n >\n </div>\n }\n\n <gio-ps-flow-details-phase-step\n class=\"content__step__step\"\n [readOnly]=\"readOnly\"\n [class.disabled]=\"!stepVM.step.enabled\"\n [genericPolicies]=\"genericPolicies\"\n [step]=\"stepVM.step\"\n [flowPhase]=\"policyFlowPhase\"\n [apiType]=\"apiType\"\n (stepChange)=\"onStepChange(stepVM.index, $event)\"\n (deleted)=\"onStepDeleted(stepVM.index)\"\n (disabled)=\"onStepDisabled(stepVM.index)\"\n (duplicated)=\"onStepDuplicated(stepVM.index)\"\n [disableMoveRight]=\"stepVM.index !== this.steps.length - 1\"\n (movedRight)=\"onStepMovedRight(stepVM.index)\"\n [disableMoveLeft]=\"stepVM.index !== 0\"\n (movedLeft)=\"onStepMovedLeft(stepVM.index)\"\n ></gio-ps-flow-details-phase-step>\n </div>\n\n <!-- Add policy button -->\n <mat-icon class=\"content__step__rightArrow\" svgIcon=\"gio:arrow-right\"></mat-icon>\n <button [disabled]=\"readOnly\" class=\"content__step__addBtn\" mat-button (click)=\"onAddPolicy(stepVM.index)\">\n <mat-icon svgIcon=\"gio:plus\"></mat-icon>\n </button>\n <mat-icon class=\"content__step__rightArrow\" svgIcon=\"gio:arrow-right\"></mat-icon>\n }\n </div>\n }\n </div>\n </div>\n} @else {\n <div class=\"disabledContent\">\n <gio-banner-warning>\n Policies might not be evaluated\n <span gioBannerBody>\n Your current flow settings are not applicable to this phase. Select supporting endpoints and operations in the flow configuration to\n enable this phase.\n </span>\n </gio-banner-warning>\n </div>\n}\n", styles: ["@charset \"UTF-8\";.gio-top-bar-menu .gio-badge-accent{background-color:var(--gio-oem-palette--active, #ffc2ac);color:var(--gio-oem-palette--active-contrast, #1e1b1b)}:host{display:flex;overflow:hidden;min-height:215px;flex-direction:column;padding-top:16px;border:1px solid #d2cecd;border-radius:8px;background-color:#fff}.header{display:flex;padding:0 16px;gap:8px}.header__name{flex:0 1 auto;font-size:14px;font-weight:700;line-height:20px;font-family:Manrope,sans-serif;letter-spacing:.4px}.header__description{flex:1 1 auto;font-size:14px;font-weight:500;line-height:22px;font-family:Manrope,sans-serif;letter-spacing:.4px;color:#322f2f}.wrapper{position:relative;flex:1 1 auto;overflow-y:auto}.content{position:absolute;display:flex;width:max-content;height:100%;align-items:center;padding:0 16px}.content__step{display:flex;align-items:center}.content__step__connector{display:flex;flex-direction:column;gap:8px}.content__step__connector__badge{border:1px solid #ffa685;border-radius:16px}.content__step__connector__badge__icon{margin-right:4px}.content__step__rightArrow{width:16px;height:16px;margin:0 8px;color:#b2aaa9}.content__step__policy{position:relative;display:flex;flex-direction:row;align-items:center}.content__step__policy__condition{position:absolute;top:-32px;right:0;left:0;display:flex;flex-direction:column}.content__step__policy__condition.disabled{opacity:.5;text-decoration:line-through}.content__step__policy__condition span{display:inline-block;overflow:hidden;text-overflow:ellipsis;text-transform:none;white-space:nowrap}.content__step__policy__condition span mat-icon{margin-right:4px}.disabledContent{display:flex;flex-direction:column;padding:16px}\n"], dependencies: [{ kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i2$1.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i3.MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: GioPolicyStudioDetailsPhaseStepComponent, selector: "gio-ps-flow-details-phase-step", inputs: ["readOnly", "step", "genericPolicies", "flowPhase", "apiType", "disableMoveRight", "disableMoveLeft"], outputs: ["stepChange", "deleted", "disabled", "duplicated", "movedRight", "movedLeft"] }, { kind: "ngmodule", type: GioIconsModule }, { kind: "component", type: i6$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: GioBannerModule }, { kind: "component", type: i7.GioBannerInfoComponent, selector: "gio-banner-info" }, { kind: "component", type: i7.GioBannerWarningComponent, selector: "gio-banner-warning" }, { kind: "directive", type: i7.GioBannerBodyDirective, selector: "[gioBannerBody]" }] }); }
|
|
1901
2106
|
}
|
|
1902
2107
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: GioPolicyStudioDetailsPhaseComponent, decorators: [{
|
|
1903
2108
|
type: Component,
|
|
@@ -2079,12 +2284,27 @@ class GioPolicyStudioDetailsInfoBarComponent {
|
|
|
2079
2284
|
}
|
|
2080
2285
|
return this._mcpMethods === null ? undefined : this._mcpMethods;
|
|
2081
2286
|
}
|
|
2287
|
+
// LLM Proxy API
|
|
2288
|
+
get llmMethods() {
|
|
2289
|
+
if (this._llmMethods === undefined && this.flow) {
|
|
2290
|
+
//TODO need to add the type of the LLM selector
|
|
2291
|
+
const llmSelector = this.flow.selectors?.find(s => s.type === 'LLM');
|
|
2292
|
+
if (!llmSelector) {
|
|
2293
|
+
this._llmMethods = null; // Cache null to avoid recomputation
|
|
2294
|
+
return undefined;
|
|
2295
|
+
}
|
|
2296
|
+
this._llmMethods = llmSelector?.methods?.length
|
|
2297
|
+
? llmSelector.methods.map(m => ({ name: m, class: `gio-badge-neutral` }))
|
|
2298
|
+
: [{ name: 'All Methods', class: 'gio-badge-neutral' }];
|
|
2299
|
+
}
|
|
2300
|
+
return this._llmMethods === null ? undefined : this._llmMethods;
|
|
2301
|
+
}
|
|
2082
2302
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: GioPolicyStudioDetailsInfoBarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
2083
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.3", type: GioPolicyStudioDetailsInfoBarComponent, isStandalone: true, selector: "gio-ps-flow-details-info-bar", inputs: { flow: "flow", entrypointsInfo: "entrypointsInfo" }, usesOnChanges: true, ngImport: i0, template: "<!--\n\n Copyright (C) 2025 The Gravitee team (http://gravitee.io)\n \n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n \n http://www.apache.org/licenses/LICENSE-2.0\n \n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n-->\n@if (flow?.name) {\n <div class=\"info\">\n <span class=\"info__label\">Name</span>\n <span class=\"info__value strong\">{{ flow?.name }}</span>\n </div>\n}\n\n@if (entrypoints) {\n <div class=\"info\">\n <span class=\"info__label\">Entrypoints</span>\n @for (entrypoint of entrypoints; track entrypoint) {\n <span class=\"info__value gio-badge gio-badge-neutral\">\n <mat-icon [svgIcon]=\"entrypoint.icon\"></mat-icon>\n {{ entrypoint.name }}</span\n >\n }\n </div>\n}\n\n<!-- MESSAGE API type -->\n\n@if (operations) {\n <div class=\"info\">\n <span class=\"info__label\">Operations</span>\n @for (operation of operations; track operation) {\n <span class=\"info__value gio-badge-neutral\"> {{ operation }}</span>\n }\n </div>\n}\n\n@if (channel) {\n <div class=\"info\">\n <span class=\"info__label\">Channel</span>\n <span class=\"info__value strong\">{{ channel }}</span>\n </div>\n}\n\n@if (channelOperator) {\n <div class=\"info\">\n <span class=\"info__label\">Channel Operator</span>\n <span class=\"info__value gio-badge-neutral\">{{ channelOperator }}</span>\n </div>\n}\n\n<!-- PROXY API type -->\n\n@if (path) {\n <div class=\"info\">\n <span class=\"info__label\">Path</span>\n <span class=\"info__value strong\">{{ path }}</span>\n </div>\n}\n\n@if (pathOperator) {\n <div class=\"info\">\n <span class=\"info__label\">Path Operator</span>\n <span class=\"info__value gio-badge-neutral\">{{ pathOperator }}</span>\n </div>\n}\n\n@if (methods) {\n <div class=\"info\">\n <span class=\"info__label\">HTTP methods</span>\n @for (method of methods; track method) {\n <span class=\"info__value method\" [ngClass]=\"method.class\"> {{ method.name }}</span>\n }\n </div>\n}\n\n<!-- Mcp Methods-->\n@if (mcpMethods) {\n <div class=\"info\">\n <span class=\"info__label\">MCP Methods</span>\n @for (mcpMethod of mcpMethods; track mcpMethod.name) {\n <span class=\"info__value\" [ngClass]=\"mcpMethod.class\">{{ mcpMethod.name }}</span>\n }\n </div>\n}\n\n<!-- Condition -->\n
|
|
2303
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.3", type: GioPolicyStudioDetailsInfoBarComponent, isStandalone: true, selector: "gio-ps-flow-details-info-bar", inputs: { flow: "flow", entrypointsInfo: "entrypointsInfo" }, usesOnChanges: true, ngImport: i0, template: "<!--\n\n Copyright (C) 2025 The Gravitee team (http://gravitee.io)\n \n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n \n http://www.apache.org/licenses/LICENSE-2.0\n \n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n-->\n@if (flow?.name) {\n <div class=\"info\">\n <span class=\"info__label\">Name</span>\n <span class=\"info__value strong\">{{ flow?.name }}</span>\n </div>\n}\n\n@if (entrypoints) {\n <div class=\"info\">\n <span class=\"info__label\">Entrypoints</span>\n @for (entrypoint of entrypoints; track entrypoint) {\n <span class=\"info__value gio-badge gio-badge-neutral\">\n <mat-icon [svgIcon]=\"entrypoint.icon\"></mat-icon>\n {{ entrypoint.name }}</span\n >\n }\n </div>\n}\n\n<!-- MESSAGE API type -->\n\n@if (operations) {\n <div class=\"info\">\n <span class=\"info__label\">Operations</span>\n @for (operation of operations; track operation) {\n <span class=\"info__value gio-badge-neutral\"> {{ operation }}</span>\n }\n </div>\n}\n\n@if (channel) {\n <div class=\"info\">\n <span class=\"info__label\">Channel</span>\n <span class=\"info__value strong\">{{ channel }}</span>\n </div>\n}\n\n@if (channelOperator) {\n <div class=\"info\">\n <span class=\"info__label\">Channel Operator</span>\n <span class=\"info__value gio-badge-neutral\">{{ channelOperator }}</span>\n </div>\n}\n\n<!-- PROXY API type -->\n\n@if (path) {\n <div class=\"info\">\n <span class=\"info__label\">Path</span>\n <span class=\"info__value strong\">{{ path }}</span>\n </div>\n}\n\n@if (pathOperator) {\n <div class=\"info\">\n <span class=\"info__label\">Path Operator</span>\n <span class=\"info__value gio-badge-neutral\">{{ pathOperator }}</span>\n </div>\n}\n\n@if (methods) {\n <div class=\"info\">\n <span class=\"info__label\">HTTP methods</span>\n @for (method of methods; track method) {\n <span class=\"info__value method\" [ngClass]=\"method.class\"> {{ method.name }}</span>\n }\n </div>\n}\n\n<!-- Mcp Methods-->\n@if (mcpMethods) {\n <div class=\"info\">\n <span class=\"info__label\">MCP Methods</span>\n @for (mcpMethod of mcpMethods; track mcpMethod.name) {\n <span class=\"info__value\" [ngClass]=\"mcpMethod.class\">{{ mcpMethod.name }}</span>\n }\n </div>\n}\n@if (llmMethods) {\n <div class=\"info\">\n <span class=\"info__label\">LLM Methods</span>\n @for (llmMethod of llmMethods; track llmMethod.name) {\n <span class=\"info__value\" [ngClass]=\"llmMethod.class\">{{ llmMethod.name }}</span>\n }\n </div>\n}\n\n<!-- Condition -->\n@if (condition) {\n <div class=\"info\">\n <span class=\"info__label\">Condition</span>\n <span class=\"info__value gio-badge-neutral condition\">{{ condition }}</span>\n </div>\n}\n", styles: ["@charset \"UTF-8\";.gio-top-bar-menu .gio-badge-accent{background-color:var(--gio-oem-palette--active, #ffc2ac);color:var(--gio-oem-palette--active-contrast, #1e1b1b)}:host{display:flex;flex-flow:row wrap;padding:16px;gap:12px}.info__label{font-size:14px;font-weight:500;line-height:22px;font-family:Manrope,sans-serif;letter-spacing:.4px;color:#322f2f}.info__value.strong{padding-left:8px;font-size:14px;font-weight:700;line-height:20px;font-family:Manrope,sans-serif;letter-spacing:.4px}.info__value.method{width:auto}.info__value.gio-badge mat-icon{margin-right:4px}.info__value.condition{text-transform:none}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i5$2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: GioIconsModule }, { kind: "component", type: i6$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatCommonModule }] }); }
|
|
2084
2304
|
}
|
|
2085
2305
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: GioPolicyStudioDetailsInfoBarComponent, decorators: [{
|
|
2086
2306
|
type: Component,
|
|
2087
|
-
args: [{ imports: [CommonModule, GioIconsModule, MatCommonModule], selector: 'gio-ps-flow-details-info-bar', template: "<!--\n\n Copyright (C) 2025 The Gravitee team (http://gravitee.io)\n \n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n \n http://www.apache.org/licenses/LICENSE-2.0\n \n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n-->\n@if (flow?.name) {\n <div class=\"info\">\n <span class=\"info__label\">Name</span>\n <span class=\"info__value strong\">{{ flow?.name }}</span>\n </div>\n}\n\n@if (entrypoints) {\n <div class=\"info\">\n <span class=\"info__label\">Entrypoints</span>\n @for (entrypoint of entrypoints; track entrypoint) {\n <span class=\"info__value gio-badge gio-badge-neutral\">\n <mat-icon [svgIcon]=\"entrypoint.icon\"></mat-icon>\n {{ entrypoint.name }}</span\n >\n }\n </div>\n}\n\n<!-- MESSAGE API type -->\n\n@if (operations) {\n <div class=\"info\">\n <span class=\"info__label\">Operations</span>\n @for (operation of operations; track operation) {\n <span class=\"info__value gio-badge-neutral\"> {{ operation }}</span>\n }\n </div>\n}\n\n@if (channel) {\n <div class=\"info\">\n <span class=\"info__label\">Channel</span>\n <span class=\"info__value strong\">{{ channel }}</span>\n </div>\n}\n\n@if (channelOperator) {\n <div class=\"info\">\n <span class=\"info__label\">Channel Operator</span>\n <span class=\"info__value gio-badge-neutral\">{{ channelOperator }}</span>\n </div>\n}\n\n<!-- PROXY API type -->\n\n@if (path) {\n <div class=\"info\">\n <span class=\"info__label\">Path</span>\n <span class=\"info__value strong\">{{ path }}</span>\n </div>\n}\n\n@if (pathOperator) {\n <div class=\"info\">\n <span class=\"info__label\">Path Operator</span>\n <span class=\"info__value gio-badge-neutral\">{{ pathOperator }}</span>\n </div>\n}\n\n@if (methods) {\n <div class=\"info\">\n <span class=\"info__label\">HTTP methods</span>\n @for (method of methods; track method) {\n <span class=\"info__value method\" [ngClass]=\"method.class\"> {{ method.name }}</span>\n }\n </div>\n}\n\n<!-- Mcp Methods-->\n@if (mcpMethods) {\n <div class=\"info\">\n <span class=\"info__label\">MCP Methods</span>\n @for (mcpMethod of mcpMethods; track mcpMethod.name) {\n <span class=\"info__value\" [ngClass]=\"mcpMethod.class\">{{ mcpMethod.name }}</span>\n }\n </div>\n}\n\n<!-- Condition -->\n
|
|
2307
|
+
args: [{ imports: [CommonModule, GioIconsModule, MatCommonModule], selector: 'gio-ps-flow-details-info-bar', template: "<!--\n\n Copyright (C) 2025 The Gravitee team (http://gravitee.io)\n \n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n \n http://www.apache.org/licenses/LICENSE-2.0\n \n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n-->\n@if (flow?.name) {\n <div class=\"info\">\n <span class=\"info__label\">Name</span>\n <span class=\"info__value strong\">{{ flow?.name }}</span>\n </div>\n}\n\n@if (entrypoints) {\n <div class=\"info\">\n <span class=\"info__label\">Entrypoints</span>\n @for (entrypoint of entrypoints; track entrypoint) {\n <span class=\"info__value gio-badge gio-badge-neutral\">\n <mat-icon [svgIcon]=\"entrypoint.icon\"></mat-icon>\n {{ entrypoint.name }}</span\n >\n }\n </div>\n}\n\n<!-- MESSAGE API type -->\n\n@if (operations) {\n <div class=\"info\">\n <span class=\"info__label\">Operations</span>\n @for (operation of operations; track operation) {\n <span class=\"info__value gio-badge-neutral\"> {{ operation }}</span>\n }\n </div>\n}\n\n@if (channel) {\n <div class=\"info\">\n <span class=\"info__label\">Channel</span>\n <span class=\"info__value strong\">{{ channel }}</span>\n </div>\n}\n\n@if (channelOperator) {\n <div class=\"info\">\n <span class=\"info__label\">Channel Operator</span>\n <span class=\"info__value gio-badge-neutral\">{{ channelOperator }}</span>\n </div>\n}\n\n<!-- PROXY API type -->\n\n@if (path) {\n <div class=\"info\">\n <span class=\"info__label\">Path</span>\n <span class=\"info__value strong\">{{ path }}</span>\n </div>\n}\n\n@if (pathOperator) {\n <div class=\"info\">\n <span class=\"info__label\">Path Operator</span>\n <span class=\"info__value gio-badge-neutral\">{{ pathOperator }}</span>\n </div>\n}\n\n@if (methods) {\n <div class=\"info\">\n <span class=\"info__label\">HTTP methods</span>\n @for (method of methods; track method) {\n <span class=\"info__value method\" [ngClass]=\"method.class\"> {{ method.name }}</span>\n }\n </div>\n}\n\n<!-- Mcp Methods-->\n@if (mcpMethods) {\n <div class=\"info\">\n <span class=\"info__label\">MCP Methods</span>\n @for (mcpMethod of mcpMethods; track mcpMethod.name) {\n <span class=\"info__value\" [ngClass]=\"mcpMethod.class\">{{ mcpMethod.name }}</span>\n }\n </div>\n}\n@if (llmMethods) {\n <div class=\"info\">\n <span class=\"info__label\">LLM Methods</span>\n @for (llmMethod of llmMethods; track llmMethod.name) {\n <span class=\"info__value\" [ngClass]=\"llmMethod.class\">{{ llmMethod.name }}</span>\n }\n </div>\n}\n\n<!-- Condition -->\n@if (condition) {\n <div class=\"info\">\n <span class=\"info__label\">Condition</span>\n <span class=\"info__value gio-badge-neutral condition\">{{ condition }}</span>\n </div>\n}\n", styles: ["@charset \"UTF-8\";.gio-top-bar-menu .gio-badge-accent{background-color:var(--gio-oem-palette--active, #ffc2ac);color:var(--gio-oem-palette--active-contrast, #1e1b1b)}:host{display:flex;flex-flow:row wrap;padding:16px;gap:12px}.info__label{font-size:14px;font-weight:500;line-height:22px;font-family:Manrope,sans-serif;letter-spacing:.4px;color:#322f2f}.info__value.strong{padding-left:8px;font-size:14px;font-weight:700;line-height:20px;font-family:Manrope,sans-serif;letter-spacing:.4px}.info__value.method{width:auto}.info__value.gio-badge mat-icon{margin-right:4px}.info__value.condition{text-transform:none}\n"] }]
|
|
2088
2308
|
}], propDecorators: { flow: [{
|
|
2089
2309
|
type: Input
|
|
2090
2310
|
}], entrypointsInfo: [{
|
|
@@ -2190,6 +2410,19 @@ class GioPolicyStudioDetailsComponent {
|
|
|
2190
2410
|
})
|
|
2191
2411
|
.afterClosed();
|
|
2192
2412
|
break;
|
|
2413
|
+
case 'LLM_PROXY':
|
|
2414
|
+
dialogResult = this.matDialog
|
|
2415
|
+
.open(GioPolicyStudioFlowLlmFormDialogComponent, {
|
|
2416
|
+
data: {
|
|
2417
|
+
parentGroupName: this.flow._parentFlowGroupName,
|
|
2418
|
+
flow: this.flow,
|
|
2419
|
+
},
|
|
2420
|
+
role: 'alertdialog',
|
|
2421
|
+
id: 'gioPsFlowFormDialog',
|
|
2422
|
+
width: GIO_DIALOG_WIDTH.MEDIUM,
|
|
2423
|
+
})
|
|
2424
|
+
.afterClosed();
|
|
2425
|
+
break;
|
|
2193
2426
|
default:
|
|
2194
2427
|
throw new Error(`Unsupported API type ${this.apiType}`);
|
|
2195
2428
|
}
|
|
@@ -2226,7 +2459,7 @@ class GioPolicyStudioDetailsComponent {
|
|
|
2226
2459
|
});
|
|
2227
2460
|
}
|
|
2228
2461
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: GioPolicyStudioDetailsComponent, deps: [{ token: i1.MatDialog }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
2229
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.3", type: GioPolicyStudioDetailsComponent, isStandalone: true, selector: "gio-ps-flow-details", inputs: { readOnly: "readOnly", loading: "loading", apiType: "apiType", flow: "flow", entrypointsInfo: "entrypointsInfo", endpointsInfo: "endpointsInfo", policies: "policies", genericPolicies: "genericPolicies", trialUrl: "trialUrl" }, outputs: { flowChange: "flowChange", deleteFlow: "deleteFlow" }, usesOnChanges: true, ngImport: i0, template: "<!--\n\n Copyright (C) 2025 The Gravitee team (http://gravitee.io)\n \n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n \n http://www.apache.org/licenses/LICENSE-2.0\n \n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n-->\n\n@if (!loading) {\n @if (flow) {\n <div class=\"header\">\n <div class=\"header__label\">\n Flow details\n @if (!flow.enabled) {\n <div class=\"gio-badge gio-badge-neutral\">Disabled</div>\n }\n </div>\n <div class=\"header__configBtn\">\n <button\n [disabled]=\"readOnly\"\n class=\"header__configBtn__enableDisable\"\n mat-stroked-button\n [matTooltip]=\"flow.enabled ? 'Disable' : 'Enable'\"\n (click)=\"onEnableDisableFlow()\"\n >\n <mat-icon [svgIcon]=\"flow.enabled ? 'gio:prohibition' : 'gio:check-circled-outline'\"></mat-icon>\n </button>\n <button [disabled]=\"readOnly\" class=\"header__configBtn__edit\" mat-stroked-button (click)=\"onEditFlow()\" matTooltip=\"Edit\">\n <mat-icon svgIcon=\"gio:edit-pencil\"></mat-icon>\n </button>\n <button [disabled]=\"readOnly\" class=\"header__configBtn__delete\" mat-stroked-button (click)=\"onDeleteFlow()\" matTooltip=\"Delete\">\n <mat-icon svgIcon=\"gio:trash\"></mat-icon>\n </button>\n </div>\n </div>\n <gio-ps-flow-details-info-bar\n class=\"infoBar\"\n [class.flowDisabled]=\"!flow.enabled\"\n [flow]=\"flow\"\n [entrypointsInfo]=\"entrypointsInfo\"\n ></gio-ps-flow-details-info-bar>\n\n <div class=\"content\" [class.flowDisabled]=\"!flow.enabled\">\n @if (apiType === 'MESSAGE') {\n <mat-tab-group class=\"content__tabs\" dynamicHeight>\n <mat-tab label=\"Initial connection\" bodyClass=\"content__tabs__body\">\n <gio-ps-flow-details-phase\n class=\"content__phase\"\n name=\"Request phase\"\n description=\"Policies will be applied during the connection establishment\"\n [readOnly]=\"readOnly\"\n [startConnector]=\"messageFlowEntrypointsInfo\"\n [endConnector]=\"endpointsInfo\"\n [steps]=\"flow.request ?? []\"\n [apiType]=\"apiType\"\n [genericPolicies]=\"genericPolicies\"\n [trialUrl]=\"trialUrl\"\n policyFlowPhase=\"REQUEST\"\n (stepsChange)=\"onStepsChange('request', $event)\"\n ></gio-ps-flow-details-phase>\n <gio-ps-flow-details-phase\n class=\"content__phase\"\n name=\"Response phase\"\n description=\"Policies will be applied to the response from the initial connection\"\n [readOnly]=\"readOnly\"\n [startConnector]=\"endpointsInfo\"\n [endConnector]=\"messageFlowEntrypointsInfo\"\n [steps]=\"flow.response ?? []\"\n [apiType]=\"apiType\"\n [genericPolicies]=\"genericPolicies\"\n [trialUrl]=\"trialUrl\"\n policyFlowPhase=\"RESPONSE\"\n (stepsChange)=\"onStepsChange('response', $event)\"\n ></gio-ps-flow-details-phase>\n </mat-tab>\n <mat-tab label=\"Event messages\" bodyClass=\"content__tabs__body\">\n <gio-ps-flow-details-phase\n class=\"content__phase\"\n name=\"Publish phase\"\n description=\"Policies will be applied on messages sent to the endpoint\"\n [readOnly]=\"readOnly\"\n [startConnector]=\"messageFlowEntrypointsInfo | gioFilterConnectorsByMode: 'PUBLISH' : operations\"\n [endConnector]=\"endpointsInfo | gioFilterConnectorsByMode: 'PUBLISH' : operations\"\n [steps]=\"flow.publish ?? []\"\n [apiType]=\"apiType\"\n [genericPolicies]=\"genericPolicies\"\n [trialUrl]=\"trialUrl\"\n policyFlowPhase=\"PUBLISH\"\n (stepsChange)=\"onStepsChange('publish', $event)\"\n ></gio-ps-flow-details-phase>\n <gio-ps-flow-details-phase\n class=\"content__phase\"\n name=\"Subscribe phase\"\n description=\"Policies will be applied on messages received by the entrypoint\"\n [readOnly]=\"readOnly\"\n [startConnector]=\"endpointsInfo | gioFilterConnectorsByMode: 'SUBSCRIBE' : operations\"\n [endConnector]=\"messageFlowEntrypointsInfo | gioFilterConnectorsByMode: 'SUBSCRIBE' : operations\"\n [steps]=\"flow.subscribe ?? []\"\n [apiType]=\"apiType\"\n [genericPolicies]=\"genericPolicies\"\n [trialUrl]=\"trialUrl\"\n policyFlowPhase=\"SUBSCRIBE\"\n (stepsChange)=\"onStepsChange('subscribe', $event)\"\n ></gio-ps-flow-details-phase>\n </mat-tab>\n </mat-tab-group>\n }\n\n @if (apiType === 'PROXY') {\n <gio-ps-flow-details-phase\n class=\"content__phase\"\n name=\"Request phase\"\n description=\"Policies will be applied during the connection establishment\"\n [readOnly]=\"readOnly\"\n [startConnector]=\"entrypointsInfo | gioFilterConnectorsByMode: 'REQUEST_RESPONSE'\"\n [endConnector]=\"endpointsInfo | gioFilterConnectorsByMode: 'REQUEST_RESPONSE'\"\n [steps]=\"flow.request ?? []\"\n [apiType]=\"apiType\"\n [genericPolicies]=\"genericPolicies\"\n [trialUrl]=\"trialUrl\"\n policyFlowPhase=\"REQUEST\"\n (stepsChange)=\"onStepsChange('request', $event)\"\n ></gio-ps-flow-details-phase>\n <gio-ps-flow-details-phase\n class=\"content__phase\"\n name=\"Response phase\"\n description=\"Policies will be applied during the connection termination\"\n [readOnly]=\"readOnly\"\n [startConnector]=\"endpointsInfo | gioFilterConnectorsByMode: 'REQUEST_RESPONSE'\"\n [endConnector]=\"entrypointsInfo | gioFilterConnectorsByMode: 'REQUEST_RESPONSE'\"\n [steps]=\"flow.response ?? []\"\n [apiType]=\"apiType\"\n [genericPolicies]=\"genericPolicies\"\n [trialUrl]=\"trialUrl\"\n policyFlowPhase=\"RESPONSE\"\n (stepsChange)=\"onStepsChange('response', $event)\"\n ></gio-ps-flow-details-phase>\n }\n\n @if (apiType === 'NATIVE') {\n <mat-tab-group class=\"content__tabs\" dynamicHeight>\n <mat-tab label=\"Global\" bodyClass=\"content__tabs__body\">\n <gio-ps-flow-details-phase\n class=\"content__phase\"\n name=\"Connect phase\"\n description=\"Policies will be applied when the client connects to the Gateway\"\n [disabledNotYetAvailable]=\"true\"\n [readOnly]=\"readOnly\"\n [startConnector]=\"endpointsInfo | gioFilterConnectorsByMode: 'CONNECT'\"\n [endConnector]=\"entrypointsInfo | gioFilterConnectorsByMode: 'CONNECT'\"\n [steps]=\"flow.connect ?? []\"\n [apiType]=\"apiType\"\n [genericPolicies]=\"genericPolicies\"\n [trialUrl]=\"trialUrl\"\n policyFlowPhase=\"CONNECT\"\n (stepsChange)=\"onStepsChange('connect', $event)\"\n >\n </gio-ps-flow-details-phase>\n <gio-ps-flow-details-phase\n class=\"content__phase\"\n name=\"Interact phase\"\n description=\"Policies will be applied on all interactions between the client and the Gateway\"\n [readOnly]=\"readOnly\"\n [startConnector]=\"entrypointsInfo | gioFilterConnectorsByMode: 'INTERACT'\"\n [endConnector]=\"endpointsInfo | gioFilterConnectorsByMode: 'INTERACT'\"\n [steps]=\"flow.interact ?? []\"\n [apiType]=\"apiType\"\n [genericPolicies]=\"genericPolicies\"\n [trialUrl]=\"trialUrl\"\n policyFlowPhase=\"INTERACT\"\n (stepsChange)=\"onStepsChange('interact', $event)\"\n ></gio-ps-flow-details-phase>\n </mat-tab>\n <mat-tab label=\"Event messages\" bodyClass=\"content__tabs__body\">\n <gio-ps-flow-details-phase\n class=\"content__phase\"\n name=\"Publish phase\"\n description=\"Policies will be applied when publishing messages\"\n [readOnly]=\"readOnly\"\n [startConnector]=\"entrypointsInfo | gioFilterConnectorsByMode: 'PUBLISH'\"\n [endConnector]=\"endpointsInfo | gioFilterConnectorsByMode: 'PUBLISH'\"\n [steps]=\"flow.publish ?? []\"\n [apiType]=\"apiType\"\n [genericPolicies]=\"genericPolicies\"\n [trialUrl]=\"trialUrl\"\n policyFlowPhase=\"PUBLISH\"\n (stepsChange)=\"onStepsChange('publish', $event)\"\n ></gio-ps-flow-details-phase>\n <gio-ps-flow-details-phase\n class=\"content__phase\"\n name=\"Subscribe phase\"\n description=\"Policies will be applied when fetching messages\"\n [readOnly]=\"readOnly\"\n [startConnector]=\"endpointsInfo | gioFilterConnectorsByMode: 'SUBSCRIBE'\"\n [endConnector]=\"entrypointsInfo | gioFilterConnectorsByMode: 'SUBSCRIBE'\"\n [steps]=\"flow.subscribe ?? []\"\n [apiType]=\"apiType\"\n [genericPolicies]=\"genericPolicies\"\n [trialUrl]=\"trialUrl\"\n policyFlowPhase=\"SUBSCRIBE\"\n (stepsChange)=\"onStepsChange('subscribe', $event)\"\n ></gio-ps-flow-details-phase>\n </mat-tab>\n </mat-tab-group>\n }\n\n @if (apiType === 'MCP_PROXY') {\n <gio-ps-flow-details-phase\n class=\"content__phase\"\n name=\"Request phase\"\n description=\"Policies will be applied during the connection establishment\"\n [readOnly]=\"readOnly\"\n [startConnector]=\"entrypointsInfo | gioFilterConnectorsByMode: 'REQUEST_RESPONSE'\"\n [endConnector]=\"endpointsInfo | gioFilterConnectorsByMode: 'REQUEST_RESPONSE'\"\n [steps]=\"flow.request ?? []\"\n [apiType]=\"apiType\"\n [genericPolicies]=\"genericPolicies\"\n [trialUrl]=\"trialUrl\"\n policyFlowPhase=\"REQUEST\"\n (stepsChange)=\"onStepsChange('request', $event)\"\n ></gio-ps-flow-details-phase>\n <gio-ps-flow-details-phase\n class=\"content__phase\"\n name=\"Response phase\"\n description=\"Policies will be applied during the connection termination\"\n [readOnly]=\"readOnly\"\n [startConnector]=\"endpointsInfo | gioFilterConnectorsByMode: 'REQUEST_RESPONSE'\"\n [endConnector]=\"entrypointsInfo | gioFilterConnectorsByMode: 'REQUEST_RESPONSE'\"\n [steps]=\"flow.response ?? []\"\n [apiType]=\"apiType\"\n [genericPolicies]=\"genericPolicies\"\n [trialUrl]=\"trialUrl\"\n policyFlowPhase=\"RESPONSE\"\n (stepsChange)=\"onStepsChange('response', $event)\"\n ></gio-ps-flow-details-phase>\n }\n </div>\n } @else {\n <div class=\"emptyFlows\">\n <h2>No flows yet</h2>\n <p class=\"mat-body-1\">Flows allow you to customize the behavior of your API event phases through configurable policies</p>\n </div>\n }\n} @else {\n <div class=\"header loading\">\n <div class=\"header__label\">Flow details</div>\n <div class=\"header__configBtn\">\n <button class=\"header__configBtn__edit\" mat-stroked-button disabled>\n <mat-icon svgIcon=\"gio:edit-pencil\"></mat-icon>\n </button>\n <button class=\"header__configBtn__delete\" mat-stroked-button disabled>\n <mat-icon svgIcon=\"gio:trash\"></mat-icon>\n </button>\n </div>\n </div>\n <gio-ps-flow-details-info-bar class=\"infoBar loading\"></gio-ps-flow-details-info-bar>\n <div class=\"content loading\">\n <gio-loader></gio-loader>\n </div>\n}\n", styles: ["@charset \"UTF-8\";.gio-top-bar-menu .gio-badge-accent{background-color:var(--gio-oem-palette--active, #ffc2ac);color:var(--gio-oem-palette--active-contrast, #1e1b1b)}:host{display:flex;height:100%;flex-direction:column}.emptyFlows{display:flex;max-width:500px;height:100%;flex-direction:column;justify-content:center;margin:auto;text-align:center}.header{display:flex;align-items:center;padding:16px;border-bottom:1px solid #d2cecd}.header__label{font-family:Kanit,Helvetica Neue,sans-serif;font-size:16px;font-weight:500;letter-spacing:.4px;line-height:24px;display:flex;flex:1 1 auto;align-items:center;margin-bottom:0;gap:8px}.header__configBtn{display:flex;align-items:center;margin-left:8px;gap:8px}.infoBar{border-bottom:1px solid #d2cecd}.infoBar.loading{min-height:52px}.infoBar.flowDisabled{opacity:.5}.content{overflow:auto;flex:1 1 auto;background-color:#f7f7f8}.content.flowDisabled{opacity:.5}.content__tabs{min-height:100%;min-height:calc(100% - 64px)}.content__phase{margin:16px 16px 0}.content.loading{display:flex}\n"], dependencies: [{ kind: "ngmodule", type: MatTabsModule }, { kind: "component", type: i2$3.MatTab, selector: "mat-tab", inputs: ["disabled", "label", "aria-label", "aria-labelledby", "labelClass", "bodyClass", "id"], exportAs: ["matTab"] }, { kind: "component", type: i2$3.MatTabGroup, selector: "mat-tab-group", inputs: ["color", "fitInkBarToContent", "mat-stretch-tabs", "mat-align-tabs", "dynamicHeight", "selectedIndex", "headerPosition", "animationDuration", "contentTabIndex", "disablePagination", "disableRipple", "preserveContent", "backgroundColor", "aria-label", "aria-labelledby"], outputs: ["selectedIndexChange", "focusChange", "animationDone", "selectedTabChange"], exportAs: ["matTabGroup"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i3.MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: GioIconsModule }, { kind: "component", type: i2$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: GioPolicyStudioDetailsPhaseComponent, selector: "gio-ps-flow-details-phase", inputs: ["readOnly", "steps", "name", "description", "startConnector", "endConnector", "apiType", "genericPolicies", "policyFlowPhase", "trialUrl", "disabledNotYetAvailable"], outputs: ["stepsChange"] }, { kind: "ngmodule", type: GioLoaderModule }, { kind: "component", type: i7.GioLoaderComponent, selector: "gio-loader" }, { kind: "component", type: GioPolicyStudioDetailsInfoBarComponent, selector: "gio-ps-flow-details-info-bar", inputs: ["flow", "entrypointsInfo"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i2$2.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: GioBannerModule }, { kind: "pipe", type: GioFilterConnectorsByModePipe, name: "gioFilterConnectorsByMode" }] }); }
|
|
2462
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.3", type: GioPolicyStudioDetailsComponent, isStandalone: true, selector: "gio-ps-flow-details", inputs: { readOnly: "readOnly", loading: "loading", apiType: "apiType", flow: "flow", entrypointsInfo: "entrypointsInfo", endpointsInfo: "endpointsInfo", policies: "policies", genericPolicies: "genericPolicies", trialUrl: "trialUrl" }, outputs: { flowChange: "flowChange", deleteFlow: "deleteFlow" }, usesOnChanges: true, ngImport: i0, template: "<!--\n\n Copyright (C) 2025 The Gravitee team (http://gravitee.io)\n \n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n \n http://www.apache.org/licenses/LICENSE-2.0\n \n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n-->\n\n@if (!loading) {\n @if (flow) {\n <div class=\"header\">\n <div class=\"header__label\">\n Flow details\n @if (!flow.enabled) {\n <div class=\"gio-badge gio-badge-neutral\">Disabled</div>\n }\n </div>\n <div class=\"header__configBtn\">\n <button\n [disabled]=\"readOnly\"\n class=\"header__configBtn__enableDisable\"\n mat-stroked-button\n [matTooltip]=\"flow.enabled ? 'Disable' : 'Enable'\"\n (click)=\"onEnableDisableFlow()\"\n >\n <mat-icon [svgIcon]=\"flow.enabled ? 'gio:prohibition' : 'gio:check-circled-outline'\"></mat-icon>\n </button>\n <button [disabled]=\"readOnly\" class=\"header__configBtn__edit\" mat-stroked-button (click)=\"onEditFlow()\" matTooltip=\"Edit\">\n <mat-icon svgIcon=\"gio:edit-pencil\"></mat-icon>\n </button>\n <button [disabled]=\"readOnly\" class=\"header__configBtn__delete\" mat-stroked-button (click)=\"onDeleteFlow()\" matTooltip=\"Delete\">\n <mat-icon svgIcon=\"gio:trash\"></mat-icon>\n </button>\n </div>\n </div>\n <gio-ps-flow-details-info-bar\n class=\"infoBar\"\n [class.flowDisabled]=\"!flow.enabled\"\n [flow]=\"flow\"\n [entrypointsInfo]=\"entrypointsInfo\"\n ></gio-ps-flow-details-info-bar>\n\n <div class=\"content\" [class.flowDisabled]=\"!flow.enabled\">\n @if (apiType === 'MESSAGE') {\n <mat-tab-group class=\"content__tabs\" dynamicHeight>\n <mat-tab label=\"Initial connection\" bodyClass=\"content__tabs__body\">\n <gio-ps-flow-details-phase\n class=\"content__phase\"\n name=\"Request phase\"\n description=\"Policies will be applied during the connection establishment\"\n [readOnly]=\"readOnly\"\n [startConnector]=\"messageFlowEntrypointsInfo\"\n [endConnector]=\"endpointsInfo\"\n [steps]=\"flow.request ?? []\"\n [apiType]=\"apiType\"\n [genericPolicies]=\"genericPolicies\"\n [trialUrl]=\"trialUrl\"\n policyFlowPhase=\"REQUEST\"\n (stepsChange)=\"onStepsChange('request', $event)\"\n ></gio-ps-flow-details-phase>\n <gio-ps-flow-details-phase\n class=\"content__phase\"\n name=\"Response phase\"\n description=\"Policies will be applied to the response from the initial connection\"\n [readOnly]=\"readOnly\"\n [startConnector]=\"endpointsInfo\"\n [endConnector]=\"messageFlowEntrypointsInfo\"\n [steps]=\"flow.response ?? []\"\n [apiType]=\"apiType\"\n [genericPolicies]=\"genericPolicies\"\n [trialUrl]=\"trialUrl\"\n policyFlowPhase=\"RESPONSE\"\n (stepsChange)=\"onStepsChange('response', $event)\"\n ></gio-ps-flow-details-phase>\n </mat-tab>\n <mat-tab label=\"Event messages\" bodyClass=\"content__tabs__body\">\n <gio-ps-flow-details-phase\n class=\"content__phase\"\n name=\"Publish phase\"\n description=\"Policies will be applied on messages sent to the endpoint\"\n [readOnly]=\"readOnly\"\n [startConnector]=\"messageFlowEntrypointsInfo | gioFilterConnectorsByMode: 'PUBLISH' : operations\"\n [endConnector]=\"endpointsInfo | gioFilterConnectorsByMode: 'PUBLISH' : operations\"\n [steps]=\"flow.publish ?? []\"\n [apiType]=\"apiType\"\n [genericPolicies]=\"genericPolicies\"\n [trialUrl]=\"trialUrl\"\n policyFlowPhase=\"PUBLISH\"\n (stepsChange)=\"onStepsChange('publish', $event)\"\n ></gio-ps-flow-details-phase>\n <gio-ps-flow-details-phase\n class=\"content__phase\"\n name=\"Subscribe phase\"\n description=\"Policies will be applied on messages received by the entrypoint\"\n [readOnly]=\"readOnly\"\n [startConnector]=\"endpointsInfo | gioFilterConnectorsByMode: 'SUBSCRIBE' : operations\"\n [endConnector]=\"messageFlowEntrypointsInfo | gioFilterConnectorsByMode: 'SUBSCRIBE' : operations\"\n [steps]=\"flow.subscribe ?? []\"\n [apiType]=\"apiType\"\n [genericPolicies]=\"genericPolicies\"\n [trialUrl]=\"trialUrl\"\n policyFlowPhase=\"SUBSCRIBE\"\n (stepsChange)=\"onStepsChange('subscribe', $event)\"\n ></gio-ps-flow-details-phase>\n </mat-tab>\n </mat-tab-group>\n }\n\n @if (apiType === 'PROXY') {\n <gio-ps-flow-details-phase\n class=\"content__phase\"\n name=\"Request phase\"\n description=\"Policies will be applied during the connection establishment\"\n [readOnly]=\"readOnly\"\n [startConnector]=\"entrypointsInfo | gioFilterConnectorsByMode: 'REQUEST_RESPONSE'\"\n [endConnector]=\"endpointsInfo | gioFilterConnectorsByMode: 'REQUEST_RESPONSE'\"\n [steps]=\"flow.request ?? []\"\n [apiType]=\"apiType\"\n [genericPolicies]=\"genericPolicies\"\n [trialUrl]=\"trialUrl\"\n policyFlowPhase=\"REQUEST\"\n (stepsChange)=\"onStepsChange('request', $event)\"\n ></gio-ps-flow-details-phase>\n <gio-ps-flow-details-phase\n class=\"content__phase\"\n name=\"Response phase\"\n description=\"Policies will be applied during the connection termination\"\n [readOnly]=\"readOnly\"\n [startConnector]=\"endpointsInfo | gioFilterConnectorsByMode: 'REQUEST_RESPONSE'\"\n [endConnector]=\"entrypointsInfo | gioFilterConnectorsByMode: 'REQUEST_RESPONSE'\"\n [steps]=\"flow.response ?? []\"\n [apiType]=\"apiType\"\n [genericPolicies]=\"genericPolicies\"\n [trialUrl]=\"trialUrl\"\n policyFlowPhase=\"RESPONSE\"\n (stepsChange)=\"onStepsChange('response', $event)\"\n ></gio-ps-flow-details-phase>\n }\n\n @if (apiType === 'NATIVE') {\n <mat-tab-group class=\"content__tabs\" dynamicHeight>\n <mat-tab label=\"Global\" bodyClass=\"content__tabs__body\">\n <gio-ps-flow-details-phase\n class=\"content__phase\"\n name=\"Connect phase\"\n description=\"Policies will be applied when the client connects to the Gateway\"\n [disabledNotYetAvailable]=\"true\"\n [readOnly]=\"readOnly\"\n [startConnector]=\"endpointsInfo | gioFilterConnectorsByMode: 'CONNECT'\"\n [endConnector]=\"entrypointsInfo | gioFilterConnectorsByMode: 'CONNECT'\"\n [steps]=\"flow.connect ?? []\"\n [apiType]=\"apiType\"\n [genericPolicies]=\"genericPolicies\"\n [trialUrl]=\"trialUrl\"\n policyFlowPhase=\"CONNECT\"\n (stepsChange)=\"onStepsChange('connect', $event)\"\n >\n </gio-ps-flow-details-phase>\n <gio-ps-flow-details-phase\n class=\"content__phase\"\n name=\"Interact phase\"\n description=\"Policies will be applied on all interactions between the client and the Gateway\"\n [readOnly]=\"readOnly\"\n [startConnector]=\"entrypointsInfo | gioFilterConnectorsByMode: 'INTERACT'\"\n [endConnector]=\"endpointsInfo | gioFilterConnectorsByMode: 'INTERACT'\"\n [steps]=\"flow.interact ?? []\"\n [apiType]=\"apiType\"\n [genericPolicies]=\"genericPolicies\"\n [trialUrl]=\"trialUrl\"\n policyFlowPhase=\"INTERACT\"\n (stepsChange)=\"onStepsChange('interact', $event)\"\n ></gio-ps-flow-details-phase>\n </mat-tab>\n <mat-tab label=\"Event messages\" bodyClass=\"content__tabs__body\">\n <gio-ps-flow-details-phase\n class=\"content__phase\"\n name=\"Publish phase\"\n description=\"Policies will be applied when publishing messages\"\n [readOnly]=\"readOnly\"\n [startConnector]=\"entrypointsInfo | gioFilterConnectorsByMode: 'PUBLISH'\"\n [endConnector]=\"endpointsInfo | gioFilterConnectorsByMode: 'PUBLISH'\"\n [steps]=\"flow.publish ?? []\"\n [apiType]=\"apiType\"\n [genericPolicies]=\"genericPolicies\"\n [trialUrl]=\"trialUrl\"\n policyFlowPhase=\"PUBLISH\"\n (stepsChange)=\"onStepsChange('publish', $event)\"\n ></gio-ps-flow-details-phase>\n <gio-ps-flow-details-phase\n class=\"content__phase\"\n name=\"Subscribe phase\"\n description=\"Policies will be applied when fetching messages\"\n [readOnly]=\"readOnly\"\n [startConnector]=\"endpointsInfo | gioFilterConnectorsByMode: 'SUBSCRIBE'\"\n [endConnector]=\"entrypointsInfo | gioFilterConnectorsByMode: 'SUBSCRIBE'\"\n [steps]=\"flow.subscribe ?? []\"\n [apiType]=\"apiType\"\n [genericPolicies]=\"genericPolicies\"\n [trialUrl]=\"trialUrl\"\n policyFlowPhase=\"SUBSCRIBE\"\n (stepsChange)=\"onStepsChange('subscribe', $event)\"\n ></gio-ps-flow-details-phase>\n </mat-tab>\n </mat-tab-group>\n }\n\n @if (apiType === 'MCP_PROXY') {\n <gio-ps-flow-details-phase\n class=\"content__phase\"\n name=\"Request phase\"\n description=\"Policies will be applied during the connection establishment\"\n [readOnly]=\"readOnly\"\n [startConnector]=\"entrypointsInfo | gioFilterConnectorsByMode: 'REQUEST_RESPONSE'\"\n [endConnector]=\"endpointsInfo | gioFilterConnectorsByMode: 'REQUEST_RESPONSE'\"\n [steps]=\"flow.request ?? []\"\n [apiType]=\"apiType\"\n [genericPolicies]=\"genericPolicies\"\n [trialUrl]=\"trialUrl\"\n policyFlowPhase=\"REQUEST\"\n (stepsChange)=\"onStepsChange('request', $event)\"\n ></gio-ps-flow-details-phase>\n <gio-ps-flow-details-phase\n class=\"content__phase\"\n name=\"Response phase\"\n description=\"Policies will be applied during the connection termination\"\n [readOnly]=\"readOnly\"\n [startConnector]=\"endpointsInfo | gioFilterConnectorsByMode: 'REQUEST_RESPONSE'\"\n [endConnector]=\"entrypointsInfo | gioFilterConnectorsByMode: 'REQUEST_RESPONSE'\"\n [steps]=\"flow.response ?? []\"\n [apiType]=\"apiType\"\n [genericPolicies]=\"genericPolicies\"\n [trialUrl]=\"trialUrl\"\n policyFlowPhase=\"RESPONSE\"\n (stepsChange)=\"onStepsChange('response', $event)\"\n ></gio-ps-flow-details-phase>\n }\n @if (apiType === 'LLM_PROXY') {\n <gio-ps-flow-details-phase\n class=\"content__phase\"\n name=\"Request phase\"\n description=\"Policies will be applied during the connection establishment\"\n [readOnly]=\"readOnly\"\n [startConnector]=\"entrypointsInfo | gioFilterConnectorsByMode: 'REQUEST_RESPONSE'\"\n [endConnector]=\"endpointsInfo | gioFilterConnectorsByMode: 'REQUEST_RESPONSE'\"\n [steps]=\"flow.request ?? []\"\n [apiType]=\"apiType\"\n [genericPolicies]=\"genericPolicies\"\n [trialUrl]=\"trialUrl\"\n policyFlowPhase=\"REQUEST\"\n (stepsChange)=\"onStepsChange('request', $event)\"\n ></gio-ps-flow-details-phase>\n <gio-ps-flow-details-phase\n class=\"content__phase\"\n name=\"Response phase\"\n description=\"Policies will be applied during the connection termination\"\n [readOnly]=\"readOnly\"\n [startConnector]=\"endpointsInfo | gioFilterConnectorsByMode: 'REQUEST_RESPONSE'\"\n [endConnector]=\"entrypointsInfo | gioFilterConnectorsByMode: 'REQUEST_RESPONSE'\"\n [steps]=\"flow.response ?? []\"\n [apiType]=\"apiType\"\n [genericPolicies]=\"genericPolicies\"\n [trialUrl]=\"trialUrl\"\n policyFlowPhase=\"RESPONSE\"\n (stepsChange)=\"onStepsChange('response', $event)\"\n ></gio-ps-flow-details-phase>\n }\n </div>\n } @else {\n <div class=\"emptyFlows\">\n <h2>No flows yet</h2>\n <p class=\"mat-body-1\">Flows allow you to customize the behavior of your API event phases through configurable policies</p>\n </div>\n }\n} @else {\n <div class=\"header loading\">\n <div class=\"header__label\">Flow details</div>\n <div class=\"header__configBtn\">\n <button class=\"header__configBtn__edit\" mat-stroked-button disabled>\n <mat-icon svgIcon=\"gio:edit-pencil\"></mat-icon>\n </button>\n <button class=\"header__configBtn__delete\" mat-stroked-button disabled>\n <mat-icon svgIcon=\"gio:trash\"></mat-icon>\n </button>\n </div>\n </div>\n <gio-ps-flow-details-info-bar class=\"infoBar loading\"></gio-ps-flow-details-info-bar>\n <div class=\"content loading\">\n <gio-loader></gio-loader>\n </div>\n}\n", styles: ["@charset \"UTF-8\";.gio-top-bar-menu .gio-badge-accent{background-color:var(--gio-oem-palette--active, #ffc2ac);color:var(--gio-oem-palette--active-contrast, #1e1b1b)}:host{display:flex;height:100%;flex-direction:column}.emptyFlows{display:flex;max-width:500px;height:100%;flex-direction:column;justify-content:center;margin:auto;text-align:center}.header{display:flex;align-items:center;padding:16px;border-bottom:1px solid #d2cecd}.header__label{font-family:Kanit,Helvetica Neue,sans-serif;font-size:16px;font-weight:500;letter-spacing:.4px;line-height:24px;display:flex;flex:1 1 auto;align-items:center;margin-bottom:0;gap:8px}.header__configBtn{display:flex;align-items:center;margin-left:8px;gap:8px}.infoBar{border-bottom:1px solid #d2cecd}.infoBar.loading{min-height:52px}.infoBar.flowDisabled{opacity:.5}.content{overflow:auto;flex:1 1 auto;background-color:#f7f7f8}.content.flowDisabled{opacity:.5}.content__tabs{min-height:100%;min-height:calc(100% - 64px)}.content__phase{margin:16px 16px 0}.content.loading{display:flex}\n"], dependencies: [{ kind: "ngmodule", type: MatTabsModule }, { kind: "component", type: i2$2.MatTab, selector: "mat-tab", inputs: ["disabled", "label", "aria-label", "aria-labelledby", "labelClass", "bodyClass", "id"], exportAs: ["matTab"] }, { kind: "component", type: i2$2.MatTabGroup, selector: "mat-tab-group", inputs: ["color", "fitInkBarToContent", "mat-stretch-tabs", "mat-align-tabs", "dynamicHeight", "selectedIndex", "headerPosition", "animationDuration", "contentTabIndex", "disablePagination", "disableRipple", "preserveContent", "backgroundColor", "aria-label", "aria-labelledby"], outputs: ["selectedIndexChange", "focusChange", "animationDone", "selectedTabChange"], exportAs: ["matTabGroup"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i3.MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: GioIconsModule }, { kind: "component", type: i6$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: GioPolicyStudioDetailsPhaseComponent, selector: "gio-ps-flow-details-phase", inputs: ["readOnly", "steps", "name", "description", "startConnector", "endConnector", "apiType", "genericPolicies", "policyFlowPhase", "trialUrl", "disabledNotYetAvailable"], outputs: ["stepsChange"] }, { kind: "ngmodule", type: GioLoaderModule }, { kind: "component", type: i7.GioLoaderComponent, selector: "gio-loader" }, { kind: "component", type: GioPolicyStudioDetailsInfoBarComponent, selector: "gio-ps-flow-details-info-bar", inputs: ["flow", "entrypointsInfo"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i2$1.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: GioBannerModule }, { kind: "pipe", type: GioFilterConnectorsByModePipe, name: "gioFilterConnectorsByMode" }] }); }
|
|
2230
2463
|
}
|
|
2231
2464
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: GioPolicyStudioDetailsComponent, decorators: [{
|
|
2232
2465
|
type: Component,
|
|
@@ -2240,7 +2473,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImpor
|
|
|
2240
2473
|
GioPolicyStudioDetailsInfoBarComponent,
|
|
2241
2474
|
MatTooltipModule,
|
|
2242
2475
|
GioBannerModule,
|
|
2243
|
-
], selector: 'gio-ps-flow-details', template: "<!--\n\n Copyright (C) 2025 The Gravitee team (http://gravitee.io)\n \n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n \n http://www.apache.org/licenses/LICENSE-2.0\n \n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n-->\n\n@if (!loading) {\n @if (flow) {\n <div class=\"header\">\n <div class=\"header__label\">\n Flow details\n @if (!flow.enabled) {\n <div class=\"gio-badge gio-badge-neutral\">Disabled</div>\n }\n </div>\n <div class=\"header__configBtn\">\n <button\n [disabled]=\"readOnly\"\n class=\"header__configBtn__enableDisable\"\n mat-stroked-button\n [matTooltip]=\"flow.enabled ? 'Disable' : 'Enable'\"\n (click)=\"onEnableDisableFlow()\"\n >\n <mat-icon [svgIcon]=\"flow.enabled ? 'gio:prohibition' : 'gio:check-circled-outline'\"></mat-icon>\n </button>\n <button [disabled]=\"readOnly\" class=\"header__configBtn__edit\" mat-stroked-button (click)=\"onEditFlow()\" matTooltip=\"Edit\">\n <mat-icon svgIcon=\"gio:edit-pencil\"></mat-icon>\n </button>\n <button [disabled]=\"readOnly\" class=\"header__configBtn__delete\" mat-stroked-button (click)=\"onDeleteFlow()\" matTooltip=\"Delete\">\n <mat-icon svgIcon=\"gio:trash\"></mat-icon>\n </button>\n </div>\n </div>\n <gio-ps-flow-details-info-bar\n class=\"infoBar\"\n [class.flowDisabled]=\"!flow.enabled\"\n [flow]=\"flow\"\n [entrypointsInfo]=\"entrypointsInfo\"\n ></gio-ps-flow-details-info-bar>\n\n <div class=\"content\" [class.flowDisabled]=\"!flow.enabled\">\n @if (apiType === 'MESSAGE') {\n <mat-tab-group class=\"content__tabs\" dynamicHeight>\n <mat-tab label=\"Initial connection\" bodyClass=\"content__tabs__body\">\n <gio-ps-flow-details-phase\n class=\"content__phase\"\n name=\"Request phase\"\n description=\"Policies will be applied during the connection establishment\"\n [readOnly]=\"readOnly\"\n [startConnector]=\"messageFlowEntrypointsInfo\"\n [endConnector]=\"endpointsInfo\"\n [steps]=\"flow.request ?? []\"\n [apiType]=\"apiType\"\n [genericPolicies]=\"genericPolicies\"\n [trialUrl]=\"trialUrl\"\n policyFlowPhase=\"REQUEST\"\n (stepsChange)=\"onStepsChange('request', $event)\"\n ></gio-ps-flow-details-phase>\n <gio-ps-flow-details-phase\n class=\"content__phase\"\n name=\"Response phase\"\n description=\"Policies will be applied to the response from the initial connection\"\n [readOnly]=\"readOnly\"\n [startConnector]=\"endpointsInfo\"\n [endConnector]=\"messageFlowEntrypointsInfo\"\n [steps]=\"flow.response ?? []\"\n [apiType]=\"apiType\"\n [genericPolicies]=\"genericPolicies\"\n [trialUrl]=\"trialUrl\"\n policyFlowPhase=\"RESPONSE\"\n (stepsChange)=\"onStepsChange('response', $event)\"\n ></gio-ps-flow-details-phase>\n </mat-tab>\n <mat-tab label=\"Event messages\" bodyClass=\"content__tabs__body\">\n <gio-ps-flow-details-phase\n class=\"content__phase\"\n name=\"Publish phase\"\n description=\"Policies will be applied on messages sent to the endpoint\"\n [readOnly]=\"readOnly\"\n [startConnector]=\"messageFlowEntrypointsInfo | gioFilterConnectorsByMode: 'PUBLISH' : operations\"\n [endConnector]=\"endpointsInfo | gioFilterConnectorsByMode: 'PUBLISH' : operations\"\n [steps]=\"flow.publish ?? []\"\n [apiType]=\"apiType\"\n [genericPolicies]=\"genericPolicies\"\n [trialUrl]=\"trialUrl\"\n policyFlowPhase=\"PUBLISH\"\n (stepsChange)=\"onStepsChange('publish', $event)\"\n ></gio-ps-flow-details-phase>\n <gio-ps-flow-details-phase\n class=\"content__phase\"\n name=\"Subscribe phase\"\n description=\"Policies will be applied on messages received by the entrypoint\"\n [readOnly]=\"readOnly\"\n [startConnector]=\"endpointsInfo | gioFilterConnectorsByMode: 'SUBSCRIBE' : operations\"\n [endConnector]=\"messageFlowEntrypointsInfo | gioFilterConnectorsByMode: 'SUBSCRIBE' : operations\"\n [steps]=\"flow.subscribe ?? []\"\n [apiType]=\"apiType\"\n [genericPolicies]=\"genericPolicies\"\n [trialUrl]=\"trialUrl\"\n policyFlowPhase=\"SUBSCRIBE\"\n (stepsChange)=\"onStepsChange('subscribe', $event)\"\n ></gio-ps-flow-details-phase>\n </mat-tab>\n </mat-tab-group>\n }\n\n @if (apiType === 'PROXY') {\n <gio-ps-flow-details-phase\n class=\"content__phase\"\n name=\"Request phase\"\n description=\"Policies will be applied during the connection establishment\"\n [readOnly]=\"readOnly\"\n [startConnector]=\"entrypointsInfo | gioFilterConnectorsByMode: 'REQUEST_RESPONSE'\"\n [endConnector]=\"endpointsInfo | gioFilterConnectorsByMode: 'REQUEST_RESPONSE'\"\n [steps]=\"flow.request ?? []\"\n [apiType]=\"apiType\"\n [genericPolicies]=\"genericPolicies\"\n [trialUrl]=\"trialUrl\"\n policyFlowPhase=\"REQUEST\"\n (stepsChange)=\"onStepsChange('request', $event)\"\n ></gio-ps-flow-details-phase>\n <gio-ps-flow-details-phase\n class=\"content__phase\"\n name=\"Response phase\"\n description=\"Policies will be applied during the connection termination\"\n [readOnly]=\"readOnly\"\n [startConnector]=\"endpointsInfo | gioFilterConnectorsByMode: 'REQUEST_RESPONSE'\"\n [endConnector]=\"entrypointsInfo | gioFilterConnectorsByMode: 'REQUEST_RESPONSE'\"\n [steps]=\"flow.response ?? []\"\n [apiType]=\"apiType\"\n [genericPolicies]=\"genericPolicies\"\n [trialUrl]=\"trialUrl\"\n policyFlowPhase=\"RESPONSE\"\n (stepsChange)=\"onStepsChange('response', $event)\"\n ></gio-ps-flow-details-phase>\n }\n\n @if (apiType === 'NATIVE') {\n <mat-tab-group class=\"content__tabs\" dynamicHeight>\n <mat-tab label=\"Global\" bodyClass=\"content__tabs__body\">\n <gio-ps-flow-details-phase\n class=\"content__phase\"\n name=\"Connect phase\"\n description=\"Policies will be applied when the client connects to the Gateway\"\n [disabledNotYetAvailable]=\"true\"\n [readOnly]=\"readOnly\"\n [startConnector]=\"endpointsInfo | gioFilterConnectorsByMode: 'CONNECT'\"\n [endConnector]=\"entrypointsInfo | gioFilterConnectorsByMode: 'CONNECT'\"\n [steps]=\"flow.connect ?? []\"\n [apiType]=\"apiType\"\n [genericPolicies]=\"genericPolicies\"\n [trialUrl]=\"trialUrl\"\n policyFlowPhase=\"CONNECT\"\n (stepsChange)=\"onStepsChange('connect', $event)\"\n >\n </gio-ps-flow-details-phase>\n <gio-ps-flow-details-phase\n class=\"content__phase\"\n name=\"Interact phase\"\n description=\"Policies will be applied on all interactions between the client and the Gateway\"\n [readOnly]=\"readOnly\"\n [startConnector]=\"entrypointsInfo | gioFilterConnectorsByMode: 'INTERACT'\"\n [endConnector]=\"endpointsInfo | gioFilterConnectorsByMode: 'INTERACT'\"\n [steps]=\"flow.interact ?? []\"\n [apiType]=\"apiType\"\n [genericPolicies]=\"genericPolicies\"\n [trialUrl]=\"trialUrl\"\n policyFlowPhase=\"INTERACT\"\n (stepsChange)=\"onStepsChange('interact', $event)\"\n ></gio-ps-flow-details-phase>\n </mat-tab>\n <mat-tab label=\"Event messages\" bodyClass=\"content__tabs__body\">\n <gio-ps-flow-details-phase\n class=\"content__phase\"\n name=\"Publish phase\"\n description=\"Policies will be applied when publishing messages\"\n [readOnly]=\"readOnly\"\n [startConnector]=\"entrypointsInfo | gioFilterConnectorsByMode: 'PUBLISH'\"\n [endConnector]=\"endpointsInfo | gioFilterConnectorsByMode: 'PUBLISH'\"\n [steps]=\"flow.publish ?? []\"\n [apiType]=\"apiType\"\n [genericPolicies]=\"genericPolicies\"\n [trialUrl]=\"trialUrl\"\n policyFlowPhase=\"PUBLISH\"\n (stepsChange)=\"onStepsChange('publish', $event)\"\n ></gio-ps-flow-details-phase>\n <gio-ps-flow-details-phase\n class=\"content__phase\"\n name=\"Subscribe phase\"\n description=\"Policies will be applied when fetching messages\"\n [readOnly]=\"readOnly\"\n [startConnector]=\"endpointsInfo | gioFilterConnectorsByMode: 'SUBSCRIBE'\"\n [endConnector]=\"entrypointsInfo | gioFilterConnectorsByMode: 'SUBSCRIBE'\"\n [steps]=\"flow.subscribe ?? []\"\n [apiType]=\"apiType\"\n [genericPolicies]=\"genericPolicies\"\n [trialUrl]=\"trialUrl\"\n policyFlowPhase=\"SUBSCRIBE\"\n (stepsChange)=\"onStepsChange('subscribe', $event)\"\n ></gio-ps-flow-details-phase>\n </mat-tab>\n </mat-tab-group>\n }\n\n @if (apiType === 'MCP_PROXY') {\n <gio-ps-flow-details-phase\n class=\"content__phase\"\n name=\"Request phase\"\n description=\"Policies will be applied during the connection establishment\"\n [readOnly]=\"readOnly\"\n [startConnector]=\"entrypointsInfo | gioFilterConnectorsByMode: 'REQUEST_RESPONSE'\"\n [endConnector]=\"endpointsInfo | gioFilterConnectorsByMode: 'REQUEST_RESPONSE'\"\n [steps]=\"flow.request ?? []\"\n [apiType]=\"apiType\"\n [genericPolicies]=\"genericPolicies\"\n [trialUrl]=\"trialUrl\"\n policyFlowPhase=\"REQUEST\"\n (stepsChange)=\"onStepsChange('request', $event)\"\n ></gio-ps-flow-details-phase>\n <gio-ps-flow-details-phase\n class=\"content__phase\"\n name=\"Response phase\"\n description=\"Policies will be applied during the connection termination\"\n [readOnly]=\"readOnly\"\n [startConnector]=\"endpointsInfo | gioFilterConnectorsByMode: 'REQUEST_RESPONSE'\"\n [endConnector]=\"entrypointsInfo | gioFilterConnectorsByMode: 'REQUEST_RESPONSE'\"\n [steps]=\"flow.response ?? []\"\n [apiType]=\"apiType\"\n [genericPolicies]=\"genericPolicies\"\n [trialUrl]=\"trialUrl\"\n policyFlowPhase=\"RESPONSE\"\n (stepsChange)=\"onStepsChange('response', $event)\"\n ></gio-ps-flow-details-phase>\n }\n </div>\n } @else {\n <div class=\"emptyFlows\">\n <h2>No flows yet</h2>\n <p class=\"mat-body-1\">Flows allow you to customize the behavior of your API event phases through configurable policies</p>\n </div>\n }\n} @else {\n <div class=\"header loading\">\n <div class=\"header__label\">Flow details</div>\n <div class=\"header__configBtn\">\n <button class=\"header__configBtn__edit\" mat-stroked-button disabled>\n <mat-icon svgIcon=\"gio:edit-pencil\"></mat-icon>\n </button>\n <button class=\"header__configBtn__delete\" mat-stroked-button disabled>\n <mat-icon svgIcon=\"gio:trash\"></mat-icon>\n </button>\n </div>\n </div>\n <gio-ps-flow-details-info-bar class=\"infoBar loading\"></gio-ps-flow-details-info-bar>\n <div class=\"content loading\">\n <gio-loader></gio-loader>\n </div>\n}\n", styles: ["@charset \"UTF-8\";.gio-top-bar-menu .gio-badge-accent{background-color:var(--gio-oem-palette--active, #ffc2ac);color:var(--gio-oem-palette--active-contrast, #1e1b1b)}:host{display:flex;height:100%;flex-direction:column}.emptyFlows{display:flex;max-width:500px;height:100%;flex-direction:column;justify-content:center;margin:auto;text-align:center}.header{display:flex;align-items:center;padding:16px;border-bottom:1px solid #d2cecd}.header__label{font-family:Kanit,Helvetica Neue,sans-serif;font-size:16px;font-weight:500;letter-spacing:.4px;line-height:24px;display:flex;flex:1 1 auto;align-items:center;margin-bottom:0;gap:8px}.header__configBtn{display:flex;align-items:center;margin-left:8px;gap:8px}.infoBar{border-bottom:1px solid #d2cecd}.infoBar.loading{min-height:52px}.infoBar.flowDisabled{opacity:.5}.content{overflow:auto;flex:1 1 auto;background-color:#f7f7f8}.content.flowDisabled{opacity:.5}.content__tabs{min-height:100%;min-height:calc(100% - 64px)}.content__phase{margin:16px 16px 0}.content.loading{display:flex}\n"] }]
|
|
2476
|
+
], selector: 'gio-ps-flow-details', template: "<!--\n\n Copyright (C) 2025 The Gravitee team (http://gravitee.io)\n \n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n \n http://www.apache.org/licenses/LICENSE-2.0\n \n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n-->\n\n@if (!loading) {\n @if (flow) {\n <div class=\"header\">\n <div class=\"header__label\">\n Flow details\n @if (!flow.enabled) {\n <div class=\"gio-badge gio-badge-neutral\">Disabled</div>\n }\n </div>\n <div class=\"header__configBtn\">\n <button\n [disabled]=\"readOnly\"\n class=\"header__configBtn__enableDisable\"\n mat-stroked-button\n [matTooltip]=\"flow.enabled ? 'Disable' : 'Enable'\"\n (click)=\"onEnableDisableFlow()\"\n >\n <mat-icon [svgIcon]=\"flow.enabled ? 'gio:prohibition' : 'gio:check-circled-outline'\"></mat-icon>\n </button>\n <button [disabled]=\"readOnly\" class=\"header__configBtn__edit\" mat-stroked-button (click)=\"onEditFlow()\" matTooltip=\"Edit\">\n <mat-icon svgIcon=\"gio:edit-pencil\"></mat-icon>\n </button>\n <button [disabled]=\"readOnly\" class=\"header__configBtn__delete\" mat-stroked-button (click)=\"onDeleteFlow()\" matTooltip=\"Delete\">\n <mat-icon svgIcon=\"gio:trash\"></mat-icon>\n </button>\n </div>\n </div>\n <gio-ps-flow-details-info-bar\n class=\"infoBar\"\n [class.flowDisabled]=\"!flow.enabled\"\n [flow]=\"flow\"\n [entrypointsInfo]=\"entrypointsInfo\"\n ></gio-ps-flow-details-info-bar>\n\n <div class=\"content\" [class.flowDisabled]=\"!flow.enabled\">\n @if (apiType === 'MESSAGE') {\n <mat-tab-group class=\"content__tabs\" dynamicHeight>\n <mat-tab label=\"Initial connection\" bodyClass=\"content__tabs__body\">\n <gio-ps-flow-details-phase\n class=\"content__phase\"\n name=\"Request phase\"\n description=\"Policies will be applied during the connection establishment\"\n [readOnly]=\"readOnly\"\n [startConnector]=\"messageFlowEntrypointsInfo\"\n [endConnector]=\"endpointsInfo\"\n [steps]=\"flow.request ?? []\"\n [apiType]=\"apiType\"\n [genericPolicies]=\"genericPolicies\"\n [trialUrl]=\"trialUrl\"\n policyFlowPhase=\"REQUEST\"\n (stepsChange)=\"onStepsChange('request', $event)\"\n ></gio-ps-flow-details-phase>\n <gio-ps-flow-details-phase\n class=\"content__phase\"\n name=\"Response phase\"\n description=\"Policies will be applied to the response from the initial connection\"\n [readOnly]=\"readOnly\"\n [startConnector]=\"endpointsInfo\"\n [endConnector]=\"messageFlowEntrypointsInfo\"\n [steps]=\"flow.response ?? []\"\n [apiType]=\"apiType\"\n [genericPolicies]=\"genericPolicies\"\n [trialUrl]=\"trialUrl\"\n policyFlowPhase=\"RESPONSE\"\n (stepsChange)=\"onStepsChange('response', $event)\"\n ></gio-ps-flow-details-phase>\n </mat-tab>\n <mat-tab label=\"Event messages\" bodyClass=\"content__tabs__body\">\n <gio-ps-flow-details-phase\n class=\"content__phase\"\n name=\"Publish phase\"\n description=\"Policies will be applied on messages sent to the endpoint\"\n [readOnly]=\"readOnly\"\n [startConnector]=\"messageFlowEntrypointsInfo | gioFilterConnectorsByMode: 'PUBLISH' : operations\"\n [endConnector]=\"endpointsInfo | gioFilterConnectorsByMode: 'PUBLISH' : operations\"\n [steps]=\"flow.publish ?? []\"\n [apiType]=\"apiType\"\n [genericPolicies]=\"genericPolicies\"\n [trialUrl]=\"trialUrl\"\n policyFlowPhase=\"PUBLISH\"\n (stepsChange)=\"onStepsChange('publish', $event)\"\n ></gio-ps-flow-details-phase>\n <gio-ps-flow-details-phase\n class=\"content__phase\"\n name=\"Subscribe phase\"\n description=\"Policies will be applied on messages received by the entrypoint\"\n [readOnly]=\"readOnly\"\n [startConnector]=\"endpointsInfo | gioFilterConnectorsByMode: 'SUBSCRIBE' : operations\"\n [endConnector]=\"messageFlowEntrypointsInfo | gioFilterConnectorsByMode: 'SUBSCRIBE' : operations\"\n [steps]=\"flow.subscribe ?? []\"\n [apiType]=\"apiType\"\n [genericPolicies]=\"genericPolicies\"\n [trialUrl]=\"trialUrl\"\n policyFlowPhase=\"SUBSCRIBE\"\n (stepsChange)=\"onStepsChange('subscribe', $event)\"\n ></gio-ps-flow-details-phase>\n </mat-tab>\n </mat-tab-group>\n }\n\n @if (apiType === 'PROXY') {\n <gio-ps-flow-details-phase\n class=\"content__phase\"\n name=\"Request phase\"\n description=\"Policies will be applied during the connection establishment\"\n [readOnly]=\"readOnly\"\n [startConnector]=\"entrypointsInfo | gioFilterConnectorsByMode: 'REQUEST_RESPONSE'\"\n [endConnector]=\"endpointsInfo | gioFilterConnectorsByMode: 'REQUEST_RESPONSE'\"\n [steps]=\"flow.request ?? []\"\n [apiType]=\"apiType\"\n [genericPolicies]=\"genericPolicies\"\n [trialUrl]=\"trialUrl\"\n policyFlowPhase=\"REQUEST\"\n (stepsChange)=\"onStepsChange('request', $event)\"\n ></gio-ps-flow-details-phase>\n <gio-ps-flow-details-phase\n class=\"content__phase\"\n name=\"Response phase\"\n description=\"Policies will be applied during the connection termination\"\n [readOnly]=\"readOnly\"\n [startConnector]=\"endpointsInfo | gioFilterConnectorsByMode: 'REQUEST_RESPONSE'\"\n [endConnector]=\"entrypointsInfo | gioFilterConnectorsByMode: 'REQUEST_RESPONSE'\"\n [steps]=\"flow.response ?? []\"\n [apiType]=\"apiType\"\n [genericPolicies]=\"genericPolicies\"\n [trialUrl]=\"trialUrl\"\n policyFlowPhase=\"RESPONSE\"\n (stepsChange)=\"onStepsChange('response', $event)\"\n ></gio-ps-flow-details-phase>\n }\n\n @if (apiType === 'NATIVE') {\n <mat-tab-group class=\"content__tabs\" dynamicHeight>\n <mat-tab label=\"Global\" bodyClass=\"content__tabs__body\">\n <gio-ps-flow-details-phase\n class=\"content__phase\"\n name=\"Connect phase\"\n description=\"Policies will be applied when the client connects to the Gateway\"\n [disabledNotYetAvailable]=\"true\"\n [readOnly]=\"readOnly\"\n [startConnector]=\"endpointsInfo | gioFilterConnectorsByMode: 'CONNECT'\"\n [endConnector]=\"entrypointsInfo | gioFilterConnectorsByMode: 'CONNECT'\"\n [steps]=\"flow.connect ?? []\"\n [apiType]=\"apiType\"\n [genericPolicies]=\"genericPolicies\"\n [trialUrl]=\"trialUrl\"\n policyFlowPhase=\"CONNECT\"\n (stepsChange)=\"onStepsChange('connect', $event)\"\n >\n </gio-ps-flow-details-phase>\n <gio-ps-flow-details-phase\n class=\"content__phase\"\n name=\"Interact phase\"\n description=\"Policies will be applied on all interactions between the client and the Gateway\"\n [readOnly]=\"readOnly\"\n [startConnector]=\"entrypointsInfo | gioFilterConnectorsByMode: 'INTERACT'\"\n [endConnector]=\"endpointsInfo | gioFilterConnectorsByMode: 'INTERACT'\"\n [steps]=\"flow.interact ?? []\"\n [apiType]=\"apiType\"\n [genericPolicies]=\"genericPolicies\"\n [trialUrl]=\"trialUrl\"\n policyFlowPhase=\"INTERACT\"\n (stepsChange)=\"onStepsChange('interact', $event)\"\n ></gio-ps-flow-details-phase>\n </mat-tab>\n <mat-tab label=\"Event messages\" bodyClass=\"content__tabs__body\">\n <gio-ps-flow-details-phase\n class=\"content__phase\"\n name=\"Publish phase\"\n description=\"Policies will be applied when publishing messages\"\n [readOnly]=\"readOnly\"\n [startConnector]=\"entrypointsInfo | gioFilterConnectorsByMode: 'PUBLISH'\"\n [endConnector]=\"endpointsInfo | gioFilterConnectorsByMode: 'PUBLISH'\"\n [steps]=\"flow.publish ?? []\"\n [apiType]=\"apiType\"\n [genericPolicies]=\"genericPolicies\"\n [trialUrl]=\"trialUrl\"\n policyFlowPhase=\"PUBLISH\"\n (stepsChange)=\"onStepsChange('publish', $event)\"\n ></gio-ps-flow-details-phase>\n <gio-ps-flow-details-phase\n class=\"content__phase\"\n name=\"Subscribe phase\"\n description=\"Policies will be applied when fetching messages\"\n [readOnly]=\"readOnly\"\n [startConnector]=\"endpointsInfo | gioFilterConnectorsByMode: 'SUBSCRIBE'\"\n [endConnector]=\"entrypointsInfo | gioFilterConnectorsByMode: 'SUBSCRIBE'\"\n [steps]=\"flow.subscribe ?? []\"\n [apiType]=\"apiType\"\n [genericPolicies]=\"genericPolicies\"\n [trialUrl]=\"trialUrl\"\n policyFlowPhase=\"SUBSCRIBE\"\n (stepsChange)=\"onStepsChange('subscribe', $event)\"\n ></gio-ps-flow-details-phase>\n </mat-tab>\n </mat-tab-group>\n }\n\n @if (apiType === 'MCP_PROXY') {\n <gio-ps-flow-details-phase\n class=\"content__phase\"\n name=\"Request phase\"\n description=\"Policies will be applied during the connection establishment\"\n [readOnly]=\"readOnly\"\n [startConnector]=\"entrypointsInfo | gioFilterConnectorsByMode: 'REQUEST_RESPONSE'\"\n [endConnector]=\"endpointsInfo | gioFilterConnectorsByMode: 'REQUEST_RESPONSE'\"\n [steps]=\"flow.request ?? []\"\n [apiType]=\"apiType\"\n [genericPolicies]=\"genericPolicies\"\n [trialUrl]=\"trialUrl\"\n policyFlowPhase=\"REQUEST\"\n (stepsChange)=\"onStepsChange('request', $event)\"\n ></gio-ps-flow-details-phase>\n <gio-ps-flow-details-phase\n class=\"content__phase\"\n name=\"Response phase\"\n description=\"Policies will be applied during the connection termination\"\n [readOnly]=\"readOnly\"\n [startConnector]=\"endpointsInfo | gioFilterConnectorsByMode: 'REQUEST_RESPONSE'\"\n [endConnector]=\"entrypointsInfo | gioFilterConnectorsByMode: 'REQUEST_RESPONSE'\"\n [steps]=\"flow.response ?? []\"\n [apiType]=\"apiType\"\n [genericPolicies]=\"genericPolicies\"\n [trialUrl]=\"trialUrl\"\n policyFlowPhase=\"RESPONSE\"\n (stepsChange)=\"onStepsChange('response', $event)\"\n ></gio-ps-flow-details-phase>\n }\n @if (apiType === 'LLM_PROXY') {\n <gio-ps-flow-details-phase\n class=\"content__phase\"\n name=\"Request phase\"\n description=\"Policies will be applied during the connection establishment\"\n [readOnly]=\"readOnly\"\n [startConnector]=\"entrypointsInfo | gioFilterConnectorsByMode: 'REQUEST_RESPONSE'\"\n [endConnector]=\"endpointsInfo | gioFilterConnectorsByMode: 'REQUEST_RESPONSE'\"\n [steps]=\"flow.request ?? []\"\n [apiType]=\"apiType\"\n [genericPolicies]=\"genericPolicies\"\n [trialUrl]=\"trialUrl\"\n policyFlowPhase=\"REQUEST\"\n (stepsChange)=\"onStepsChange('request', $event)\"\n ></gio-ps-flow-details-phase>\n <gio-ps-flow-details-phase\n class=\"content__phase\"\n name=\"Response phase\"\n description=\"Policies will be applied during the connection termination\"\n [readOnly]=\"readOnly\"\n [startConnector]=\"endpointsInfo | gioFilterConnectorsByMode: 'REQUEST_RESPONSE'\"\n [endConnector]=\"entrypointsInfo | gioFilterConnectorsByMode: 'REQUEST_RESPONSE'\"\n [steps]=\"flow.response ?? []\"\n [apiType]=\"apiType\"\n [genericPolicies]=\"genericPolicies\"\n [trialUrl]=\"trialUrl\"\n policyFlowPhase=\"RESPONSE\"\n (stepsChange)=\"onStepsChange('response', $event)\"\n ></gio-ps-flow-details-phase>\n }\n </div>\n } @else {\n <div class=\"emptyFlows\">\n <h2>No flows yet</h2>\n <p class=\"mat-body-1\">Flows allow you to customize the behavior of your API event phases through configurable policies</p>\n </div>\n }\n} @else {\n <div class=\"header loading\">\n <div class=\"header__label\">Flow details</div>\n <div class=\"header__configBtn\">\n <button class=\"header__configBtn__edit\" mat-stroked-button disabled>\n <mat-icon svgIcon=\"gio:edit-pencil\"></mat-icon>\n </button>\n <button class=\"header__configBtn__delete\" mat-stroked-button disabled>\n <mat-icon svgIcon=\"gio:trash\"></mat-icon>\n </button>\n </div>\n </div>\n <gio-ps-flow-details-info-bar class=\"infoBar loading\"></gio-ps-flow-details-info-bar>\n <div class=\"content loading\">\n <gio-loader></gio-loader>\n </div>\n}\n", styles: ["@charset \"UTF-8\";.gio-top-bar-menu .gio-badge-accent{background-color:var(--gio-oem-palette--active, #ffc2ac);color:var(--gio-oem-palette--active-contrast, #1e1b1b)}:host{display:flex;height:100%;flex-direction:column}.emptyFlows{display:flex;max-width:500px;height:100%;flex-direction:column;justify-content:center;margin:auto;text-align:center}.header{display:flex;align-items:center;padding:16px;border-bottom:1px solid #d2cecd}.header__label{font-family:Kanit,Helvetica Neue,sans-serif;font-size:16px;font-weight:500;letter-spacing:.4px;line-height:24px;display:flex;flex:1 1 auto;align-items:center;margin-bottom:0;gap:8px}.header__configBtn{display:flex;align-items:center;margin-left:8px;gap:8px}.infoBar{border-bottom:1px solid #d2cecd}.infoBar.loading{min-height:52px}.infoBar.flowDisabled{opacity:.5}.content{overflow:auto;flex:1 1 auto;background-color:#f7f7f8}.content.flowDisabled{opacity:.5}.content__tabs{min-height:100%;min-height:calc(100% - 64px)}.content__phase{margin:16px 16px 0}.content.loading{display:flex}\n"] }]
|
|
2244
2477
|
}], ctorParameters: () => [{ type: i1.MatDialog }], propDecorators: { readOnly: [{
|
|
2245
2478
|
type: Input
|
|
2246
2479
|
}], loading: [{
|
|
@@ -2461,7 +2694,7 @@ class GioPolicyStudioComponent {
|
|
|
2461
2694
|
this.genericPolicies = toGenericPolicies(this.policies ?? [], this.sharedPolicyGroupPolicies ?? []);
|
|
2462
2695
|
}
|
|
2463
2696
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: GioPolicyStudioComponent, deps: [{ token: GioPolicyStudioService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
2464
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.3", type: GioPolicyStudioComponent, isStandalone: true, selector: "gio-policy-studio", inputs: { readOnly: "readOnly", apiType: "apiType", flowExecution: "flowExecution", entrypointsInfo: "entrypointsInfo", endpointsInfo: "endpointsInfo", commonFlows: "commonFlows", plans: "plans", policies: ["policies", "policies", (policies) => policies ?? []], sharedPolicyGroupPolicies: "sharedPolicyGroupPolicies", trialUrl: "trialUrl", loading: "loading", policySchemaFetcher: "policySchemaFetcher", policyDocumentationFetcher: "policyDocumentationFetcher", selectedFlowIndexes: "selectedFlowIndexes" }, outputs: { selectedFlowChanged: "selectedFlowChanged", save: "save" }, usesOnChanges: true, ngImport: i0, template: "<!--\n\n Copyright (C) 2025 The Gravitee team (http://gravitee.io)\n \n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n \n http://www.apache.org/licenses/LICENSE-2.0\n \n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n-->\n\n<div class=\"header\">\n @if (!loading) {\n <div class=\"header__apiInfo\">\n <span class=\"gio-badge-primary\">\n {{ apiTypeDisplayable() }}\n </span>\n <span\n class=\"gio-badge-neutral\"\n [matTooltip]=\"connectorsTooltip\"\n matTooltipPosition=\"right\"\n matTooltipClass=\"gio-policy-studio__tooltip-line-break\"\n >\n @for (entrypoint of entrypointsInfo; track entrypoint) {\n <mat-icon class=\"gio-left\" [svgIcon]=\"entrypoint.icon\"></mat-icon>\n }\n @for (endpoint of endpointsInfo; track endpoint) {\n <mat-icon class=\"gio-left\" [svgIcon]=\"endpoint.icon\"></mat-icon>\n }\n </span>\n </div>\n } @else {\n <div class=\"header__apiInfo\">\n <span class=\"gio-badge-primary\"> </span>\n <span class=\"gio-badge-neutral\"> </span>\n </div>\n }\n\n <div class=\"header__btn\">\n @if (!saving) {\n <button mat-flat-button color=\"primary\" [disabled]=\"loading || disableSaveButton\" (click)=\"onSave()\">Save</button>\n }\n @if (saving) {\n <button mat-flat-button color=\"primary\" disabled>Saving...</button>\n }\n </div>\n</div>\n\n<div class=\"wrapper\">\n <div class=\"wrapper__flowsMenu\">\n <gio-ps-flows-menu\n [readOnly]=\"readOnly\"\n [loading]=\"loading\"\n [apiType]=\"apiType\"\n [flowExecution]=\"flowExecution\"\n [flowsGroups]=\"flowsGroups\"\n [entrypoints]=\"entrypointsInfo\"\n [entrypointsInfo]=\"entrypointsInfo\"\n (flowsGroupsChange)=\"onFlowsGroupsChange($event)\"\n (flowExecutionChange)=\"onFlowExecutionChange($event)\"\n [selectedFlowId]=\"selectedFlow?._id\"\n (selectedFlowIdChange)=\"onSelectFlow($event)\"\n (deleteFlow)=\"onDeleteSelectedFlow($event)\"\n ></gio-ps-flows-menu>\n </div>\n\n <div class=\"wrapper__flowDetails\">\n <gio-ps-flow-details\n [readOnly]=\"readOnly\"\n [loading]=\"loading\"\n [apiType]=\"apiType\"\n [flow]=\"selectedFlow\"\n [entrypointsInfo]=\"entrypointsInfo\"\n [endpointsInfo]=\"endpointsInfo\"\n [policies]=\"policies\"\n [genericPolicies]=\"genericPolicies\"\n [trialUrl]=\"trialUrl\"\n (flowChange)=\"onSelectedFlowChange($event)\"\n (deleteFlow)=\"onDeleteSelectedFlow($event)\"\n ></gio-ps-flow-details>\n </div>\n</div>\n", styles: ["@charset \"UTF-8\";.gio-top-bar-menu .gio-badge-accent{background-color:var(--gio-oem-palette--active, #ffc2ac);color:var(--gio-oem-palette--active-contrast, #1e1b1b)}:host{display:flex;height:100%;flex-direction:column;padding:16px;background-color:#fff}::ng-deep .gio-policy-studio__tooltip-line-break{white-space:pre-line}.header{display:flex;align-items:center;padding-bottom:16px}.header__apiInfo{flex:1 1 auto}.wrapper{display:flex;min-height:0;flex:1 1 auto;flex-direction:row;gap:16px}.wrapper__flowsMenu{overflow:hidden;min-width:230px;max-width:400px;flex:1 1 33%;border:1px solid #d2cecd;border-radius:8px}.wrapper__flowDetails{overflow:hidden;flex:1 1 66%;border:1px solid #d2cecd;border-radius:8px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i2$
|
|
2697
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.3", type: GioPolicyStudioComponent, isStandalone: true, selector: "gio-policy-studio", inputs: { readOnly: "readOnly", apiType: "apiType", flowExecution: "flowExecution", entrypointsInfo: "entrypointsInfo", endpointsInfo: "endpointsInfo", commonFlows: "commonFlows", plans: "plans", policies: ["policies", "policies", (policies) => policies ?? []], sharedPolicyGroupPolicies: "sharedPolicyGroupPolicies", trialUrl: "trialUrl", loading: "loading", policySchemaFetcher: "policySchemaFetcher", policyDocumentationFetcher: "policyDocumentationFetcher", selectedFlowIndexes: "selectedFlowIndexes" }, outputs: { selectedFlowChanged: "selectedFlowChanged", save: "save" }, usesOnChanges: true, ngImport: i0, template: "<!--\n\n Copyright (C) 2025 The Gravitee team (http://gravitee.io)\n \n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n \n http://www.apache.org/licenses/LICENSE-2.0\n \n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n-->\n\n<div class=\"header\">\n @if (!loading) {\n <div class=\"header__apiInfo\">\n <span class=\"gio-badge-primary\">\n {{ apiTypeDisplayable() }}\n </span>\n <span\n class=\"gio-badge-neutral\"\n [matTooltip]=\"connectorsTooltip\"\n matTooltipPosition=\"right\"\n matTooltipClass=\"gio-policy-studio__tooltip-line-break\"\n >\n @for (entrypoint of entrypointsInfo; track entrypoint) {\n <mat-icon class=\"gio-left\" [svgIcon]=\"entrypoint.icon\"></mat-icon>\n }\n @for (endpoint of endpointsInfo; track endpoint) {\n <mat-icon class=\"gio-left\" [svgIcon]=\"endpoint.icon\"></mat-icon>\n }\n </span>\n </div>\n } @else {\n <div class=\"header__apiInfo\">\n <span class=\"gio-badge-primary\"> </span>\n <span class=\"gio-badge-neutral\"> </span>\n </div>\n }\n\n <div class=\"header__btn\">\n @if (!saving) {\n <button mat-flat-button color=\"primary\" [disabled]=\"loading || disableSaveButton\" (click)=\"onSave()\">Save</button>\n }\n @if (saving) {\n <button mat-flat-button color=\"primary\" disabled>Saving...</button>\n }\n </div>\n</div>\n\n<div class=\"wrapper\">\n <div class=\"wrapper__flowsMenu\">\n <gio-ps-flows-menu\n [readOnly]=\"readOnly\"\n [loading]=\"loading\"\n [apiType]=\"apiType\"\n [flowExecution]=\"flowExecution\"\n [flowsGroups]=\"flowsGroups\"\n [entrypoints]=\"entrypointsInfo\"\n [entrypointsInfo]=\"entrypointsInfo\"\n (flowsGroupsChange)=\"onFlowsGroupsChange($event)\"\n (flowExecutionChange)=\"onFlowExecutionChange($event)\"\n [selectedFlowId]=\"selectedFlow?._id\"\n (selectedFlowIdChange)=\"onSelectFlow($event)\"\n (deleteFlow)=\"onDeleteSelectedFlow($event)\"\n ></gio-ps-flows-menu>\n </div>\n\n <div class=\"wrapper__flowDetails\">\n <gio-ps-flow-details\n [readOnly]=\"readOnly\"\n [loading]=\"loading\"\n [apiType]=\"apiType\"\n [flow]=\"selectedFlow\"\n [entrypointsInfo]=\"entrypointsInfo\"\n [endpointsInfo]=\"endpointsInfo\"\n [policies]=\"policies\"\n [genericPolicies]=\"genericPolicies\"\n [trialUrl]=\"trialUrl\"\n (flowChange)=\"onSelectedFlowChange($event)\"\n (deleteFlow)=\"onDeleteSelectedFlow($event)\"\n ></gio-ps-flow-details>\n </div>\n</div>\n", styles: ["@charset \"UTF-8\";.gio-top-bar-menu .gio-badge-accent{background-color:var(--gio-oem-palette--active, #ffc2ac);color:var(--gio-oem-palette--active-contrast, #1e1b1b)}:host{display:flex;height:100%;flex-direction:column;padding:16px;background-color:#fff}::ng-deep .gio-policy-studio__tooltip-line-break{white-space:pre-line}.header{display:flex;align-items:center;padding-bottom:16px}.header__apiInfo{flex:1 1 auto}.wrapper{display:flex;min-height:0;flex:1 1 auto;flex-direction:row;gap:16px}.wrapper__flowsMenu{overflow:hidden;min-width:230px;max-width:400px;flex:1 1 33%;border:1px solid #d2cecd;border-radius:8px}.wrapper__flowDetails{overflow:hidden;flex:1 1 66%;border:1px solid #d2cecd;border-radius:8px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i2$1.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i3.MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: GioIconsModule }, { kind: "component", type: i6$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: GioPolicyStudioFlowsMenuComponent, selector: "gio-ps-flows-menu", inputs: ["readOnly", "loading", "apiType", "flowExecution", "flowsGroups", "selectedFlowId", "entrypoints", "entrypointsInfo"], outputs: ["selectedFlowIdChange", "flowsGroupsChange", "flowExecutionChange", "deleteFlow"] }, { kind: "component", type: GioPolicyStudioDetailsComponent, selector: "gio-ps-flow-details", inputs: ["readOnly", "loading", "apiType", "flow", "entrypointsInfo", "endpointsInfo", "policies", "genericPolicies", "trialUrl"], outputs: ["flowChange", "deleteFlow"] }] }); }
|
|
2465
2698
|
}
|
|
2466
2699
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: GioPolicyStudioComponent, decorators: [{
|
|
2467
2700
|
type: Component,
|