@gravitee/ui-policy-studio-angular 15.13.0 → 16.0.0
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 +1 -1
- package/fesm2022/gravitee-ui-policy-studio-angular-testing.mjs.map +1 -1
- package/fesm2022/gravitee-ui-policy-studio-angular.mjs +92 -95
- package/fesm2022/gravitee-ui-policy-studio-angular.mjs.map +1 -1
- package/index.d.ts +404 -3
- package/package.json +7 -11
- package/testing/index.d.ts +369 -3
- package/esm2022/gravitee-ui-policy-studio-angular.mjs +0 -5
- package/esm2022/lib/components/filter-pipe/gio-flter-connectors-by-mode.pipe.mjs +0 -43
- package/esm2022/lib/components/flow-details/gio-ps-flow-details.component.mjs +0 -184
- package/esm2022/lib/components/flow-details-info-bar/gio-ps-flow-details-info-bar.component.mjs +0 -115
- package/esm2022/lib/components/flow-details-phase/gio-ps-flow-details-phase.component.mjs +0 -179
- package/esm2022/lib/components/flow-details-phase-step/gio-ps-flow-details-phase-step.component.mjs +0 -162
- package/esm2022/lib/components/flow-execution-form-dialog/gio-ps-flow-execution-form-dialog.component.mjs +0 -81
- package/esm2022/lib/components/flow-form-dialog/flow-message-form-dialog/gio-ps-flow-message-form-dialog.component.mjs +0 -109
- package/esm2022/lib/components/flow-form-dialog/flow-native-form-dialog/gio-ps-flow-native-form-dialog.component.mjs +0 -89
- package/esm2022/lib/components/flow-form-dialog/flow-proxy-form-dialog/gio-ps-flow-proxy-form-dialog.component.mjs +0 -135
- package/esm2022/lib/components/flow-form-dialog/gio-ps-flow-form-dialog-result.model.mjs +0 -2
- package/esm2022/lib/components/flows-menu/gio-ps-flows-menu.component.mjs +0 -432
- package/esm2022/lib/components/policies-catalog-dialog/gio-ps-policies-catalog-dialog.component.mjs +0 -165
- package/esm2022/lib/components/step-edit-dialog/gio-ps-step-edit-dialog.component.mjs +0 -53
- package/esm2022/lib/components/step-form/gio-ps-step-form.component.mjs +0 -158
- package/esm2022/lib/models/ApiProtocolType.mjs +0 -17
- package/esm2022/lib/models/ApiType.mjs +0 -17
- package/esm2022/lib/models/ConnectorsInfo.mjs +0 -2
- package/esm2022/lib/models/PolicySchemaFetcher.mjs +0 -2
- package/esm2022/lib/models/SaveOutput.mjs +0 -2
- package/esm2022/lib/models/flow/Flow.mjs +0 -2
- package/esm2022/lib/models/flow/FlowExecution.mjs +0 -17
- package/esm2022/lib/models/flow/HttpMethod.mjs +0 -43
- package/esm2022/lib/models/flow/Selector.mjs +0 -2
- package/esm2022/lib/models/flow/Step.mjs +0 -2
- package/esm2022/lib/models/flow/index.mjs +0 -21
- package/esm2022/lib/models/index.mjs +0 -24
- package/esm2022/lib/models/plan/Plan.mjs +0 -17
- package/esm2022/lib/models/plan/index.mjs +0 -17
- package/esm2022/lib/models/policy/GenericPolicy.mjs +0 -24
- package/esm2022/lib/models/policy/Policy.mjs +0 -44
- package/esm2022/lib/models/policy/SharedPolicyGroupPolicy.mjs +0 -17
- package/esm2022/lib/models/policy/index.mjs +0 -19
- package/esm2022/lib/policy-group-studio/gio-policy-group-studio.component.mjs +0 -228
- package/esm2022/lib/policy-studio/gio-policy-studio.component.mjs +0 -304
- package/esm2022/lib/policy-studio/gio-policy-studio.model.mjs +0 -17
- package/esm2022/lib/policy-studio/gio-policy-studio.service.mjs +0 -74
- package/esm2022/public-api.mjs +0 -22
- package/esm2022/testing/gravitee-ui-policy-studio-angular-testing.mjs +0 -5
- package/esm2022/testing/lib/components/flow-details/gio-ps-flow-details.harness.mjs +0 -56
- package/esm2022/testing/lib/components/flow-details-info-bar/gio-ps-flow-details-info-bar.harness.mjs +0 -35
- package/esm2022/testing/lib/components/flow-details-phase/gio-ps-flow-details-phase.harness.mjs +0 -155
- package/esm2022/testing/lib/components/flow-details-phase-step/gio-ps-flow-details-phase-step.harness.mjs +0 -69
- package/esm2022/testing/lib/components/flow-execution-form-dialog/gio-ps-flow-execution-form-dialog.harness.mjs +0 -60
- package/esm2022/testing/lib/components/flow-form-dialog/flow-message-form-dialog/gio-ps-flow-message-form-dialog.harness.mjs +0 -128
- package/esm2022/testing/lib/components/flow-form-dialog/flow-native-form-dialog/gio-ps-flow-native-form-dialog.harness.mjs +0 -50
- package/esm2022/testing/lib/components/flow-form-dialog/flow-proxy-form-dialog/gio-ps-flow-proxy-form-dialog.harness.mjs +0 -98
- package/esm2022/testing/lib/components/flows-menu/gio-ps-flows-menu.harness.mjs +0 -91
- package/esm2022/testing/lib/components/policies-catalog-dialog/gio-ps-policies-catalog-dialog.harness.mjs +0 -87
- package/esm2022/testing/lib/components/step-edit-dialog/gio-ps-step-edit-dialog.harness.mjs +0 -30
- package/esm2022/testing/lib/components/step-form/gio-ps-step-form.harness.mjs +0 -56
- package/esm2022/testing/lib/models/ApiProtocolType.mjs +0 -17
- package/esm2022/testing/lib/models/ApiType.mjs +0 -17
- package/esm2022/testing/lib/models/ConnectorsInfo.fixture.mjs +0 -182
- package/esm2022/testing/lib/models/ConnectorsInfo.mjs +0 -2
- package/esm2022/testing/lib/models/PolicySchemaFetcher.mjs +0 -2
- package/esm2022/testing/lib/models/SaveOutput.mjs +0 -2
- package/esm2022/testing/lib/models/flow/Flow.fixture.mjs +0 -122
- package/esm2022/testing/lib/models/flow/Flow.mjs +0 -2
- package/esm2022/testing/lib/models/flow/FlowExecution.fixture.mjs +0 -43
- package/esm2022/testing/lib/models/flow/FlowExecution.mjs +0 -17
- package/esm2022/testing/lib/models/flow/HttpMethod.mjs +0 -43
- package/esm2022/testing/lib/models/flow/Selector.mjs +0 -2
- package/esm2022/testing/lib/models/flow/Step.fixture.mjs +0 -92
- package/esm2022/testing/lib/models/flow/Step.mjs +0 -2
- package/esm2022/testing/lib/models/flow/index-testing.mjs +0 -19
- package/esm2022/testing/lib/models/flow/index.mjs +0 -21
- package/esm2022/testing/lib/models/index-testing.mjs +0 -20
- package/esm2022/testing/lib/models/index.mjs +0 -24
- package/esm2022/testing/lib/models/plan/Plan.fixture.mjs +0 -31
- package/esm2022/testing/lib/models/plan/Plan.mjs +0 -17
- package/esm2022/testing/lib/models/plan/index-testing.mjs +0 -17
- package/esm2022/testing/lib/models/plan/index.mjs +0 -17
- package/esm2022/testing/lib/models/policy/GenericPolicy.mjs +0 -24
- package/esm2022/testing/lib/models/policy/Policy.fixture.mjs +0 -194
- package/esm2022/testing/lib/models/policy/Policy.mjs +0 -44
- package/esm2022/testing/lib/models/policy/SharedPolicyGroupPolicy.mjs +0 -17
- package/esm2022/testing/lib/models/policy/index-testing.mjs +0 -17
- package/esm2022/testing/lib/models/policy/index.mjs +0 -19
- package/esm2022/testing/lib/policy-group-studio/gio-policy-group-studio.harness.mjs +0 -52
- package/esm2022/testing/lib/policy-studio/gio-policy-studio.harness.mjs +0 -202
- package/esm2022/testing/lib/policy-studio/gio-policy-studio.model.mjs +0 -17
- package/esm2022/testing/public-testing-api.mjs +0 -19
- package/lib/components/filter-pipe/gio-flter-connectors-by-mode.pipe.d.ts +0 -8
- package/lib/components/flow-details/gio-ps-flow-details.component.d.ts +0 -29
- package/lib/components/flow-details-info-bar/gio-ps-flow-details-info-bar.component.d.ts +0 -20
- package/lib/components/flow-details-phase/gio-ps-flow-details-phase.component.d.ts +0 -47
- package/lib/components/flow-details-phase-step/gio-ps-flow-details-phase-step.component.d.ts +0 -33
- package/lib/components/flow-execution-form-dialog/gio-ps-flow-execution-form-dialog.component.d.ts +0 -18
- package/lib/components/flow-form-dialog/flow-message-form-dialog/gio-ps-flow-message-form-dialog.component.d.ts +0 -21
- package/lib/components/flow-form-dialog/flow-native-form-dialog/gio-ps-flow-native-form-dialog.component.d.ts +0 -21
- package/lib/components/flow-form-dialog/flow-proxy-form-dialog/gio-ps-flow-proxy-form-dialog.component.d.ts +0 -24
- package/lib/components/flow-form-dialog/gio-ps-flow-form-dialog-result.model.d.ts +0 -2
- package/lib/components/flows-menu/gio-ps-flows-menu.component.d.ts +0 -57
- package/lib/components/policies-catalog-dialog/gio-ps-policies-catalog-dialog.component.d.ts +0 -47
- package/lib/components/step-edit-dialog/gio-ps-step-edit-dialog.component.d.ts +0 -24
- package/lib/components/step-form/gio-ps-step-form.component.d.ts +0 -35
- package/lib/models/ApiProtocolType.d.ts +0 -1
- package/lib/models/ApiType.d.ts +0 -1
- package/lib/models/ConnectorsInfo.d.ts +0 -7
- package/lib/models/PolicySchemaFetcher.d.ts +0 -5
- package/lib/models/SaveOutput.d.ts +0 -7
- package/lib/models/flow/Flow.d.ts +0 -24
- package/lib/models/flow/FlowExecution.d.ts +0 -11
- package/lib/models/flow/HttpMethod.d.ts +0 -3
- package/lib/models/flow/Selector.d.ts +0 -37
- package/lib/models/flow/Step.d.ts +0 -34
- package/lib/models/flow/index.d.ts +0 -5
- package/lib/models/index.d.ts +0 -8
- package/lib/models/plan/Plan.d.ts +0 -6
- package/lib/models/plan/index.d.ts +0 -1
- package/lib/models/policy/GenericPolicy.d.ts +0 -22
- package/lib/models/policy/Policy.d.ts +0 -28
- package/lib/models/policy/SharedPolicyGroupPolicy.d.ts +0 -11
- package/lib/models/policy/index.d.ts +0 -3
- package/lib/policy-group-studio/gio-policy-group-studio.component.d.ts +0 -70
- package/lib/policy-studio/gio-policy-studio.component.d.ts +0 -98
- package/lib/policy-studio/gio-policy-studio.model.d.ts +0 -17
- package/lib/policy-studio/gio-policy-studio.service.d.ts +0 -30
- package/public-api.d.ts +0 -3
- package/testing/lib/components/flow-details/gio-ps-flow-details.harness.d.ts +0 -12
- package/testing/lib/components/flow-details-info-bar/gio-ps-flow-details-info-bar.harness.d.ts +0 -5
- package/testing/lib/components/flow-details-phase/gio-ps-flow-details-phase.harness.d.ts +0 -69
- package/testing/lib/components/flow-details-phase-step/gio-ps-flow-details-phase-step.harness.d.ts +0 -21
- package/testing/lib/components/flow-execution-form-dialog/gio-ps-flow-execution-form-dialog.harness.d.ts +0 -13
- package/testing/lib/components/flow-form-dialog/flow-message-form-dialog/gio-ps-flow-message-form-dialog.harness.d.ts +0 -37
- package/testing/lib/components/flow-form-dialog/flow-native-form-dialog/gio-ps-flow-native-form-dialog.harness.d.ts +0 -17
- package/testing/lib/components/flow-form-dialog/flow-proxy-form-dialog/gio-ps-flow-proxy-form-dialog.harness.d.ts +0 -33
- package/testing/lib/components/flows-menu/gio-ps-flows-menu.harness.d.ts +0 -31
- package/testing/lib/components/policies-catalog-dialog/gio-ps-policies-catalog-dialog.harness.d.ts +0 -20
- package/testing/lib/components/step-edit-dialog/gio-ps-step-edit-dialog.harness.d.ts +0 -8
- package/testing/lib/components/step-form/gio-ps-step-form.harness.d.ts +0 -18
- package/testing/lib/models/ApiProtocolType.d.ts +0 -1
- package/testing/lib/models/ApiType.d.ts +0 -1
- package/testing/lib/models/ConnectorsInfo.d.ts +0 -7
- package/testing/lib/models/ConnectorsInfo.fixture.d.ts +0 -12
- package/testing/lib/models/PolicySchemaFetcher.d.ts +0 -5
- package/testing/lib/models/SaveOutput.d.ts +0 -7
- package/testing/lib/models/flow/Flow.d.ts +0 -24
- package/testing/lib/models/flow/Flow.fixture.d.ts +0 -6
- package/testing/lib/models/flow/FlowExecution.d.ts +0 -11
- package/testing/lib/models/flow/FlowExecution.fixture.d.ts +0 -3
- package/testing/lib/models/flow/HttpMethod.d.ts +0 -3
- package/testing/lib/models/flow/Selector.d.ts +0 -37
- package/testing/lib/models/flow/Step.d.ts +0 -34
- package/testing/lib/models/flow/Step.fixture.d.ts +0 -5
- package/testing/lib/models/flow/index-testing.d.ts +0 -3
- package/testing/lib/models/flow/index.d.ts +0 -5
- package/testing/lib/models/index-testing.d.ts +0 -4
- package/testing/lib/models/index.d.ts +0 -8
- package/testing/lib/models/plan/Plan.d.ts +0 -6
- package/testing/lib/models/plan/Plan.fixture.d.ts +0 -2
- package/testing/lib/models/plan/index-testing.d.ts +0 -1
- package/testing/lib/models/plan/index.d.ts +0 -1
- package/testing/lib/models/policy/GenericPolicy.d.ts +0 -22
- package/testing/lib/models/policy/Policy.d.ts +0 -28
- package/testing/lib/models/policy/Policy.fixture.d.ts +0 -4
- package/testing/lib/models/policy/SharedPolicyGroupPolicy.d.ts +0 -11
- package/testing/lib/models/policy/index-testing.d.ts +0 -1
- package/testing/lib/models/policy/index.d.ts +0 -3
- package/testing/lib/policy-group-studio/gio-policy-group-studio.harness.d.ts +0 -20
- package/testing/lib/policy-studio/gio-policy-studio.harness.d.ts +0 -78
- package/testing/lib/policy-studio/gio-policy-studio.model.d.ts +0 -17
- package/testing/public-testing-api.d.ts +0 -3
|
@@ -1,39 +1,39 @@
|
|
|
1
1
|
import { get, cloneDeep, uniqueId, capitalize, trim, isEmpty, flatten, uniq, toLower, isNil, has, filter, isEqual, differenceBy, omit, unionBy } from 'lodash';
|
|
2
2
|
import * as i0 from '@angular/core';
|
|
3
|
-
import {
|
|
3
|
+
import { Inject, Component, EventEmitter, Output, Input, Injectable, Pipe, ChangeDetectionStrategy } from '@angular/core';
|
|
4
4
|
import { Subject, BehaviorSubject, of, EMPTY, timer } from 'rxjs';
|
|
5
|
-
import * as
|
|
5
|
+
import * as i5$2 from '@angular/common';
|
|
6
6
|
import { CommonModule } from '@angular/common';
|
|
7
|
-
import * as
|
|
7
|
+
import * as i5$1 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
|
|
9
|
+
import * as i2$2 from '@angular/material/tooltip';
|
|
10
10
|
import { MatTooltipModule, MatTooltip } from '@angular/material/tooltip';
|
|
11
|
-
import * as
|
|
11
|
+
import * as i3 from '@angular/material/button';
|
|
12
12
|
import { MatButtonModule } from '@angular/material/button';
|
|
13
13
|
import * as i8 from '@angular/cdk/drag-drop';
|
|
14
14
|
import { moveItemInArray, transferArrayItem, DragDropModule } from '@angular/cdk/drag-drop';
|
|
15
|
-
import * as
|
|
15
|
+
import * as i2 from '@angular/forms';
|
|
16
16
|
import { UntypedFormGroup, UntypedFormControl, ReactiveFormsModule, FormControl } from '@angular/forms';
|
|
17
|
-
import * as
|
|
17
|
+
import * as i4 from '@angular/material/form-field';
|
|
18
18
|
import { MatFormFieldModule } from '@angular/material/form-field';
|
|
19
|
-
import * as
|
|
19
|
+
import * as i6$1 from '@angular/material/input';
|
|
20
20
|
import { MatInputModule } from '@angular/material/input';
|
|
21
|
-
import * as i7
|
|
21
|
+
import * as i7 from '@angular/material/menu';
|
|
22
22
|
import { MatMenuModule } from '@angular/material/menu';
|
|
23
23
|
import { debounceTime, startWith, distinctUntilChanged, tap, takeUntil, map, catchError } from 'rxjs/operators';
|
|
24
24
|
import * as i1 from '@angular/material/dialog';
|
|
25
25
|
import { MAT_DIALOG_DATA, MatDialogModule } from '@angular/material/dialog';
|
|
26
|
-
import * as
|
|
26
|
+
import * as i5 from '@angular/material/select';
|
|
27
27
|
import { MatSelectModule } from '@angular/material/select';
|
|
28
|
-
import * as
|
|
28
|
+
import * as i6 from '@angular/material/slide-toggle';
|
|
29
29
|
import { MatSlideToggleModule } from '@angular/material/slide-toggle';
|
|
30
|
-
import * as
|
|
30
|
+
import * as i2$1 from '@angular/material/icon';
|
|
31
31
|
import { MatIcon } from '@angular/material/icon';
|
|
32
|
-
import * as
|
|
32
|
+
import * as i2$3 from '@angular/material/tabs';
|
|
33
33
|
import { MatTabsModule } from '@angular/material/tabs';
|
|
34
|
-
import * as
|
|
34
|
+
import * as i5$3 from '@angular/material/chips';
|
|
35
35
|
import { MatChipsModule } from '@angular/material/chips';
|
|
36
|
-
import * as
|
|
36
|
+
import * as i6$2 from '@gravitee/ui-particles-angular/gio-asciidoctor';
|
|
37
37
|
import { GioAsciidoctorModule } from '@gravitee/ui-particles-angular/gio-asciidoctor';
|
|
38
38
|
import { MarkdownComponent } from 'ngx-markdown';
|
|
39
39
|
import { MatCommonModule } from '@angular/material/core';
|
|
@@ -331,13 +331,12 @@ class GioPolicyStudioFlowExecutionFormDialogComponent {
|
|
|
331
331
|
...flowExecutionToSave,
|
|
332
332
|
});
|
|
333
333
|
}
|
|
334
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
335
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "
|
|
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: i5$1.GioFormSlideToggleComponent, selector: "gio-form-slide-toggle", inputs: ["appearance"] }, { kind: "component", type: i5$1.GioFormLabelComponent, selector: "gio-form-label" }, { kind: "directive", type: i5$1.GioFormSlideToggleDirective, selector: "[gioFormSlideToggle]" }, { kind: "ngmodule", type: GioBannerModule }, { kind: "component", type: i5$1.GioBannerInfoComponent, selector: "gio-banner-info" }, { kind: "ngmodule", type: GioIconsModule }, { kind: "component", type: i2$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }] }); }
|
|
336
336
|
}
|
|
337
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
337
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: GioPolicyStudioFlowExecutionFormDialogComponent, decorators: [{
|
|
338
338
|
type: Component,
|
|
339
339
|
args: [{ imports: [
|
|
340
|
-
CommonModule,
|
|
341
340
|
ReactiveFormsModule,
|
|
342
341
|
MatButtonModule,
|
|
343
342
|
MatDialogModule,
|
|
@@ -347,7 +346,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.4", ngImpor
|
|
|
347
346
|
GioFormSlideToggleModule,
|
|
348
347
|
GioBannerModule,
|
|
349
348
|
GioIconsModule,
|
|
350
|
-
], selector: 'gio-ps-flow-execution-form-dialog', template: "<!--\n\n Copyright (C)
|
|
349
|
+
], selector: 'gio-ps-flow-execution-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 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"] }]
|
|
351
350
|
}], ctorParameters: () => [{ type: i1.MatDialogRef }, { type: undefined, decorators: [{
|
|
352
351
|
type: Inject,
|
|
353
352
|
args: [MAT_DIALOG_DATA]
|
|
@@ -418,13 +417,12 @@ class GioPolicyStudioFlowMessageFormDialogComponent {
|
|
|
418
417
|
...flowToSave,
|
|
419
418
|
});
|
|
420
419
|
}
|
|
421
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
422
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "
|
|
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: 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: MatSlideToggleModule }, { kind: "ngmodule", type: GioFormSlideToggleModule }, { kind: "ngmodule", type: GioBannerModule }, { kind: "ngmodule", type: GioIconsModule }, { kind: "component", type: i2$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: GioElAssistantComponent, selector: "gio-el-assistant" }] }); }
|
|
423
422
|
}
|
|
424
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
423
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: GioPolicyStudioFlowMessageFormDialogComponent, decorators: [{
|
|
425
424
|
type: Component,
|
|
426
425
|
args: [{ imports: [
|
|
427
|
-
CommonModule,
|
|
428
426
|
ReactiveFormsModule,
|
|
429
427
|
MatButtonModule,
|
|
430
428
|
MatDialogModule,
|
|
@@ -436,7 +434,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.4", ngImpor
|
|
|
436
434
|
GioBannerModule,
|
|
437
435
|
GioIconsModule,
|
|
438
436
|
GioElAssistantComponent,
|
|
439
|
-
], selector: 'gio-ps-flow-message-form-dialog', template: "<!--\n\n Copyright (C)
|
|
437
|
+
], selector: 'gio-ps-flow-message-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 }}<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"] }]
|
|
440
438
|
}], ctorParameters: () => [{ type: i1.MatDialogRef }, { type: undefined, decorators: [{
|
|
441
439
|
type: Inject,
|
|
442
440
|
args: [MAT_DIALOG_DATA]
|
|
@@ -488,13 +486,12 @@ class GioPolicyStudioFlowNativeFormDialogComponent {
|
|
|
488
486
|
const inputName = trim(this.flowFormGroup?.get('name')?.value);
|
|
489
487
|
return isEmpty(inputName) ? this.defaultFlowName : inputName;
|
|
490
488
|
}
|
|
491
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
492
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "
|
|
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: 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: MatSlideToggleModule }, { kind: "ngmodule", type: GioFormSlideToggleModule }, { kind: "ngmodule", type: GioBannerModule }, { kind: "ngmodule", type: GioIconsModule }, { kind: "component", type: i2$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: GioFormTagsInputModule }] }); }
|
|
493
491
|
}
|
|
494
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
492
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: GioPolicyStudioFlowNativeFormDialogComponent, decorators: [{
|
|
495
493
|
type: Component,
|
|
496
494
|
args: [{ imports: [
|
|
497
|
-
CommonModule,
|
|
498
495
|
ReactiveFormsModule,
|
|
499
496
|
MatButtonModule,
|
|
500
497
|
MatDialogModule,
|
|
@@ -506,7 +503,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.4", ngImpor
|
|
|
506
503
|
GioBannerModule,
|
|
507
504
|
GioIconsModule,
|
|
508
505
|
GioFormTagsInputModule,
|
|
509
|
-
], selector: 'gio-ps-flow-native-form-dialog', template: "<!--\n\n Copyright (C)
|
|
506
|
+
], selector: 'gio-ps-flow-native-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. 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"] }]
|
|
510
507
|
}], ctorParameters: () => [{ type: i1.MatDialogRef }, { type: undefined, decorators: [{
|
|
511
508
|
type: Inject,
|
|
512
509
|
args: [MAT_DIALOG_DATA]
|
|
@@ -578,13 +575,12 @@ class GioPolicyStudioFlowProxyFormDialogComponent {
|
|
|
578
575
|
tagValidationHook(tag, validationCb) {
|
|
579
576
|
validationCb(METHODS_AUTOCOMPLETE.map(m => `${m}`).includes(tag.toUpperCase()));
|
|
580
577
|
}
|
|
581
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
582
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "
|
|
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: 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: MatSlideToggleModule }, { kind: "ngmodule", type: GioFormSlideToggleModule }, { kind: "ngmodule", type: GioBannerModule }, { kind: "ngmodule", type: GioIconsModule }, { kind: "component", type: i2$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: GioFormTagsInputModule }, { kind: "component", type: i5$1.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" }] }); }
|
|
583
580
|
}
|
|
584
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
581
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: GioPolicyStudioFlowProxyFormDialogComponent, decorators: [{
|
|
585
582
|
type: Component,
|
|
586
583
|
args: [{ imports: [
|
|
587
|
-
CommonModule,
|
|
588
584
|
ReactiveFormsModule,
|
|
589
585
|
MatButtonModule,
|
|
590
586
|
MatDialogModule,
|
|
@@ -597,7 +593,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.4", ngImpor
|
|
|
597
593
|
GioIconsModule,
|
|
598
594
|
GioFormTagsInputModule,
|
|
599
595
|
GioElAssistantComponent,
|
|
600
|
-
], selector: 'gio-ps-flow-proxy-form-dialog', template: "<!--\n\n Copyright (C)
|
|
596
|
+
], selector: 'gio-ps-flow-proxy-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>\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"] }]
|
|
601
597
|
}], ctorParameters: () => [{ type: i1.MatDialogRef }, { type: undefined, decorators: [{
|
|
602
598
|
type: Inject,
|
|
603
599
|
args: [MAT_DIALOG_DATA]
|
|
@@ -985,10 +981,10 @@ class GioPolicyStudioFlowsMenuComponent {
|
|
|
985
981
|
this.flowsGroupsChange.emit(this.flowsGroups);
|
|
986
982
|
this.selectedFlowIdChange.emit(duplicatedFlow._id);
|
|
987
983
|
}
|
|
988
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
989
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.4", 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) 2023 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<div class=\"searchBar\" *ngIf=\"!loading\">\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 <button *ngIf=\"searchControl.value\" matSuffix mat-icon-button aria-label=\"Clear\" (click)=\"resetSearchTerm()\">\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n</div>\n\n<div class=\"list\" *ngIf=\"!loading; else loadingList\" cdkDropListGroup>\n <div\n *ngFor=\"let flowsGroup of filteredFlowGroupMenuItems\"\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\n <div class=\"list__flowsGroup__flows\">\n <ng-container *ngIf=\"flowsGroup.flows.length > 0; else noFlows\">\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 <div *ngIf=\"flow.name\" class=\"list__flowsGroup__flows__flow__left__name\" [attr.title]=\"flow.name\">\n {{ flow.name }}\n </div>\n @if (apiType !== 'NATIVE') {\n <div class=\"list__flowsGroup__flows__flow__left__infos\">\n <div class=\"list__flowsGroup__flows__flow__left__infos__badges\">\n <span\n *ngFor=\"let badge of flow.badges\"\n class=\"list__flowsGroup__flows__flow__left__infos__badges__badge\"\n [ngClass]=\"badge.class\"\n >{{ badge.label }}</span\n >\n </div>\n <div class=\"list__flowsGroup__flows__flow__left__infos__pathOrChannelLabel\">\n <span *ngIf=\"flow.pathOrChannelLabel; else emptyPathOrChannelLabel\" [attr.title]=\"flow.pathOrChannelLabel\">{{\n flow.pathOrChannelLabel\n }}</span>\n <ng-template #emptyPathOrChannelLabel>\n <em>Empty</em>\n </ng-template>\n </div>\n\n <span\n *ngIf=\"flow.hasCondition\"\n class=\"list__flowsGroup__flows__flow__left__infos__conditionBadge gio-badge-neutral\"\n matTooltip=\"Conditioned\"\n ><mat-icon svgIcon=\"gio:if\"></mat-icon\n ></span>\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 </ng-container>\n <ng-template #noFlows>\n <div class=\"list__flowsGroup__no-flows\">No flows yet</div>\n </ng-template>\n </div>\n </div>\n</div>\n\n<ng-template #loadingList>\n <div class=\"loadingList\">\n <gio-loader></gio-loader>\n </div>\n</ng-template>\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: i5$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i3$1.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i4.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i4.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: GioLoaderModule }, { kind: "component", type: i6$1.GioLoaderComponent, selector: "gio-loader" }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i7$2.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$2.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i7$2.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"], 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: i7$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: i5.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i5.MatPrefix, selector: "[matPrefix], [matIconPrefix], [matTextPrefix]", inputs: ["matTextPrefix"] }, { kind: "directive", type: i5.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i3.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: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: MatFormFieldModule }] }); }
|
|
984
|
+
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 }); }
|
|
985
|
+
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) {\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) {\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) {\n <span [attr.title]=\"flow.pathOrChannelLabel\">{{ 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$2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: GioLoaderModule }, { kind: "component", type: i5$1.GioLoaderComponent, selector: "gio-loader" }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i7.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.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i7.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 }] }); }
|
|
990
986
|
}
|
|
991
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
987
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: GioPolicyStudioFlowsMenuComponent, decorators: [{
|
|
992
988
|
type: Component,
|
|
993
989
|
args: [{ imports: [
|
|
994
990
|
GioIconsModule,
|
|
@@ -1001,7 +997,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.4", ngImpor
|
|
|
1001
997
|
MatInputModule,
|
|
1002
998
|
ReactiveFormsModule,
|
|
1003
999
|
MatFormFieldModule,
|
|
1004
|
-
], selector: 'gio-ps-flows-menu', template: "<!--\n\n Copyright (C) 2023 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<div class=\"searchBar\" *ngIf=\"!loading\">\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 <button *ngIf=\"searchControl.value\" matSuffix mat-icon-button aria-label=\"Clear\" (click)=\"resetSearchTerm()\">\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n</div>\n\n<div class=\"list\" *ngIf=\"!loading; else loadingList\" cdkDropListGroup>\n <div\n *ngFor=\"let flowsGroup of filteredFlowGroupMenuItems\"\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\n <div class=\"list__flowsGroup__flows\">\n <ng-container *ngIf=\"flowsGroup.flows.length > 0; else noFlows\">\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 <div *ngIf=\"flow.name\" class=\"list__flowsGroup__flows__flow__left__name\" [attr.title]=\"flow.name\">\n {{ flow.name }}\n </div>\n @if (apiType !== 'NATIVE') {\n <div class=\"list__flowsGroup__flows__flow__left__infos\">\n <div class=\"list__flowsGroup__flows__flow__left__infos__badges\">\n <span\n *ngFor=\"let badge of flow.badges\"\n class=\"list__flowsGroup__flows__flow__left__infos__badges__badge\"\n [ngClass]=\"badge.class\"\n >{{ badge.label }}</span\n >\n </div>\n <div class=\"list__flowsGroup__flows__flow__left__infos__pathOrChannelLabel\">\n <span *ngIf=\"flow.pathOrChannelLabel; else emptyPathOrChannelLabel\" [attr.title]=\"flow.pathOrChannelLabel\">{{\n flow.pathOrChannelLabel\n }}</span>\n <ng-template #emptyPathOrChannelLabel>\n <em>Empty</em>\n </ng-template>\n </div>\n\n <span\n *ngIf=\"flow.hasCondition\"\n class=\"list__flowsGroup__flows__flow__left__infos__conditionBadge gio-badge-neutral\"\n matTooltip=\"Conditioned\"\n ><mat-icon svgIcon=\"gio:if\"></mat-icon\n ></span>\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 </ng-container>\n <ng-template #noFlows>\n <div class=\"list__flowsGroup__no-flows\">No flows yet</div>\n </ng-template>\n </div>\n </div>\n</div>\n\n<ng-template #loadingList>\n <div class=\"loadingList\">\n <gio-loader></gio-loader>\n </div>\n</ng-template>\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"] }]
|
|
1000
|
+
], 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) {\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) {\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) {\n <span [attr.title]=\"flow.pathOrChannelLabel\">{{ 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"] }]
|
|
1005
1001
|
}], ctorParameters: () => [{ type: i1.MatDialog }], propDecorators: { readOnly: [{
|
|
1006
1002
|
type: Input
|
|
1007
1003
|
}], loading: [{
|
|
@@ -1088,10 +1084,10 @@ class GioPolicyStudioService {
|
|
|
1088
1084
|
this.documentationsCache[policy.id] = new BehaviorSubject(documentation);
|
|
1089
1085
|
}));
|
|
1090
1086
|
}
|
|
1091
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
1092
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "
|
|
1087
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: GioPolicyStudioService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
1088
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: GioPolicyStudioService, providedIn: 'root' }); }
|
|
1093
1089
|
}
|
|
1094
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
1090
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: GioPolicyStudioService, decorators: [{
|
|
1095
1091
|
type: Injectable,
|
|
1096
1092
|
args: [{
|
|
1097
1093
|
providedIn: 'root',
|
|
@@ -1196,10 +1192,10 @@ class GioPolicyStudioStepFormComponent {
|
|
|
1196
1192
|
configuration,
|
|
1197
1193
|
});
|
|
1198
1194
|
}
|
|
1199
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
1200
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "
|
|
1195
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: GioPolicyStudioStepFormComponent, deps: [{ token: GioPolicyStudioService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
1196
|
+
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: 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.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: i5$1.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: i5$1.GioLoaderComponent, selector: "gio-loader" }, { kind: "ngmodule", type: GioBannerModule }, { kind: "component", type: i5$1.GioBannerWarningComponent, selector: "gio-banner-warning" }, { kind: "directive", type: i5$1.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" }] }); }
|
|
1201
1197
|
}
|
|
1202
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
1198
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: GioPolicyStudioStepFormComponent, decorators: [{
|
|
1203
1199
|
type: Component,
|
|
1204
1200
|
args: [{ imports: [
|
|
1205
1201
|
CommonModule,
|
|
@@ -1216,7 +1212,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.4", ngImpor
|
|
|
1216
1212
|
MatIcon,
|
|
1217
1213
|
PopoverTriggerDirective,
|
|
1218
1214
|
GioElAssistantComponent,
|
|
1219
|
-
], selector: 'gio-ps-step-form', template: "<!--\n\n Copyright (C)
|
|
1215
|
+
], selector: 'gio-ps-step-form', 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"] }]
|
|
1220
1216
|
}], ctorParameters: () => [{ type: GioPolicyStudioService }], propDecorators: { readOnly: [{
|
|
1221
1217
|
type: Input
|
|
1222
1218
|
}], step: [{
|
|
@@ -1352,10 +1348,10 @@ class GioPolicyStudioPoliciesCatalogDialogComponent {
|
|
|
1352
1348
|
this.isValid = false;
|
|
1353
1349
|
this.isUnlicensed = false;
|
|
1354
1350
|
}
|
|
1355
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
1356
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.4", type: GioPolicyStudioPoliciesCatalogDialogComponent, isStandalone: true, selector: "gio-ps-policies-catalog-dialog", ngImport: i0, template: "<!--\n\n Copyright (C) 2015 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 <mat-dialog-content *ngIf=\"!selectedPolicy\" 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 <button\n matIconSuffix\n mat-icon-button\n aria-label=\"Clear\"\n *ngIf=\"filtersForm.get('search')?.value\"\n (click)=\"filtersForm.get('search')?.setValue('')\"\n >\n <mat-icon svgIcon=\"gio:cancel\"></mat-icon>\n </button>\n </mat-form-field>\n <mat-chip-listbox\n *ngIf=\"categories.length > 1\"\n class=\"policiesCatalog__filters__categories\"\n aria-label=\"Categories selection\"\n multiple\n formControlName=\"categories\"\n >\n <mat-chip-option *ngFor=\"let category of categories\" [selected]=\"category\" [value]=\"category\"\n >{{ category | titlecase }}\n </mat-chip-option>\n </mat-chip-listbox>\n </div>\n\n <div *ngIf=\"policies.length; else emptyPoliciesTpl\" class=\"policiesCatalog__list\">\n <div *ngFor=\"let policy of policies\" 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\n <span *ngIf=\"policy.name\" class=\"policiesCatalog__list__policy__head__name\">{{ policy.name }}</span>\n\n <span\n *ngIf=\"policy.genericPolicy.type === 'SHARED_POLICY_GROUP'\"\n class=\"gio-badge-neutral policiesCatalog__list__policy__head__badge\"\n matTooltip=\"Shared Policy Group\"\n >\n <mat-icon svgIcon=\"gio:users\"></mat-icon>\n </span>\n </div>\n\n <div class=\"policiesCatalog__list__policy__enterprise\" *ngIf=\"policy.deployed === false\">\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 <div *ngIf=\"policy.description\" 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 </div>\n </mat-dialog-content>\n</ng-container>\n\n<ng-template #emptyPoliciesTpl>\n <div class=\"emptyPoliciesCatalog\">No policies available.</div>\n</ng-template>\n\n<mat-dialog-content *ngIf=\"selectedPolicy\" class=\"policyForm\">\n <gio-banner *ngIf=\"isUnlicensed\" 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 <a *ngIf=\"trialUrl\" mat-stroked-button [href]=\"trialUrl\" target=\"_blank\">Request upgrade</a>\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\n <span *ngIf=\"selectedPolicy.name\" class=\"policyForm__info__head__name\">{{ selectedPolicy.name }}</span>\n\n <span *ngIf=\"selectedPolicy.type === 'SHARED_POLICY_GROUP'\" class=\"gio-badge-neutral policiesCatalog__list__policy__head__badge\">\n <mat-icon svgIcon=\"gio:users\"></mat-icon> Shared Policy Group\n </span>\n </div>\n\n <div *ngIf=\"selectedPolicy.description\" class=\"policyForm__info__description\">{{ selectedPolicy.description }}</div>\n </div>\n\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<mat-dialog-actions class=\"actions\" align=\"end\">\n <button class=\"actions__cancelBtn\" mat-button [mat-dialog-close]=\"\">Cancel</button>\n <button\n *ngIf=\"selectedPolicy\"\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</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: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i2.TitleCasePipe, name: "titlecase" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i3.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: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i4.MatAnchor, selector: "a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button]", exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: i4.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i4.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { 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: i5.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i5.MatLabel, selector: "mat-label" }, { kind: "directive", type: i5.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: MatChipsModule }, { kind: "component", type: i6$2.MatChipListbox, selector: "mat-chip-listbox", inputs: ["multiple", "aria-orientation", "selectable", "compareWith", "required", "hideSingleSelectionIndicator", "value"], outputs: ["change"] }, { kind: "component", type: i6$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: i7$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: i6$1.GioBannerComponent, selector: "gio-banner", inputs: ["type", "icon", "collapsible"] }, { kind: "directive", type: i6$1.GioBannerBodyDirective, selector: "[gioBannerBody]" }, { kind: "directive", type: i6$1.GioBannerActionDirective, selector: "[gioBannerAction]" }, { kind: "ngmodule", type: GioIconsModule }, { kind: "component", type: i5$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"] }] }); }
|
|
1351
|
+
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 }); }
|
|
1352
|
+
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: 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: i5$1.GioBannerComponent, selector: "gio-banner", inputs: ["type", "icon", "collapsible"] }, { kind: "directive", type: i5$1.GioBannerBodyDirective, selector: "[gioBannerBody]" }, { kind: "directive", type: i5$1.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$2.TitleCasePipe, name: "titlecase" }] }); }
|
|
1357
1353
|
}
|
|
1358
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
1354
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: GioPolicyStudioPoliciesCatalogDialogComponent, decorators: [{
|
|
1359
1355
|
type: Component,
|
|
1360
1356
|
args: [{ imports: [
|
|
1361
1357
|
CommonModule,
|
|
@@ -1369,7 +1365,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.4", ngImpor
|
|
|
1369
1365
|
GioIconsModule,
|
|
1370
1366
|
GioPolicyStudioStepFormComponent,
|
|
1371
1367
|
MatTooltip,
|
|
1372
|
-
], selector: 'gio-ps-policies-catalog-dialog', template: "<!--\n\n Copyright (C)
|
|
1368
|
+
], selector: 'gio-ps-policies-catalog-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 @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"] }]
|
|
1373
1369
|
}], ctorParameters: () => [{ type: i1.MatDialogRef }, { type: undefined, decorators: [{
|
|
1374
1370
|
type: Inject,
|
|
1375
1371
|
args: [MAT_DIALOG_DATA]
|
|
@@ -1406,12 +1402,12 @@ class GioPolicyStudioStepEditDialogComponent {
|
|
|
1406
1402
|
...this.step,
|
|
1407
1403
|
});
|
|
1408
1404
|
}
|
|
1409
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
1410
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "
|
|
1405
|
+
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 }); }
|
|
1406
|
+
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: 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"] }] }); }
|
|
1411
1407
|
}
|
|
1412
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
1408
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: GioPolicyStudioStepEditDialogComponent, decorators: [{
|
|
1413
1409
|
type: Component,
|
|
1414
|
-
args: [{ imports: [
|
|
1410
|
+
args: [{ imports: [MatButtonModule, MatDialogModule, GioIconsModule, GioPolicyStudioStepFormComponent], selector: 'gio-ps-step-edit-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 <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"] }]
|
|
1415
1411
|
}], ctorParameters: () => [{ type: i1.MatDialogRef }, { type: undefined, decorators: [{
|
|
1416
1412
|
type: Inject,
|
|
1417
1413
|
args: [MAT_DIALOG_DATA]
|
|
@@ -1527,12 +1523,12 @@ ${this.policyNotFound === 'SHARED_POLICY_GROUP' ? 'Note: The Gateway will ignore
|
|
|
1527
1523
|
onMoveLeft() {
|
|
1528
1524
|
this.movedLeft.emit();
|
|
1529
1525
|
}
|
|
1530
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
1531
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "
|
|
1526
|
+
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 }); }
|
|
1527
|
+
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: i2$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.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.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i7.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$2.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }] }); }
|
|
1532
1528
|
}
|
|
1533
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
1529
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: GioPolicyStudioDetailsPhaseStepComponent, decorators: [{
|
|
1534
1530
|
type: Component,
|
|
1535
|
-
args: [{ imports: [
|
|
1531
|
+
args: [{ imports: [GioIconsModule, MatButtonModule, MatMenuModule, MatTooltipModule], selector: 'gio-ps-flow-details-phase-step', 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"] }]
|
|
1536
1532
|
}], ctorParameters: () => [{ type: i1.MatDialog }], propDecorators: { readOnly: [{
|
|
1537
1533
|
type: Input
|
|
1538
1534
|
}], step: [{
|
|
@@ -1695,12 +1691,12 @@ class GioPolicyStudioDetailsPhaseComponent {
|
|
|
1695
1691
|
}
|
|
1696
1692
|
this.stepsChange.emit([...this.steps.slice(0, index - 1), this.steps[index], this.steps[index - 1], ...this.steps.slice(index + 1)]);
|
|
1697
1693
|
}
|
|
1698
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
1699
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "
|
|
1694
|
+
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 }); }
|
|
1695
|
+
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$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: 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: i2$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: GioBannerModule }, { kind: "component", type: i5$1.GioBannerInfoComponent, selector: "gio-banner-info" }, { kind: "component", type: i5$1.GioBannerWarningComponent, selector: "gio-banner-warning" }, { kind: "directive", type: i5$1.GioBannerBodyDirective, selector: "[gioBannerBody]" }] }); }
|
|
1700
1696
|
}
|
|
1701
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
1697
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: GioPolicyStudioDetailsPhaseComponent, decorators: [{
|
|
1702
1698
|
type: Component,
|
|
1703
|
-
args: [{ imports: [
|
|
1699
|
+
args: [{ imports: [MatTooltipModule, MatButtonModule, GioPolicyStudioDetailsPhaseStepComponent, GioIconsModule, GioBannerModule], selector: 'gio-ps-flow-details-phase', 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"] }]
|
|
1704
1700
|
}], ctorParameters: () => [{ type: i1.MatDialog }], propDecorators: { readOnly: [{
|
|
1705
1701
|
type: Input
|
|
1706
1702
|
}], steps: [{
|
|
@@ -1756,10 +1752,10 @@ class GioFilterConnectorsByModePipe {
|
|
|
1756
1752
|
}
|
|
1757
1753
|
return [];
|
|
1758
1754
|
}
|
|
1759
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
1760
|
-
static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "
|
|
1755
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: GioFilterConnectorsByModePipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
|
|
1756
|
+
static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.3.3", ngImport: i0, type: GioFilterConnectorsByModePipe, isStandalone: true, name: "gioFilterConnectorsByMode" }); }
|
|
1761
1757
|
}
|
|
1762
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
1758
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: GioFilterConnectorsByModePipe, decorators: [{
|
|
1763
1759
|
type: Pipe,
|
|
1764
1760
|
args: [{
|
|
1765
1761
|
standalone: true,
|
|
@@ -1786,6 +1782,12 @@ class GioPolicyStudioDetailsInfoBarComponent {
|
|
|
1786
1782
|
constructor() {
|
|
1787
1783
|
this.flow = undefined;
|
|
1788
1784
|
}
|
|
1785
|
+
ngOnChanges(changes) {
|
|
1786
|
+
if (changes['flow']) {
|
|
1787
|
+
// Invalidate cache when flow changes
|
|
1788
|
+
this._methods = undefined;
|
|
1789
|
+
}
|
|
1790
|
+
}
|
|
1789
1791
|
get condition() {
|
|
1790
1792
|
const conditionSelector = this.flow?.selectors?.find(s => s.type === 'CONDITION');
|
|
1791
1793
|
if (!conditionSelector) {
|
|
@@ -1846,28 +1848,24 @@ class GioPolicyStudioDetailsInfoBarComponent {
|
|
|
1846
1848
|
return httpSelector?.pathOperator;
|
|
1847
1849
|
}
|
|
1848
1850
|
get methods() {
|
|
1849
|
-
|
|
1850
|
-
|
|
1851
|
-
|
|
1851
|
+
if (this._methods === undefined && this.flow) {
|
|
1852
|
+
const httpSelector = this.flow.selectors?.find(s => s.type === 'HTTP');
|
|
1853
|
+
if (!httpSelector) {
|
|
1854
|
+
this._methods = null; // Cache null to avoid recomputation
|
|
1855
|
+
return undefined;
|
|
1856
|
+
}
|
|
1857
|
+
this._methods = httpSelector?.methods?.length
|
|
1858
|
+
? httpSelector.methods.map(m => ({ name: m, class: `gio-method-badge-${m.toLowerCase()}` }))
|
|
1859
|
+
: [{ name: 'ALL', class: 'gio-badge-neutral' }];
|
|
1852
1860
|
}
|
|
1853
|
-
return
|
|
1854
|
-
? httpSelector?.methods.map(m => ({
|
|
1855
|
-
name: m,
|
|
1856
|
-
class: `gio-method-badge-${m.toLowerCase()}`,
|
|
1857
|
-
}))
|
|
1858
|
-
: [
|
|
1859
|
-
{
|
|
1860
|
-
name: 'ALL',
|
|
1861
|
-
class: 'gio-badge-neutral',
|
|
1862
|
-
},
|
|
1863
|
-
];
|
|
1861
|
+
return this._methods === null ? undefined : this._methods;
|
|
1864
1862
|
}
|
|
1865
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
1866
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "
|
|
1863
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: GioPolicyStudioDetailsInfoBarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
1864
|
+
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<!-- Condition -->\n\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: i2$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatCommonModule }] }); }
|
|
1867
1865
|
}
|
|
1868
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
1866
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: GioPolicyStudioDetailsInfoBarComponent, decorators: [{
|
|
1869
1867
|
type: Component,
|
|
1870
|
-
args: [{ imports: [CommonModule, GioIconsModule, MatCommonModule], selector: 'gio-ps-flow-details-info-bar', template: "<!--\n\n Copyright (C)
|
|
1868
|
+
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<!-- Condition -->\n\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"] }]
|
|
1871
1869
|
}], propDecorators: { flow: [{
|
|
1872
1870
|
type: Input
|
|
1873
1871
|
}], entrypointsInfo: [{
|
|
@@ -1995,13 +1993,12 @@ class GioPolicyStudioDetailsComponent {
|
|
|
1995
1993
|
_hasChanged: true,
|
|
1996
1994
|
});
|
|
1997
1995
|
}
|
|
1998
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
1999
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.4", 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) 2023 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<ng-container *ngIf=\"!loading; then flowDetailsTpl; else loadingTpl\"></ng-container>\n\n<ng-template #flowDetailsTpl>\n <ng-container *ngIf=\"flow; else emptyFlows\">\n <div class=\"header\">\n <div class=\"header__label\">\n Flow details\n <div *ngIf=\"!flow.enabled\" class=\"gio-badge gio-badge-neutral\">Disabled</div>\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 <mat-tab-group *ngIf=\"apiType === 'MESSAGE'\" 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 <ng-container *ngIf=\"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 </ng-container>\n\n <mat-tab-group *ngIf=\"apiType === 'NATIVE'\" 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 </div>\n </ng-container>\n\n <ng-template #emptyFlows>\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 </ng-template>\n</ng-template>\n\n<ng-template #loadingTpl>\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</ng-template>\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: CommonModule }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: MatTabsModule }, { kind: "component", type: i3$2.MatTab, selector: "mat-tab", inputs: ["disabled", "label", "aria-label", "aria-labelledby", "labelClass", "bodyClass"], exportAs: ["matTab"] }, { kind: "component", type: i3$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: i4.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "ngmodule", type: GioIconsModule }, { kind: "component", type: i5$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: "pipe", type: GioFilterConnectorsByModePipe, name: "gioFilterConnectorsByMode" }, { kind: "ngmodule", type: GioLoaderModule }, { kind: "component", type: i6$1.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: i3$1.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: GioBannerModule }] }); }
|
|
1996
|
+
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 }); }
|
|
1997
|
+
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 </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: i5$1.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" }] }); }
|
|
2000
1998
|
}
|
|
2001
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
1999
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: GioPolicyStudioDetailsComponent, decorators: [{
|
|
2002
2000
|
type: Component,
|
|
2003
2001
|
args: [{ imports: [
|
|
2004
|
-
CommonModule,
|
|
2005
2002
|
MatTabsModule,
|
|
2006
2003
|
MatButtonModule,
|
|
2007
2004
|
GioIconsModule,
|
|
@@ -2011,7 +2008,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.4", ngImpor
|
|
|
2011
2008
|
GioPolicyStudioDetailsInfoBarComponent,
|
|
2012
2009
|
MatTooltipModule,
|
|
2013
2010
|
GioBannerModule,
|
|
2014
|
-
], selector: 'gio-ps-flow-details', template: "<!--\n\n Copyright (C) 2023 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<ng-container *ngIf=\"!loading; then flowDetailsTpl; else loadingTpl\"></ng-container>\n\n<ng-template #flowDetailsTpl>\n <ng-container *ngIf=\"flow; else emptyFlows\">\n <div class=\"header\">\n <div class=\"header__label\">\n Flow details\n <div *ngIf=\"!flow.enabled\" class=\"gio-badge gio-badge-neutral\">Disabled</div>\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 <mat-tab-group *ngIf=\"apiType === 'MESSAGE'\" 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 <ng-container *ngIf=\"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 </ng-container>\n\n <mat-tab-group *ngIf=\"apiType === 'NATIVE'\" 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 </div>\n </ng-container>\n\n <ng-template #emptyFlows>\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 </ng-template>\n</ng-template>\n\n<ng-template #loadingTpl>\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</ng-template>\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"] }]
|
|
2011
|
+
], 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 </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"] }]
|
|
2015
2012
|
}], ctorParameters: () => [{ type: i1.MatDialog }], propDecorators: { readOnly: [{
|
|
2016
2013
|
type: Input
|
|
2017
2014
|
}], loading: [{
|
|
@@ -2221,10 +2218,10 @@ class GioPolicyStudioComponent {
|
|
|
2221
2218
|
initGenericPolicies() {
|
|
2222
2219
|
this.genericPolicies = toGenericPolicies(this.policies ?? [], this.sharedPolicyGroupPolicies ?? []);
|
|
2223
2220
|
}
|
|
2224
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
2225
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "
|
|
2221
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: GioPolicyStudioComponent, deps: [{ token: GioPolicyStudioService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
2222
|
+
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 {{ apiType | titlecase }}\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$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: "ngmodule", type: GioIconsModule }, { kind: "component", type: i2$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"] }, { kind: "pipe", type: i5$2.TitleCasePipe, name: "titlecase" }] }); }
|
|
2226
2223
|
}
|
|
2227
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
2224
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: GioPolicyStudioComponent, decorators: [{
|
|
2228
2225
|
type: Component,
|
|
2229
2226
|
args: [{ imports: [
|
|
2230
2227
|
CommonModule,
|
|
@@ -2233,7 +2230,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.4", ngImpor
|
|
|
2233
2230
|
GioIconsModule,
|
|
2234
2231
|
GioPolicyStudioFlowsMenuComponent,
|
|
2235
2232
|
GioPolicyStudioDetailsComponent,
|
|
2236
|
-
], selector: 'gio-policy-studio', template: "<!--\n\n Copyright (C)
|
|
2233
|
+
], selector: 'gio-policy-studio', 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 {{ apiType | titlecase }}\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"] }]
|
|
2237
2234
|
}], ctorParameters: () => [{ type: GioPolicyStudioService }], propDecorators: { readOnly: [{
|
|
2238
2235
|
type: Input
|
|
2239
2236
|
}], apiType: [{
|
|
@@ -2512,10 +2509,10 @@ class GioPolicyGroupStudioComponent {
|
|
|
2512
2509
|
this.steps = steps;
|
|
2513
2510
|
this.policyGroupChange.emit(steps);
|
|
2514
2511
|
}
|
|
2515
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
2516
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "
|
|
2512
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: GioPolicyGroupStudioComponent, deps: [{ token: GioPolicyStudioService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
2513
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.3", type: GioPolicyGroupStudioComponent, isStandalone: true, selector: "gio-policy-group-studio", inputs: { policies: ["policies", "policies", (policies) => policies ?? []], readOnly: "readOnly", apiType: "apiType", executionPhase: "executionPhase", flowPhase: "flowPhase", policySchemaFetcher: "policySchemaFetcher", policyDocumentationFetcher: "policyDocumentationFetcher", policyGroup: "policyGroup" }, outputs: { policyGroupChange: "policyGroupChange" }, usesOnChanges: true, ngImport: i0, template: "<!--\n\n Copyright (C) 2024 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 (!isLoading && policyGroupVM) {\n <gio-ps-flow-details-phase\n class=\"content__phase\"\n [name]=\"policyGroupVM.name\"\n [description]=\"policyGroupVM.description\"\n [readOnly]=\"readOnly\"\n [startConnector]=\"startConnector\"\n [endConnector]=\"endConnector\"\n [steps]=\"steps\"\n [apiType]=\"apiType\"\n [genericPolicies]=\"genericPolicies\"\n [trialUrl]=\"trialUrl\"\n [policyFlowPhase]=\"flowPhase\"\n (stepsChange)=\"onStepsChange($event)\"\n ></gio-ps-flow-details-phase>\n} @else {\n <gio-loader></gio-loader>\n}\n", styles: [""], dependencies: [{ 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: GioFormJsonSchemaModule }, { kind: "ngmodule", type: GioLoaderModule }, { kind: "component", type: i5$1.GioLoaderComponent, selector: "gio-loader" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
2517
2514
|
}
|
|
2518
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
2515
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: GioPolicyGroupStudioComponent, decorators: [{
|
|
2519
2516
|
type: Component,
|
|
2520
2517
|
args: [{ selector: 'gio-policy-group-studio', imports: [GioPolicyStudioDetailsPhaseComponent, GioFormJsonSchemaModule, GioLoaderModule], changeDetection: ChangeDetectionStrategy.OnPush, template: "<!--\n\n Copyright (C) 2024 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 (!isLoading && policyGroupVM) {\n <gio-ps-flow-details-phase\n class=\"content__phase\"\n [name]=\"policyGroupVM.name\"\n [description]=\"policyGroupVM.description\"\n [readOnly]=\"readOnly\"\n [startConnector]=\"startConnector\"\n [endConnector]=\"endConnector\"\n [steps]=\"steps\"\n [apiType]=\"apiType\"\n [genericPolicies]=\"genericPolicies\"\n [trialUrl]=\"trialUrl\"\n [policyFlowPhase]=\"flowPhase\"\n (stepsChange)=\"onStepsChange($event)\"\n ></gio-ps-flow-details-phase>\n} @else {\n <gio-loader></gio-loader>\n}\n" }]
|
|
2521
2518
|
}], ctorParameters: () => [{ type: GioPolicyStudioService }], propDecorators: { policies: [{
|