@gravitee/ui-policy-studio-angular 7.4.0 → 7.5.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/esm2020/lib/components/flow-form-dialog/gio-ps-flow-form-dialog.component.mjs +5 -2
- package/esm2020/lib/components/flows-menu/gio-ps-flows-menu.component.mjs +3 -3
- package/esm2020/lib/gio-policy-studio.component.mjs +51 -8
- package/esm2020/lib/gio-policy-studio.model.mjs +1 -1
- package/esm2020/lib/models/index.mjs +2 -2
- package/fesm2015/gravitee-ui-policy-studio-angular.mjs +55 -10
- package/fesm2015/gravitee-ui-policy-studio-angular.mjs.map +1 -1
- package/fesm2020/gravitee-ui-policy-studio-angular.mjs +55 -9
- package/fesm2020/gravitee-ui-policy-studio-angular.mjs.map +1 -1
- package/lib/gio-policy-studio.component.d.ts +12 -2
- package/lib/gio-policy-studio.model.d.ts +2 -1
- package/lib/models/index.d.ts +1 -1
- package/package.json +1 -1
|
@@ -17,7 +17,7 @@ import * as i5 from '@angular/material/select';
|
|
|
17
17
|
import { MatSelectModule } from '@angular/material/select';
|
|
18
18
|
import * as i8 from '@angular/forms';
|
|
19
19
|
import { FormGroup, FormControl, ReactiveFormsModule } from '@angular/forms';
|
|
20
|
-
import { cloneDeep, uniqueId, capitalize, flatten } from 'lodash';
|
|
20
|
+
import { cloneDeep, uniqueId, capitalize, flatten, omit } from 'lodash';
|
|
21
21
|
import * as i3 from '@angular/material/icon';
|
|
22
22
|
import * as i6 from '@angular/material/core';
|
|
23
23
|
import { tap } from 'rxjs/operators';
|
|
@@ -98,7 +98,7 @@ class GioPolicyStudioFlowFormDialogComponent {
|
|
|
98
98
|
const conditionSelector = (_e = (_d = flowDialogData === null || flowDialogData === void 0 ? void 0 : flowDialogData.flow) === null || _d === void 0 ? void 0 : _d.selectors) === null || _e === void 0 ? void 0 : _e.find(s => s.type === 'CONDITION');
|
|
99
99
|
this.flowFormGroup = new FormGroup({
|
|
100
100
|
name: new FormControl((_g = (_f = flowDialogData === null || flowDialogData === void 0 ? void 0 : flowDialogData.flow) === null || _f === void 0 ? void 0 : _f.name) !== null && _g !== void 0 ? _g : ''),
|
|
101
|
-
channelOperator: new FormControl((_h = channelSelector === null || channelSelector === void 0 ? void 0 : channelSelector.channelOperator) !== null && _h !== void 0 ? _h : ''),
|
|
101
|
+
channelOperator: new FormControl((_h = channelSelector === null || channelSelector === void 0 ? void 0 : channelSelector.channelOperator) !== null && _h !== void 0 ? _h : 'EQUALS'),
|
|
102
102
|
channel: new FormControl((_j = channelSelector === null || channelSelector === void 0 ? void 0 : channelSelector.channel) !== null && _j !== void 0 ? _j : ''),
|
|
103
103
|
operations: new FormControl((_k = channelSelector === null || channelSelector === void 0 ? void 0 : channelSelector.operations) !== null && _k !== void 0 ? _k : []),
|
|
104
104
|
entrypoints: new FormControl((_l = channelSelector === null || channelSelector === void 0 ? void 0 : channelSelector.entrypoints) !== null && _l !== void 0 ? _l : []),
|
|
@@ -123,7 +123,11 @@ class GioPolicyStudioFlowFormDialogComponent {
|
|
|
123
123
|
: undefined;
|
|
124
124
|
const flowToSave = Object.assign(Object.assign({
|
|
125
125
|
// New id for new flow
|
|
126
|
-
_id: uniqueId('flow_') }, this.existingFlow), {
|
|
126
|
+
_id: uniqueId('flow_') }, this.existingFlow), {
|
|
127
|
+
// Mark as changed
|
|
128
|
+
_hasChanged: true,
|
|
129
|
+
// Add changes
|
|
130
|
+
name: (_m = (_l = this.flowFormGroup) === null || _l === void 0 ? void 0 : _l.get('name')) === null || _m === void 0 ? void 0 : _m.value, selectors: conditionSelectorToSave ? [chanelSelectorToSave, conditionSelectorToSave] : [chanelSelectorToSave], enabled: true });
|
|
127
131
|
this.dialogRef.close(Object.assign({}, flowToSave));
|
|
128
132
|
}
|
|
129
133
|
}
|
|
@@ -305,10 +309,10 @@ class GioPolicyStudioFlowsMenuComponent {
|
|
|
305
309
|
}
|
|
306
310
|
}
|
|
307
311
|
GioPolicyStudioFlowsMenuComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: GioPolicyStudioFlowsMenuComponent, deps: [{ token: i1.MatDialog }], target: i0.ɵɵFactoryTarget.Component });
|
|
308
|
-
GioPolicyStudioFlowsMenuComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.12", type: GioPolicyStudioFlowsMenuComponent, selector: "gio-ps-flows-menu", inputs: { flowsGroups: "flowsGroups", selectedFlow: "selectedFlow", entrypoints: "entrypoints" }, outputs: { selectedFlowChange: "selectedFlowChange", flowsGroupsChange: "flowsGroupsChange" }, 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 <div class=\"header__configBtn\">\n <button mat-stroked-button mat-icon-button><mat-icon svgIcon=\"gio:settings\"></mat-icon></button>\n </div>\n</div>\n\n<div class=\"list\">\n <div *ngFor=\"let flowsGroup of flowsGroupsVMSelected\" class=\"list__flowsGroup\">\n <div class=\"list__flowsGroup__header\">\n <div class=\"list__flowsGroup__header__label\">\n <mat-icon *ngIf=\"flowsGroup.
|
|
312
|
+
GioPolicyStudioFlowsMenuComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.12", type: GioPolicyStudioFlowsMenuComponent, selector: "gio-ps-flows-menu", inputs: { flowsGroups: "flowsGroups", selectedFlow: "selectedFlow", entrypoints: "entrypoints" }, outputs: { selectedFlowChange: "selectedFlowChange", flowsGroupsChange: "flowsGroupsChange" }, 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 <div class=\"header__configBtn\">\n <button mat-stroked-button mat-icon-button><mat-icon svgIcon=\"gio:settings\"></mat-icon></button>\n </div>\n</div>\n\n<div class=\"list\">\n <div *ngFor=\"let flowsGroup of flowsGroupsVMSelected\" class=\"list__flowsGroup\">\n <div class=\"list__flowsGroup__header\">\n <div class=\"list__flowsGroup__header__label\">\n <mat-icon *ngIf=\"flowsGroup._icon\" [svgIcon]=\"flowsGroup._icon\"></mat-icon>\n <span>{{ flowsGroup.name }}</span>\n </div>\n <div class=\"list__flowsGroup__header__addBtn\">\n <button mat-icon-button (click)=\"onAddFlow(flowsGroup)\"><mat-icon svgIcon=\"gio:plus\" matTooltip=\"New flow\"></mat-icon></button>\n </div>\n </div>\n\n <div\n *ngFor=\"let flow of flowsGroup.flows\"\n class=\"list__flowsGroup__flow\"\n [class.selected]=\"flow.selected\"\n (click)=\"selectFlow(flow)\"\n (mouseout)=\"flow.mouseOver = false\"\n (mouseover)=\"flow.mouseOver = true\"\n >\n <div *ngIf=\"flow.name\" class=\"list__flowsGroup__flow__name\" [attr.title]=\"flow.name\">\n {{ flow.name }}\n </div>\n <div class=\"list__flowsGroup__flow__infos\">\n <div class=\"list__flowsGroup__flow__infos__badges\">\n <span *ngFor=\"let badge of flow.badges\" class=\"list__flowsGroup__flow__infos__badges__badge\" [ngClass]=\"badge.class\">{{\n badge.label\n }}</span>\n </div>\n <div class=\"list__flowsGroup__flow__infos__pathOrChannelLabel\">{{ flow.pathOrChannelLabel }}</div>\n </div>\n </div>\n </div>\n</div>\n", styles: [":host{display:flex;max-height:100%;flex-direction:column;padding-top:16px}.header{display:flex;align-items:center;padding:0 16px;margin-bottom:16px}.header__label{font:600 16px/24px Golos UI,Roboto,Helvetica Neue,sans-serif;letter-spacing:.4px;display:flex;flex:1 1 auto;align-items:center;margin-bottom:0;gap:8px}.header__configBtn{margin-left:8px}.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 8px 8px 10px;border-radius:8px;background-color:#cdc5f7}.list__flowsGroup__header__label{font:600 14px/20px Golos UI,Roboto,Helvetica Neue,sans-serif;letter-spacing:.4px;display:flex;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__flow{display:flex;height:68px;flex-direction:column;justify-content:center;padding:7px;border:1px solid #d3d5dc;border-radius:8px;gap:8px}.list__flowsGroup__flow:hover,.list__flowsGroup__flow.selected{padding:6px;border:2px solid #876fec;cursor:pointer}.list__flowsGroup__flow__name{overflow:hidden;padding-left:4px;text-overflow:ellipsis;white-space:nowrap}.list__flowsGroup__flow__infos{display:flex;align-items:center}.list__flowsGroup__flow__infos__badges{flex:0 0 auto}.list__flowsGroup__flow__infos__badges__badge{width:auto}.list__flowsGroup__flow__infos__pathOrChannelLabel{flex:1 1 auto}\n"], components: [{ type: i3.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i2.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }], directives: [{ type: i4$1.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { type: i5$1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i5$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i5$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] });
|
|
309
313
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: GioPolicyStudioFlowsMenuComponent, decorators: [{
|
|
310
314
|
type: Component,
|
|
311
|
-
args: [{ 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 <div class=\"header__configBtn\">\n <button mat-stroked-button mat-icon-button><mat-icon svgIcon=\"gio:settings\"></mat-icon></button>\n </div>\n</div>\n\n<div class=\"list\">\n <div *ngFor=\"let flowsGroup of flowsGroupsVMSelected\" class=\"list__flowsGroup\">\n <div class=\"list__flowsGroup__header\">\n <div class=\"list__flowsGroup__header__label\">\n <mat-icon *ngIf=\"flowsGroup.
|
|
315
|
+
args: [{ 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 <div class=\"header__configBtn\">\n <button mat-stroked-button mat-icon-button><mat-icon svgIcon=\"gio:settings\"></mat-icon></button>\n </div>\n</div>\n\n<div class=\"list\">\n <div *ngFor=\"let flowsGroup of flowsGroupsVMSelected\" class=\"list__flowsGroup\">\n <div class=\"list__flowsGroup__header\">\n <div class=\"list__flowsGroup__header__label\">\n <mat-icon *ngIf=\"flowsGroup._icon\" [svgIcon]=\"flowsGroup._icon\"></mat-icon>\n <span>{{ flowsGroup.name }}</span>\n </div>\n <div class=\"list__flowsGroup__header__addBtn\">\n <button mat-icon-button (click)=\"onAddFlow(flowsGroup)\"><mat-icon svgIcon=\"gio:plus\" matTooltip=\"New flow\"></mat-icon></button>\n </div>\n </div>\n\n <div\n *ngFor=\"let flow of flowsGroup.flows\"\n class=\"list__flowsGroup__flow\"\n [class.selected]=\"flow.selected\"\n (click)=\"selectFlow(flow)\"\n (mouseout)=\"flow.mouseOver = false\"\n (mouseover)=\"flow.mouseOver = true\"\n >\n <div *ngIf=\"flow.name\" class=\"list__flowsGroup__flow__name\" [attr.title]=\"flow.name\">\n {{ flow.name }}\n </div>\n <div class=\"list__flowsGroup__flow__infos\">\n <div class=\"list__flowsGroup__flow__infos__badges\">\n <span *ngFor=\"let badge of flow.badges\" class=\"list__flowsGroup__flow__infos__badges__badge\" [ngClass]=\"badge.class\">{{\n badge.label\n }}</span>\n </div>\n <div class=\"list__flowsGroup__flow__infos__pathOrChannelLabel\">{{ flow.pathOrChannelLabel }}</div>\n </div>\n </div>\n </div>\n</div>\n", styles: [":host{display:flex;max-height:100%;flex-direction:column;padding-top:16px}.header{display:flex;align-items:center;padding:0 16px;margin-bottom:16px}.header__label{font:600 16px/24px Golos UI,Roboto,Helvetica Neue,sans-serif;letter-spacing:.4px;display:flex;flex:1 1 auto;align-items:center;margin-bottom:0;gap:8px}.header__configBtn{margin-left:8px}.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 8px 8px 10px;border-radius:8px;background-color:#cdc5f7}.list__flowsGroup__header__label{font:600 14px/20px Golos UI,Roboto,Helvetica Neue,sans-serif;letter-spacing:.4px;display:flex;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__flow{display:flex;height:68px;flex-direction:column;justify-content:center;padding:7px;border:1px solid #d3d5dc;border-radius:8px;gap:8px}.list__flowsGroup__flow:hover,.list__flowsGroup__flow.selected{padding:6px;border:2px solid #876fec;cursor:pointer}.list__flowsGroup__flow__name{overflow:hidden;padding-left:4px;text-overflow:ellipsis;white-space:nowrap}.list__flowsGroup__flow__infos{display:flex;align-items:center}.list__flowsGroup__flow__infos__badges{flex:0 0 auto}.list__flowsGroup__flow__infos__badges__badge{width:auto}.list__flowsGroup__flow__infos__pathOrChannelLabel{flex:1 1 auto}\n"] }]
|
|
312
316
|
}], ctorParameters: function () { return [{ type: i1.MatDialog }]; }, propDecorators: { flowsGroups: [{
|
|
313
317
|
type: Input
|
|
314
318
|
}], selectedFlow: [{
|
|
@@ -348,10 +352,19 @@ class GioPolicyStudioComponent {
|
|
|
348
352
|
this.endpointsInfo = [];
|
|
349
353
|
this.commonFlows = [];
|
|
350
354
|
this.plans = [];
|
|
355
|
+
/**
|
|
356
|
+
* Return common flows if they have been updated.
|
|
357
|
+
*/
|
|
358
|
+
this.commonFlowsChange = new EventEmitter();
|
|
359
|
+
/**
|
|
360
|
+
* Return the list of plans with updated flows. Plans with no updated flows are not returned.
|
|
361
|
+
**/
|
|
362
|
+
this.plansToUpdate = new EventEmitter();
|
|
351
363
|
this.connectorsTooltip = '';
|
|
352
364
|
this.selectedFlow = undefined;
|
|
353
365
|
this.flowsGroups = [];
|
|
354
366
|
this.entrypointsType = [];
|
|
367
|
+
this.disableSaveButton = true;
|
|
355
368
|
}
|
|
356
369
|
ngOnChanges(changes) {
|
|
357
370
|
var _a, _b, _c, _d, _e;
|
|
@@ -362,6 +375,7 @@ class GioPolicyStudioComponent {
|
|
|
362
375
|
this.entrypointsType = ((_c = this.entrypointsInfo) !== null && _c !== void 0 ? _c : []).map(e => e.type);
|
|
363
376
|
}
|
|
364
377
|
if (changes.commonFlows || changes.plans) {
|
|
378
|
+
this.disableSaveButton = true;
|
|
365
379
|
this.flowsGroups = getFlowsGroups(this.commonFlows, this.plans);
|
|
366
380
|
// Select first flow by default on first load
|
|
367
381
|
if (((_d = changes.commonFlows) === null || _d === void 0 ? void 0 : _d.isFirstChange()) || ((_e = changes.plans) === null || _e === void 0 ? void 0 : _e.isFirstChange())) {
|
|
@@ -371,10 +385,12 @@ class GioPolicyStudioComponent {
|
|
|
371
385
|
}
|
|
372
386
|
onFlowsGroupsChange(flowsGroups) {
|
|
373
387
|
this.flowsGroups = flowsGroups;
|
|
388
|
+
this.disableSaveButton = false;
|
|
374
389
|
}
|
|
375
390
|
onSelectedFlowChange(flow) {
|
|
376
391
|
this.flowsGroups = this.flowsGroups.map(flowGroup => (Object.assign(Object.assign({}, flowGroup), { flows: flowGroup.flows.map(f => (f._id === flow._id ? flow : f)) })));
|
|
377
392
|
this.selectedFlow = flow;
|
|
393
|
+
this.disableSaveButton = false;
|
|
378
394
|
}
|
|
379
395
|
onDeleteSelectedFlow(flow) {
|
|
380
396
|
var _a, _b;
|
|
@@ -385,13 +401,26 @@ class GioPolicyStudioComponent {
|
|
|
385
401
|
this.flowsGroups = this.flowsGroups.map(flowGroup => (Object.assign(Object.assign({}, flowGroup), { flows: flowGroup.flows.filter(f => f._id !== flow._id) })));
|
|
386
402
|
this.selectedFlow = (_b = this.flowsGroups
|
|
387
403
|
.find(flowGroup => flowGroup.flows.some(f => f._id === nextSelectedFlow))) === null || _b === void 0 ? void 0 : _b.flows.find(f => f._id === nextSelectedFlow);
|
|
404
|
+
this.disableSaveButton = false;
|
|
405
|
+
}
|
|
406
|
+
onSave() {
|
|
407
|
+
// Emit common flows only if they have been updated
|
|
408
|
+
const commonFlows = getCommonFlowsOutput(this.flowsGroups);
|
|
409
|
+
if (commonFlows != null) {
|
|
410
|
+
this.commonFlowsChange.emit(commonFlows);
|
|
411
|
+
}
|
|
412
|
+
// Emit plans only if they have been updated
|
|
413
|
+
const plans = getPlansChangeOutput(this.flowsGroups);
|
|
414
|
+
if (plans != null) {
|
|
415
|
+
this.plansToUpdate.emit(plans);
|
|
416
|
+
}
|
|
388
417
|
}
|
|
389
418
|
}
|
|
390
419
|
GioPolicyStudioComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: GioPolicyStudioComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
391
|
-
GioPolicyStudioComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.12", type: GioPolicyStudioComponent, selector: "gio-policy-studio", inputs: { apiType: "apiType", entrypointsInfo: "entrypointsInfo", endpointsInfo: "endpointsInfo", commonFlows: "commonFlows", plans: "plans" }, usesOnChanges: true, 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\n<div class=\"header\">\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 <mat-icon *ngFor=\"let entrypoint of entrypointsInfo\" class=\"gio-left\" [svgIcon]=\"entrypoint.icon\"></mat-icon>\n <mat-icon *ngFor=\"let endpoint of endpointsInfo\" class=\"gio-left\" [svgIcon]=\"endpoint.icon\"></mat-icon>\n </span>\n </div>\n\n <div class=\"header__btn\">\n <button mat-stroked-button color=\"primary\">Save</button>\n </div>\n</div>\n\n<div class=\"wrapper\">\n <div class=\"wrapper__flowsMenu\">\n <gio-ps-flows-menu\n [flowsGroups]=\"flowsGroups\"\n [entrypoints]=\"entrypointsType\"\n (flowsGroupsChange)=\"onFlowsGroupsChange($event)\"\n [(selectedFlow)]=\"selectedFlow\"\n ></gio-ps-flows-menu>\n </div>\n\n <div class=\"wrapper__flowDetails\">\n <gio-ps-flow-details\n [flow]=\"selectedFlow\"\n [entrypoints]=\"entrypointsType\"\n (flowChange)=\"onSelectedFlowChange($event)\"\n (deleteFlow)=\"onDeleteSelectedFlow($event)\"\n ></gio-ps-flow-details>\n </div>\n</div>\n", styles: [":host{display:flex;height:100%;flex-direction:column;padding:8px;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{max-width:400px;flex:0 1 400px;border:1px solid #d3d5dc;border-radius:8px}.wrapper__flowDetails{flex:1 1 auto;padding:16px;border:1px solid #d3d5dc;border-radius:8px}\n"], components: [{ type: i3.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i2.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { type: GioPolicyStudioFlowsMenuComponent, selector: "gio-ps-flows-menu", inputs: ["flowsGroups", "selectedFlow", "entrypoints"], outputs: ["selectedFlowChange", "flowsGroupsChange"] }, { type: GioPolicyStudioDetailsComponent, selector: "gio-ps-flow-details", inputs: ["flow", "entrypoints"], outputs: ["flowChange", "deleteFlow"] }], directives: [{ type: i4$1.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { type: i5$1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], pipes: { "titlecase": i5$1.TitleCasePipe } });
|
|
420
|
+
GioPolicyStudioComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.12", type: GioPolicyStudioComponent, selector: "gio-policy-studio", inputs: { apiType: "apiType", entrypointsInfo: "entrypointsInfo", endpointsInfo: "endpointsInfo", commonFlows: "commonFlows", plans: "plans" }, outputs: { commonFlowsChange: "commonFlowsChange", plansToUpdate: "plansToUpdate" }, usesOnChanges: true, 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\n<div class=\"header\">\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 <mat-icon *ngFor=\"let entrypoint of entrypointsInfo\" class=\"gio-left\" [svgIcon]=\"entrypoint.icon\"></mat-icon>\n <mat-icon *ngFor=\"let endpoint of endpointsInfo\" class=\"gio-left\" [svgIcon]=\"endpoint.icon\"></mat-icon>\n </span>\n </div>\n\n <div class=\"header__btn\">\n <button mat-stroked-button color=\"primary\" [disabled]=\"disableSaveButton\" (click)=\"onSave()\">Save</button>\n </div>\n</div>\n\n<div class=\"wrapper\">\n <div class=\"wrapper__flowsMenu\">\n <gio-ps-flows-menu\n [flowsGroups]=\"flowsGroups\"\n [entrypoints]=\"entrypointsType\"\n (flowsGroupsChange)=\"onFlowsGroupsChange($event)\"\n [(selectedFlow)]=\"selectedFlow\"\n ></gio-ps-flows-menu>\n </div>\n\n <div class=\"wrapper__flowDetails\">\n <gio-ps-flow-details\n [flow]=\"selectedFlow\"\n [entrypoints]=\"entrypointsType\"\n (flowChange)=\"onSelectedFlowChange($event)\"\n (deleteFlow)=\"onDeleteSelectedFlow($event)\"\n ></gio-ps-flow-details>\n </div>\n</div>\n", styles: [":host{display:flex;height:100%;flex-direction:column;padding:8px;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{max-width:400px;flex:0 1 400px;border:1px solid #d3d5dc;border-radius:8px}.wrapper__flowDetails{flex:1 1 auto;padding:16px;border:1px solid #d3d5dc;border-radius:8px}\n"], components: [{ type: i3.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i2.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { type: GioPolicyStudioFlowsMenuComponent, selector: "gio-ps-flows-menu", inputs: ["flowsGroups", "selectedFlow", "entrypoints"], outputs: ["selectedFlowChange", "flowsGroupsChange"] }, { type: GioPolicyStudioDetailsComponent, selector: "gio-ps-flow-details", inputs: ["flow", "entrypoints"], outputs: ["flowChange", "deleteFlow"] }], directives: [{ type: i4$1.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { type: i5$1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], pipes: { "titlecase": i5$1.TitleCasePipe } });
|
|
392
421
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: GioPolicyStudioComponent, decorators: [{
|
|
393
422
|
type: Component,
|
|
394
|
-
args: [{ selector: 'gio-policy-studio', 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\n<div class=\"header\">\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 <mat-icon *ngFor=\"let entrypoint of entrypointsInfo\" class=\"gio-left\" [svgIcon]=\"entrypoint.icon\"></mat-icon>\n <mat-icon *ngFor=\"let endpoint of endpointsInfo\" class=\"gio-left\" [svgIcon]=\"endpoint.icon\"></mat-icon>\n </span>\n </div>\n\n <div class=\"header__btn\">\n <button mat-stroked-button color=\"primary\">Save</button>\n </div>\n</div>\n\n<div class=\"wrapper\">\n <div class=\"wrapper__flowsMenu\">\n <gio-ps-flows-menu\n [flowsGroups]=\"flowsGroups\"\n [entrypoints]=\"entrypointsType\"\n (flowsGroupsChange)=\"onFlowsGroupsChange($event)\"\n [(selectedFlow)]=\"selectedFlow\"\n ></gio-ps-flows-menu>\n </div>\n\n <div class=\"wrapper__flowDetails\">\n <gio-ps-flow-details\n [flow]=\"selectedFlow\"\n [entrypoints]=\"entrypointsType\"\n (flowChange)=\"onSelectedFlowChange($event)\"\n (deleteFlow)=\"onDeleteSelectedFlow($event)\"\n ></gio-ps-flow-details>\n </div>\n</div>\n", styles: [":host{display:flex;height:100%;flex-direction:column;padding:8px;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{max-width:400px;flex:0 1 400px;border:1px solid #d3d5dc;border-radius:8px}.wrapper__flowDetails{flex:1 1 auto;padding:16px;border:1px solid #d3d5dc;border-radius:8px}\n"] }]
|
|
423
|
+
args: [{ selector: 'gio-policy-studio', 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\n<div class=\"header\">\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 <mat-icon *ngFor=\"let entrypoint of entrypointsInfo\" class=\"gio-left\" [svgIcon]=\"entrypoint.icon\"></mat-icon>\n <mat-icon *ngFor=\"let endpoint of endpointsInfo\" class=\"gio-left\" [svgIcon]=\"endpoint.icon\"></mat-icon>\n </span>\n </div>\n\n <div class=\"header__btn\">\n <button mat-stroked-button color=\"primary\" [disabled]=\"disableSaveButton\" (click)=\"onSave()\">Save</button>\n </div>\n</div>\n\n<div class=\"wrapper\">\n <div class=\"wrapper__flowsMenu\">\n <gio-ps-flows-menu\n [flowsGroups]=\"flowsGroups\"\n [entrypoints]=\"entrypointsType\"\n (flowsGroupsChange)=\"onFlowsGroupsChange($event)\"\n [(selectedFlow)]=\"selectedFlow\"\n ></gio-ps-flows-menu>\n </div>\n\n <div class=\"wrapper__flowDetails\">\n <gio-ps-flow-details\n [flow]=\"selectedFlow\"\n [entrypoints]=\"entrypointsType\"\n (flowChange)=\"onSelectedFlowChange($event)\"\n (deleteFlow)=\"onDeleteSelectedFlow($event)\"\n ></gio-ps-flow-details>\n </div>\n</div>\n", styles: [":host{display:flex;height:100%;flex-direction:column;padding:8px;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{max-width:400px;flex:0 1 400px;border:1px solid #d3d5dc;border-radius:8px}.wrapper__flowDetails{flex:1 1 auto;padding:16px;border:1px solid #d3d5dc;border-radius:8px}\n"] }]
|
|
395
424
|
}], propDecorators: { apiType: [{
|
|
396
425
|
type: Input
|
|
397
426
|
}], entrypointsInfo: [{
|
|
@@ -402,23 +431,39 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImpo
|
|
|
402
431
|
type: Input
|
|
403
432
|
}], plans: [{
|
|
404
433
|
type: Input
|
|
434
|
+
}], commonFlowsChange: [{
|
|
435
|
+
type: Output
|
|
436
|
+
}], plansToUpdate: [{
|
|
437
|
+
type: Output
|
|
405
438
|
}] } });
|
|
406
439
|
const getFlowsGroups = (commonFlows = [], plans = []) => {
|
|
407
440
|
const commFlowsGroup = {
|
|
408
441
|
_id: 'flowsGroup_commonFlow',
|
|
409
442
|
name: 'Common flows',
|
|
410
|
-
flows: commonFlows.map(flow => (Object.assign(Object.assign({}, flow), { _id: uniqueId('flow_') }))),
|
|
443
|
+
flows: commonFlows.map(flow => (Object.assign(Object.assign({}, flow), { _id: uniqueId('flow_'), _hasChanged: false }))),
|
|
411
444
|
};
|
|
412
445
|
return [
|
|
413
446
|
...plans.map(plan => ({
|
|
414
447
|
_id: uniqueId('flowsGroup_'),
|
|
448
|
+
_icon: 'gio:shield',
|
|
415
449
|
name: plan.name,
|
|
416
|
-
|
|
417
|
-
flows: plan.flows.map(flow => (Object.assign(Object.assign({}, flow), { _id: uniqueId('flow_') }))),
|
|
450
|
+
flows: plan.flows.map(flow => (Object.assign(Object.assign({}, flow), { _id: uniqueId('flow_'), _hasChanged: false }))),
|
|
418
451
|
})),
|
|
419
452
|
commFlowsGroup,
|
|
420
453
|
];
|
|
421
454
|
};
|
|
455
|
+
const getCommonFlowsOutput = (flowsGroups) => {
|
|
456
|
+
var _a;
|
|
457
|
+
const commonFlowsGroup = flowsGroups.find(flowGroup => flowGroup._id === 'flowsGroup_commonFlow');
|
|
458
|
+
const hasChanged = commonFlowsGroup === null || commonFlowsGroup === void 0 ? void 0 : commonFlowsGroup.flows.some(flow => flow._hasChanged);
|
|
459
|
+
return hasChanged ? ((_a = commonFlowsGroup === null || commonFlowsGroup === void 0 ? void 0 : commonFlowsGroup.flows) !== null && _a !== void 0 ? _a : []).map(flow => omit(flow, '_id', '_hasChanged')) : null;
|
|
460
|
+
};
|
|
461
|
+
const getPlansChangeOutput = (flowsGroups) => {
|
|
462
|
+
const plans = flowsGroups.filter(flowGroup => flowGroup._id !== 'flowsGroup_commonFlow');
|
|
463
|
+
const plansWithChangedFlows = plans.filter(plan => plan.flows.some(flow => flow._hasChanged));
|
|
464
|
+
const plansWithChangedFlowsOutput = plansWithChangedFlows.map(plan => (Object.assign(Object.assign({}, omit(plan, '_id', '_icon')), { flows: plan.flows.map(flow => omit(flow, '_id', '_hasChanged')) })));
|
|
465
|
+
return plansWithChangedFlowsOutput.length > 0 ? plansWithChangedFlowsOutput : null;
|
|
466
|
+
};
|
|
422
467
|
|
|
423
468
|
/*
|
|
424
469
|
* Copyright (C) 2022 The Gravitee team (http://gravitee.io)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gravitee-ui-policy-studio-angular.mjs","sources":["../../../projects/ui-policy-studio-angular/src/lib/models/flow/index.ts","../../../projects/ui-policy-studio-angular/src/lib/models/plan/index.ts","../../../projects/ui-policy-studio-angular/src/lib/models/index.ts","../../../projects/ui-policy-studio-angular/src/lib/components/flow-form-dialog/gio-ps-flow-form-dialog.component.ts","../../../projects/ui-policy-studio-angular/src/lib/components/flow-form-dialog/gio-ps-flow-form-dialog.component.html","../../../projects/ui-policy-studio-angular/src/lib/components/flow-details/gio-ps-flow-details.component.ts","../../../projects/ui-policy-studio-angular/src/lib/components/flow-details/gio-ps-flow-details.component.html","../../../projects/ui-policy-studio-angular/src/lib/components/flows-menu/gio-ps-flows-menu.component.ts","../../../projects/ui-policy-studio-angular/src/lib/components/flows-menu/gio-ps-flows-menu.component.html","../../../projects/ui-policy-studio-angular/src/lib/gio-policy-studio.component.ts","../../../projects/ui-policy-studio-angular/src/lib/gio-policy-studio.component.html","../../../projects/ui-policy-studio-angular/src/lib/gio-policy-studio.module.ts","../../../projects/ui-policy-studio-angular/src/public-api.ts","../../../projects/ui-policy-studio-angular/src/gravitee-ui-policy-studio-angular.ts"],"sourcesContent":["/*\n * Copyright (C) 2022 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 */\nexport * from './ApiType';\nexport * from './Flow';\nexport * from './FlowExecution';\nexport * from './HttpMethod';\nexport * from './Selector';\nexport * from './Step';\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 */\nexport * from './Plan';\n","/*\n * Copyright (C) 2022 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 */\nexport * from './flow';\nexport * from './ConnectorsInfo';\nexport * from './plan';\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 */\nimport { Component, Inject } from '@angular/core';\nimport { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';\nimport { FormControl, FormGroup } from '@angular/forms';\nimport { cloneDeep, uniqueId } from 'lodash';\n\nimport { FlowVM } from '../../gio-policy-studio.model';\nimport { ChannelSelector, ConditionSelector } from '../../models';\n\nexport type GioPolicyStudioFlowFormDialogData = {\n flow?: FlowVM;\n entrypoints?: string[];\n};\n\nexport type GioPolicyStudioFlowFormDialogResult = FlowVM | false;\n\n@Component({\n selector: 'gio-ps-flow-form-dialog',\n templateUrl: './gio-ps-flow-form-dialog.component.html',\n styleUrls: ['./gio-ps-flow-form-dialog.component.scss'],\n})\nexport class GioPolicyStudioFlowFormDialogComponent {\n public entrypoints: string[] = [];\n public flowFormGroup?: FormGroup;\n\n public existingFlow?: FlowVM;\n public mode: 'create' | 'edit' = 'create';\n\n constructor(\n public dialogRef: MatDialogRef<GioPolicyStudioFlowFormDialogComponent, GioPolicyStudioFlowFormDialogResult>,\n @Inject(MAT_DIALOG_DATA) flowDialogData: GioPolicyStudioFlowFormDialogData,\n ) {\n this.entrypoints = flowDialogData?.entrypoints ?? [];\n\n this.existingFlow = cloneDeep(flowDialogData?.flow);\n this.mode = this.existingFlow ? 'edit' : 'create';\n\n const channelSelector = flowDialogData?.flow?.selectors?.find(s => s.type === 'CHANNEL') as ChannelSelector;\n const conditionSelector = flowDialogData?.flow?.selectors?.find(s => s.type === 'CONDITION') as ConditionSelector;\n\n this.flowFormGroup = new FormGroup({\n name: new FormControl(flowDialogData?.flow?.name ?? ''),\n channelOperator: new FormControl(channelSelector?.channelOperator ?? ''),\n channel: new FormControl(channelSelector?.channel ?? ''),\n operations: new FormControl(channelSelector?.operations ?? []),\n entrypoints: new FormControl(channelSelector?.entrypoints ?? []),\n condition: new FormControl(conditionSelector?.condition ?? ''),\n });\n }\n\n public onSubmit(): void {\n const chanelSelectorToSave: ChannelSelector = {\n type: 'CHANNEL',\n channel: this.flowFormGroup?.get('channel')?.value,\n channelOperator: this.flowFormGroup?.get('channelOperator')?.value,\n operations: this.flowFormGroup?.get('operations')?.value,\n entrypoints: this.flowFormGroup?.get('entrypoints')?.value,\n };\n\n const conditionValue: string = this.flowFormGroup?.get('condition')?.value;\n const conditionSelectorToSave: ConditionSelector | undefined = conditionValue\n ? {\n type: 'CONDITION',\n condition: conditionValue,\n }\n : undefined;\n\n const flowToSave: FlowVM = {\n // New id for new flow\n _id: uniqueId('flow_'),\n // If existing flow, keep root props\n ...this.existingFlow,\n name: this.flowFormGroup?.get('name')?.value,\n selectors: conditionSelectorToSave ? [chanelSelectorToSave, conditionSelectorToSave] : [chanelSelectorToSave],\n enabled: true,\n };\n\n this.dialogRef.close({\n ...flowToSave,\n });\n }\n}\n","<!--\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 {{ 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<mat-dialog-content *ngIf=\"flowFormGroup\" 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\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\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\n <div class=\"content__row\">\n <mat-form-field>\n <mat-label>Entrypoints</mat-label>\n <mat-select multiple formControlName=\"entrypoints\">\n <mat-option *ngFor=\"let entrypoint of entrypoints\" [value]=\"entrypoint\">{{ entrypoint }}</mat-option>\n </mat-select>\n <mat-hint>Entrypoints where your flow will be executed</mat-hint>\n </mat-form-field>\n </div>\n\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-form-field>\n </div>\n\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 </mat-form-field>\n </div>\n</mat-dialog-content>\n\n<mat-dialog-actions class=\"actions\">\n <button class=\"actions__cancelBtn\" mat-flat-button [mat-dialog-close]=\"false\">Cancel</button>\n <button class=\"actions__saveBtn\" color=\"primary\" mat-stroked-button role=\"dialog\" (click)=\"onSubmit()\">\n {{ mode === 'create' ? 'Create' : 'Save' }}\n </button>\n</mat-dialog-actions>\n","/*\n * Copyright (C) 2022 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 */\nimport { Component, EventEmitter, Input, Output } from '@angular/core';\nimport { MatDialog } from '@angular/material/dialog';\nimport { tap } from 'rxjs/operators';\n\nimport { FlowVM } from '../../gio-policy-studio.model';\nimport {\n GioPolicyStudioFlowFormDialogComponent,\n GioPolicyStudioFlowFormDialogData,\n GioPolicyStudioFlowFormDialogResult,\n} from '../flow-form-dialog/gio-ps-flow-form-dialog.component';\n\n@Component({\n selector: 'gio-ps-flow-details',\n templateUrl: './gio-ps-flow-details.component.html',\n styleUrls: ['./gio-ps-flow-details.component.scss'],\n})\nexport class GioPolicyStudioDetailsComponent {\n @Input()\n public flow?: FlowVM = undefined;\n\n @Input()\n public entrypoints: string[] = [];\n\n @Output()\n public flowChange = new EventEmitter<FlowVM>();\n\n @Output()\n public deleteFlow = new EventEmitter<FlowVM>();\n\n constructor(private readonly matDialog: MatDialog) {}\n\n public onEditFlow(): void {\n this.matDialog\n .open<GioPolicyStudioFlowFormDialogComponent, GioPolicyStudioFlowFormDialogData, GioPolicyStudioFlowFormDialogResult>(\n GioPolicyStudioFlowFormDialogComponent,\n {\n data: {\n flow: this.flow,\n entrypoints: this.entrypoints,\n },\n role: 'alertdialog',\n id: 'gioPsFlowFormDialog',\n },\n )\n .afterClosed()\n .pipe(\n tap(createdOrEdited => {\n if (!createdOrEdited) {\n return;\n }\n\n this.flowChange.emit(createdOrEdited);\n }),\n )\n .subscribe();\n }\n\n public onDeleteFlow(): void {\n this.deleteFlow.emit(this.flow);\n }\n}\n","<!--\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<ng-container *ngIf=\"flow; else emptyFlows\">\n <div class=\"header\">\n <div class=\"header__label\">Flow details</div>\n <div class=\"header__configBtn\">\n <button class=\"header__configBtn__edit\" mat-stroked-button mat-icon-button (click)=\"onEditFlow()\">\n <mat-icon svgIcon=\"gio:edit-pencil\"></mat-icon>\n </button>\n <button class=\"header__configBtn__delete\" mat-stroked-button mat-icon-button (click)=\"onDeleteFlow()\">\n <mat-icon svgIcon=\"gio:trash\"></mat-icon>\n </button>\n </div>\n </div>\n\n <div class=\"content\">\n 🚧 Work in progress 🚧 <br />\n {{ flow | json }}\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","/*\n * Copyright (C) 2022 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 */\nimport { Component, EventEmitter, Input, OnChanges, Output, SimpleChanges } from '@angular/core';\nimport { MatDialog } from '@angular/material/dialog';\nimport { tap } from 'rxjs/operators';\nimport { cloneDeep } from 'lodash';\n\nimport {\n GioPolicyStudioFlowFormDialogComponent,\n GioPolicyStudioFlowFormDialogData,\n GioPolicyStudioFlowFormDialogResult,\n} from '../flow-form-dialog/gio-ps-flow-form-dialog.component';\nimport { FlowGroupVM, FlowVM } from '../../gio-policy-studio.model';\nimport { ChannelSelector, HttpSelector, Operation } from '../../models';\n\ninterface FlowGroupMenuVM extends FlowGroupVM {\n flows: FlowMenuVM[];\n}\n\ninterface FlowMenuVM extends FlowVM {\n selected: boolean;\n mouseOver: boolean;\n badges: {\n label: string;\n class: string;\n }[];\n pathOrChannelLabel: string;\n}\n\n@Component({\n selector: 'gio-ps-flows-menu',\n templateUrl: './gio-ps-flows-menu.component.html',\n styleUrls: ['./gio-ps-flows-menu.component.scss'],\n})\nexport class GioPolicyStudioFlowsMenuComponent implements OnChanges {\n @Input()\n public flowsGroups: FlowGroupVM[] = [];\n\n @Input()\n public selectedFlow?: FlowVM = undefined;\n\n @Input()\n public entrypoints: string[] = [];\n\n @Output()\n public selectedFlowChange = new EventEmitter<FlowVM>();\n\n @Output()\n public flowsGroupsChange = new EventEmitter<FlowGroupVM[]>();\n\n public flowsGroupsVMSelected: FlowGroupMenuVM[] = [];\n\n constructor(private readonly matDialog: MatDialog) {}\n\n public ngOnChanges(changes: SimpleChanges): void {\n if (changes.flowsGroups || changes.selectedFlow) {\n this.flowsGroupsVMSelected = this.flowsGroups.map(flowGroup => {\n return {\n ...flowGroup,\n flows: flowGroup.flows.map(flow => {\n const badges: FlowMenuVM['badges'] = [];\n let pathOrChannelLabel = '';\n const channelSelector = flow.selectors?.find(s => s.type === 'CHANNEL') as ChannelSelector;\n if (channelSelector) {\n const operationToBadge: Record<Operation, string> = {\n PUBLISH: 'PUB',\n SUBSCRIBE: 'SUB',\n };\n const operationBadges = (channelSelector.operations ?? [])\n .map(operation => ({\n label: operationToBadge[operation],\n class: 'gio-badge-neutral',\n }))\n .sort((a, b) => a.label.localeCompare(b.label));\n operationBadges && badges.push(...operationBadges);\n pathOrChannelLabel = `${channelSelector.channel}${channelSelector.channelOperator === 'STARTS_WITH' ? '**' : ''}`;\n }\n\n const httpSelector = flow.selectors?.find(s => s.type === 'HTTP') as HttpSelector;\n if (httpSelector) {\n // Keep only 2 first http methods and add +X badge if there are more\n const httpMethodsToKeep = httpSelector.methods?.slice(0, 2);\n const httpMethodsLength = httpSelector.methods?.length;\n httpMethodsToKeep &&\n badges.push(...httpMethodsToKeep.map(method => ({ label: method, class: `gio-method-badge-${method.toLowerCase()}` })));\n if (httpMethodsLength && httpMethodsLength > 2) {\n badges?.push({\n label: `+${httpMethodsLength - 2}`,\n class: 'gio-badge-neutral',\n });\n }\n if (httpMethodsLength === 0) {\n badges?.push({\n label: 'ALL',\n class: 'gio-badge-neutral',\n });\n }\n\n pathOrChannelLabel = `${httpSelector.path}${httpSelector.pathOperator === 'STARTS_WITH' ? '/**' : ''}`;\n }\n\n return {\n ...flow,\n selected: this.selectedFlow?._id === flow._id,\n mouseOver: false,\n badges,\n pathOrChannelLabel,\n };\n }),\n };\n });\n }\n }\n\n public selectFlow(flow: FlowVM): void {\n this.selectedFlowChange.emit(flow);\n }\n\n public onAddFlow(flowGroup: FlowGroupVM): void {\n this.matDialog\n .open<GioPolicyStudioFlowFormDialogComponent, GioPolicyStudioFlowFormDialogData, GioPolicyStudioFlowFormDialogResult>(\n GioPolicyStudioFlowFormDialogComponent,\n {\n data: {\n flow: undefined,\n entrypoints: this.entrypoints,\n },\n role: 'alertdialog',\n id: 'gioPsFlowFormDialog',\n },\n )\n .afterClosed()\n .pipe(\n tap(createdOrEdited => {\n if (!createdOrEdited) {\n return;\n }\n const editedFlowsGroups = cloneDeep(this.flowsGroups);\n\n const flowsGroupToEdit = editedFlowsGroups.find(fg => fg._id === flowGroup._id);\n if (!flowsGroupToEdit) {\n throw new Error(`Flow group ${flowGroup._id} not found`);\n }\n flowsGroupToEdit.flows.push(createdOrEdited);\n\n this.flowsGroupsChange.emit(editedFlowsGroups);\n this.selectedFlowChange.emit(createdOrEdited);\n }),\n )\n .subscribe();\n }\n}\n","<!--\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 <div class=\"header__configBtn\">\n <button mat-stroked-button mat-icon-button><mat-icon svgIcon=\"gio:settings\"></mat-icon></button>\n </div>\n</div>\n\n<div class=\"list\">\n <div *ngFor=\"let flowsGroup of flowsGroupsVMSelected\" class=\"list__flowsGroup\">\n <div class=\"list__flowsGroup__header\">\n <div class=\"list__flowsGroup__header__label\">\n <mat-icon *ngIf=\"flowsGroup.icon\" [svgIcon]=\"flowsGroup.icon\"></mat-icon>\n <span>{{ flowsGroup.name }}</span>\n </div>\n <div class=\"list__flowsGroup__header__addBtn\">\n <button mat-icon-button (click)=\"onAddFlow(flowsGroup)\"><mat-icon svgIcon=\"gio:plus\" matTooltip=\"New flow\"></mat-icon></button>\n </div>\n </div>\n\n <div\n *ngFor=\"let flow of flowsGroup.flows\"\n class=\"list__flowsGroup__flow\"\n [class.selected]=\"flow.selected\"\n (click)=\"selectFlow(flow)\"\n (mouseout)=\"flow.mouseOver = false\"\n (mouseover)=\"flow.mouseOver = true\"\n >\n <div *ngIf=\"flow.name\" class=\"list__flowsGroup__flow__name\" [attr.title]=\"flow.name\">\n {{ flow.name }}\n </div>\n <div class=\"list__flowsGroup__flow__infos\">\n <div class=\"list__flowsGroup__flow__infos__badges\">\n <span *ngFor=\"let badge of flow.badges\" class=\"list__flowsGroup__flow__infos__badges__badge\" [ngClass]=\"badge.class\">{{\n badge.label\n }}</span>\n </div>\n <div class=\"list__flowsGroup__flow__infos__pathOrChannelLabel\">{{ flow.pathOrChannelLabel }}</div>\n </div>\n </div>\n </div>\n</div>\n","/*\n * Copyright (C) 2022 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 */\nimport { Component, Input, OnChanges, SimpleChanges } from '@angular/core';\nimport { capitalize, flatten, uniqueId } from 'lodash';\n\nimport { ApiType, ConnectorsInfo, Flow, Plan } from './models';\nimport { FlowGroupVM, FlowVM } from './gio-policy-studio.model';\n\n@Component({\n selector: 'gio-policy-studio',\n templateUrl: './gio-policy-studio.component.html',\n styleUrls: ['./gio-policy-studio.component.scss'],\n})\nexport class GioPolicyStudioComponent implements OnChanges {\n @Input()\n public apiType!: ApiType;\n\n /**\n * List of entrypoints to display\n */\n @Input()\n public entrypointsInfo: ConnectorsInfo[] = [];\n\n /**\n * List of endpoints to display\n */\n @Input()\n public endpointsInfo: ConnectorsInfo[] = [];\n\n @Input()\n public commonFlows: Flow[] = [];\n\n @Input()\n public plans: Plan[] = [];\n\n public connectorsTooltip = '';\n\n public selectedFlow?: FlowVM = undefined;\n\n public flowsGroups: FlowGroupVM[] = [];\n\n public entrypointsType: string[] = [];\n\n public ngOnChanges(changes: SimpleChanges): void {\n if (changes.entrypointsInfo || changes.endpointsInfo) {\n this.connectorsTooltip = `Entrypoints: ${(this.entrypointsInfo ?? []).map(e => capitalize(e.type)).join(', ')}\\nEndpoints: ${(\n this.endpointsInfo ?? []\n )\n .map(e => capitalize(e.type))\n .join(', ')}`;\n\n this.entrypointsType = (this.entrypointsInfo ?? []).map(e => e.type);\n }\n\n if (changes.commonFlows || changes.plans) {\n this.flowsGroups = getFlowsGroups(this.commonFlows, this.plans);\n\n // Select first flow by default on first load\n if (changes.commonFlows?.isFirstChange() || changes.plans?.isFirstChange()) {\n this.selectedFlow = this.flowsGroups[0].flows[0];\n }\n }\n }\n\n public onFlowsGroupsChange(flowsGroups: FlowGroupVM[]): void {\n this.flowsGroups = flowsGroups;\n }\n\n public onSelectedFlowChange(flow: FlowVM): void {\n this.flowsGroups = this.flowsGroups.map(flowGroup => ({\n ...flowGroup,\n flows: flowGroup.flows.map(f => (f._id === flow._id ? flow : f)),\n }));\n this.selectedFlow = flow;\n }\n\n public onDeleteSelectedFlow(flow: FlowVM): void {\n // Define next selected flow and remove flow from flowsGroups\n const allFLowsId = flatten(this.flowsGroups.map(flowGroup => flowGroup.flows)).map(f => f._id);\n const flowToDeleteIndex = allFLowsId.indexOf(flow._id);\n const nextSelectedFlow = allFLowsId[flowToDeleteIndex + 1] ?? allFLowsId[flowToDeleteIndex - 1];\n this.flowsGroups = this.flowsGroups.map(flowGroup => ({\n ...flowGroup,\n flows: flowGroup.flows.filter(f => f._id !== flow._id),\n }));\n this.selectedFlow = this.flowsGroups\n .find(flowGroup => flowGroup.flows.some(f => f._id === nextSelectedFlow))\n ?.flows.find(f => f._id === nextSelectedFlow);\n }\n}\n\nconst getFlowsGroups = (commonFlows: Flow[] = [], plans: Plan[] = []): FlowGroupVM[] => {\n const commFlowsGroup: FlowGroupVM = {\n _id: 'flowsGroup_commonFlow',\n name: 'Common flows',\n flows: commonFlows.map(flow => ({ ...flow, _id: uniqueId('flow_') })),\n };\n\n return [\n ...plans.map(plan => ({\n _id: uniqueId('flowsGroup_'),\n name: plan.name,\n icon: 'gio:shield',\n flows: plan.flows.map(flow => ({ ...flow, _id: uniqueId('flow_') })),\n })),\n commFlowsGroup,\n ];\n};\n","<!--\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\n<div class=\"header\">\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 <mat-icon *ngFor=\"let entrypoint of entrypointsInfo\" class=\"gio-left\" [svgIcon]=\"entrypoint.icon\"></mat-icon>\n <mat-icon *ngFor=\"let endpoint of endpointsInfo\" class=\"gio-left\" [svgIcon]=\"endpoint.icon\"></mat-icon>\n </span>\n </div>\n\n <div class=\"header__btn\">\n <button mat-stroked-button color=\"primary\">Save</button>\n </div>\n</div>\n\n<div class=\"wrapper\">\n <div class=\"wrapper__flowsMenu\">\n <gio-ps-flows-menu\n [flowsGroups]=\"flowsGroups\"\n [entrypoints]=\"entrypointsType\"\n (flowsGroupsChange)=\"onFlowsGroupsChange($event)\"\n [(selectedFlow)]=\"selectedFlow\"\n ></gio-ps-flows-menu>\n </div>\n\n <div class=\"wrapper__flowDetails\">\n <gio-ps-flow-details\n [flow]=\"selectedFlow\"\n [entrypoints]=\"entrypointsType\"\n (flowChange)=\"onSelectedFlowChange($event)\"\n (deleteFlow)=\"onDeleteSelectedFlow($event)\"\n ></gio-ps-flow-details>\n </div>\n</div>\n","/*\n * Copyright (C) 2022 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 */\nimport { NgModule } from '@angular/core';\nimport { MatButtonModule } from '@angular/material/button';\nimport { GioIconsModule } from '@gravitee/ui-particles-angular';\nimport { CommonModule } from '@angular/common';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { MatDialogModule } from '@angular/material/dialog';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatSelectModule } from '@angular/material/select';\nimport { ReactiveFormsModule } from '@angular/forms';\n\nimport { GioPolicyStudioFlowFormDialogComponent } from './components/flow-form-dialog/gio-ps-flow-form-dialog.component';\nimport { GioPolicyStudioDetailsComponent } from './components/flow-details/gio-ps-flow-details.component';\nimport { GioPolicyStudioFlowsMenuComponent } from './components/flows-menu/gio-ps-flows-menu.component';\nimport { GioPolicyStudioComponent } from './gio-policy-studio.component';\n\n@NgModule({\n declarations: [\n GioPolicyStudioComponent,\n GioPolicyStudioFlowsMenuComponent,\n GioPolicyStudioDetailsComponent,\n GioPolicyStudioFlowFormDialogComponent,\n ],\n imports: [\n CommonModule,\n ReactiveFormsModule,\n\n MatButtonModule,\n MatTooltipModule,\n MatFormFieldModule,\n MatInputModule,\n MatSelectModule,\n MatDialogModule,\n\n GioIconsModule,\n ],\n exports: [GioPolicyStudioComponent],\n})\nexport class GioPolicyStudioModule {}\n","/*\n * Copyright (C) 2022 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 * Public API Surface of ui-policy-studio-angular\n */\nexport * from './lib/models';\nexport { GioPolicyStudioModule } from './lib/gio-policy-studio.module';\nexport { GioPolicyStudioComponent } from './lib/gio-policy-studio.component';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"gravitee-ui-policy-studio-angular.mjs","sources":["../../../projects/ui-policy-studio-angular/src/lib/models/flow/index.ts","../../../projects/ui-policy-studio-angular/src/lib/models/plan/index.ts","../../../projects/ui-policy-studio-angular/src/lib/models/index.ts","../../../projects/ui-policy-studio-angular/src/lib/components/flow-form-dialog/gio-ps-flow-form-dialog.component.ts","../../../projects/ui-policy-studio-angular/src/lib/components/flow-form-dialog/gio-ps-flow-form-dialog.component.html","../../../projects/ui-policy-studio-angular/src/lib/components/flow-details/gio-ps-flow-details.component.ts","../../../projects/ui-policy-studio-angular/src/lib/components/flow-details/gio-ps-flow-details.component.html","../../../projects/ui-policy-studio-angular/src/lib/components/flows-menu/gio-ps-flows-menu.component.ts","../../../projects/ui-policy-studio-angular/src/lib/components/flows-menu/gio-ps-flows-menu.component.html","../../../projects/ui-policy-studio-angular/src/lib/gio-policy-studio.component.ts","../../../projects/ui-policy-studio-angular/src/lib/gio-policy-studio.component.html","../../../projects/ui-policy-studio-angular/src/lib/gio-policy-studio.module.ts","../../../projects/ui-policy-studio-angular/src/public-api.ts","../../../projects/ui-policy-studio-angular/src/gravitee-ui-policy-studio-angular.ts"],"sourcesContent":["/*\n * Copyright (C) 2022 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 */\nexport * from './ApiType';\nexport * from './Flow';\nexport * from './FlowExecution';\nexport * from './HttpMethod';\nexport * from './Selector';\nexport * from './Step';\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 */\nexport * from './Plan';\n","/*\n * Copyright (C) 2022 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 */\nexport * from './flow';\nexport * from './plan';\n\nexport * from './ConnectorsInfo';\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 */\nimport { Component, Inject } from '@angular/core';\nimport { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';\nimport { FormControl, FormGroup } from '@angular/forms';\nimport { cloneDeep, uniqueId } from 'lodash';\n\nimport { FlowVM } from '../../gio-policy-studio.model';\nimport { ChannelSelector, ConditionSelector } from '../../models';\n\nexport type GioPolicyStudioFlowFormDialogData = {\n flow?: FlowVM;\n entrypoints?: string[];\n};\n\nexport type GioPolicyStudioFlowFormDialogResult = FlowVM | false;\n\n@Component({\n selector: 'gio-ps-flow-form-dialog',\n templateUrl: './gio-ps-flow-form-dialog.component.html',\n styleUrls: ['./gio-ps-flow-form-dialog.component.scss'],\n})\nexport class GioPolicyStudioFlowFormDialogComponent {\n public entrypoints: string[] = [];\n public flowFormGroup?: FormGroup;\n\n public existingFlow?: FlowVM;\n public mode: 'create' | 'edit' = 'create';\n\n constructor(\n public dialogRef: MatDialogRef<GioPolicyStudioFlowFormDialogComponent, GioPolicyStudioFlowFormDialogResult>,\n @Inject(MAT_DIALOG_DATA) flowDialogData: GioPolicyStudioFlowFormDialogData,\n ) {\n this.entrypoints = flowDialogData?.entrypoints ?? [];\n\n this.existingFlow = cloneDeep(flowDialogData?.flow);\n this.mode = this.existingFlow ? 'edit' : 'create';\n\n const channelSelector = flowDialogData?.flow?.selectors?.find(s => s.type === 'CHANNEL') as ChannelSelector;\n const conditionSelector = flowDialogData?.flow?.selectors?.find(s => s.type === 'CONDITION') as ConditionSelector;\n\n this.flowFormGroup = new FormGroup({\n name: new FormControl(flowDialogData?.flow?.name ?? ''),\n channelOperator: new FormControl(channelSelector?.channelOperator ?? 'EQUALS'),\n channel: new FormControl(channelSelector?.channel ?? ''),\n operations: new FormControl(channelSelector?.operations ?? []),\n entrypoints: new FormControl(channelSelector?.entrypoints ?? []),\n condition: new FormControl(conditionSelector?.condition ?? ''),\n });\n }\n\n public onSubmit(): void {\n const chanelSelectorToSave: ChannelSelector = {\n type: 'CHANNEL',\n channel: this.flowFormGroup?.get('channel')?.value,\n channelOperator: this.flowFormGroup?.get('channelOperator')?.value,\n operations: this.flowFormGroup?.get('operations')?.value,\n entrypoints: this.flowFormGroup?.get('entrypoints')?.value,\n };\n\n const conditionValue: string = this.flowFormGroup?.get('condition')?.value;\n const conditionSelectorToSave: ConditionSelector | undefined = conditionValue\n ? {\n type: 'CONDITION',\n condition: conditionValue,\n }\n : undefined;\n\n const flowToSave: FlowVM = {\n // New id for new flow\n _id: uniqueId('flow_'),\n // If existing flow, keep root props\n ...this.existingFlow,\n // Mark as changed\n _hasChanged: true,\n // Add changes\n name: this.flowFormGroup?.get('name')?.value,\n selectors: conditionSelectorToSave ? [chanelSelectorToSave, conditionSelectorToSave] : [chanelSelectorToSave],\n enabled: true,\n };\n\n this.dialogRef.close({\n ...flowToSave,\n });\n }\n}\n","<!--\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 {{ 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<mat-dialog-content *ngIf=\"flowFormGroup\" 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\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\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\n <div class=\"content__row\">\n <mat-form-field>\n <mat-label>Entrypoints</mat-label>\n <mat-select multiple formControlName=\"entrypoints\">\n <mat-option *ngFor=\"let entrypoint of entrypoints\" [value]=\"entrypoint\">{{ entrypoint }}</mat-option>\n </mat-select>\n <mat-hint>Entrypoints where your flow will be executed</mat-hint>\n </mat-form-field>\n </div>\n\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-form-field>\n </div>\n\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 </mat-form-field>\n </div>\n</mat-dialog-content>\n\n<mat-dialog-actions class=\"actions\">\n <button class=\"actions__cancelBtn\" mat-flat-button [mat-dialog-close]=\"false\">Cancel</button>\n <button class=\"actions__saveBtn\" color=\"primary\" mat-stroked-button role=\"dialog\" (click)=\"onSubmit()\">\n {{ mode === 'create' ? 'Create' : 'Save' }}\n </button>\n</mat-dialog-actions>\n","/*\n * Copyright (C) 2022 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 */\nimport { Component, EventEmitter, Input, Output } from '@angular/core';\nimport { MatDialog } from '@angular/material/dialog';\nimport { tap } from 'rxjs/operators';\n\nimport { FlowVM } from '../../gio-policy-studio.model';\nimport {\n GioPolicyStudioFlowFormDialogComponent,\n GioPolicyStudioFlowFormDialogData,\n GioPolicyStudioFlowFormDialogResult,\n} from '../flow-form-dialog/gio-ps-flow-form-dialog.component';\n\n@Component({\n selector: 'gio-ps-flow-details',\n templateUrl: './gio-ps-flow-details.component.html',\n styleUrls: ['./gio-ps-flow-details.component.scss'],\n})\nexport class GioPolicyStudioDetailsComponent {\n @Input()\n public flow?: FlowVM = undefined;\n\n @Input()\n public entrypoints: string[] = [];\n\n @Output()\n public flowChange = new EventEmitter<FlowVM>();\n\n @Output()\n public deleteFlow = new EventEmitter<FlowVM>();\n\n constructor(private readonly matDialog: MatDialog) {}\n\n public onEditFlow(): void {\n this.matDialog\n .open<GioPolicyStudioFlowFormDialogComponent, GioPolicyStudioFlowFormDialogData, GioPolicyStudioFlowFormDialogResult>(\n GioPolicyStudioFlowFormDialogComponent,\n {\n data: {\n flow: this.flow,\n entrypoints: this.entrypoints,\n },\n role: 'alertdialog',\n id: 'gioPsFlowFormDialog',\n },\n )\n .afterClosed()\n .pipe(\n tap(createdOrEdited => {\n if (!createdOrEdited) {\n return;\n }\n\n this.flowChange.emit(createdOrEdited);\n }),\n )\n .subscribe();\n }\n\n public onDeleteFlow(): void {\n this.deleteFlow.emit(this.flow);\n }\n}\n","<!--\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<ng-container *ngIf=\"flow; else emptyFlows\">\n <div class=\"header\">\n <div class=\"header__label\">Flow details</div>\n <div class=\"header__configBtn\">\n <button class=\"header__configBtn__edit\" mat-stroked-button mat-icon-button (click)=\"onEditFlow()\">\n <mat-icon svgIcon=\"gio:edit-pencil\"></mat-icon>\n </button>\n <button class=\"header__configBtn__delete\" mat-stroked-button mat-icon-button (click)=\"onDeleteFlow()\">\n <mat-icon svgIcon=\"gio:trash\"></mat-icon>\n </button>\n </div>\n </div>\n\n <div class=\"content\">\n 🚧 Work in progress 🚧 <br />\n {{ flow | json }}\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","/*\n * Copyright (C) 2022 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 */\nimport { Component, EventEmitter, Input, OnChanges, Output, SimpleChanges } from '@angular/core';\nimport { MatDialog } from '@angular/material/dialog';\nimport { tap } from 'rxjs/operators';\nimport { cloneDeep } from 'lodash';\n\nimport {\n GioPolicyStudioFlowFormDialogComponent,\n GioPolicyStudioFlowFormDialogData,\n GioPolicyStudioFlowFormDialogResult,\n} from '../flow-form-dialog/gio-ps-flow-form-dialog.component';\nimport { FlowGroupVM, FlowVM } from '../../gio-policy-studio.model';\nimport { ChannelSelector, HttpSelector, Operation } from '../../models';\n\ninterface FlowGroupMenuVM extends FlowGroupVM {\n flows: FlowMenuVM[];\n}\n\ninterface FlowMenuVM extends FlowVM {\n selected: boolean;\n mouseOver: boolean;\n badges: {\n label: string;\n class: string;\n }[];\n pathOrChannelLabel: string;\n}\n\n@Component({\n selector: 'gio-ps-flows-menu',\n templateUrl: './gio-ps-flows-menu.component.html',\n styleUrls: ['./gio-ps-flows-menu.component.scss'],\n})\nexport class GioPolicyStudioFlowsMenuComponent implements OnChanges {\n @Input()\n public flowsGroups: FlowGroupVM[] = [];\n\n @Input()\n public selectedFlow?: FlowVM = undefined;\n\n @Input()\n public entrypoints: string[] = [];\n\n @Output()\n public selectedFlowChange = new EventEmitter<FlowVM>();\n\n @Output()\n public flowsGroupsChange = new EventEmitter<FlowGroupVM[]>();\n\n public flowsGroupsVMSelected: FlowGroupMenuVM[] = [];\n\n constructor(private readonly matDialog: MatDialog) {}\n\n public ngOnChanges(changes: SimpleChanges): void {\n if (changes.flowsGroups || changes.selectedFlow) {\n this.flowsGroupsVMSelected = this.flowsGroups.map(flowGroup => {\n return {\n ...flowGroup,\n flows: flowGroup.flows.map(flow => {\n const badges: FlowMenuVM['badges'] = [];\n let pathOrChannelLabel = '';\n const channelSelector = flow.selectors?.find(s => s.type === 'CHANNEL') as ChannelSelector;\n if (channelSelector) {\n const operationToBadge: Record<Operation, string> = {\n PUBLISH: 'PUB',\n SUBSCRIBE: 'SUB',\n };\n const operationBadges = (channelSelector.operations ?? [])\n .map(operation => ({\n label: operationToBadge[operation],\n class: 'gio-badge-neutral',\n }))\n .sort((a, b) => a.label.localeCompare(b.label));\n operationBadges && badges.push(...operationBadges);\n pathOrChannelLabel = `${channelSelector.channel}${channelSelector.channelOperator === 'STARTS_WITH' ? '**' : ''}`;\n }\n\n const httpSelector = flow.selectors?.find(s => s.type === 'HTTP') as HttpSelector;\n if (httpSelector) {\n // Keep only 2 first http methods and add +X badge if there are more\n const httpMethodsToKeep = httpSelector.methods?.slice(0, 2);\n const httpMethodsLength = httpSelector.methods?.length;\n httpMethodsToKeep &&\n badges.push(...httpMethodsToKeep.map(method => ({ label: method, class: `gio-method-badge-${method.toLowerCase()}` })));\n if (httpMethodsLength && httpMethodsLength > 2) {\n badges?.push({\n label: `+${httpMethodsLength - 2}`,\n class: 'gio-badge-neutral',\n });\n }\n if (httpMethodsLength === 0) {\n badges?.push({\n label: 'ALL',\n class: 'gio-badge-neutral',\n });\n }\n\n pathOrChannelLabel = `${httpSelector.path}${httpSelector.pathOperator === 'STARTS_WITH' ? '/**' : ''}`;\n }\n\n return {\n ...flow,\n selected: this.selectedFlow?._id === flow._id,\n mouseOver: false,\n badges,\n pathOrChannelLabel,\n };\n }),\n };\n });\n }\n }\n\n public selectFlow(flow: FlowVM): void {\n this.selectedFlowChange.emit(flow);\n }\n\n public onAddFlow(flowGroup: FlowGroupVM): void {\n this.matDialog\n .open<GioPolicyStudioFlowFormDialogComponent, GioPolicyStudioFlowFormDialogData, GioPolicyStudioFlowFormDialogResult>(\n GioPolicyStudioFlowFormDialogComponent,\n {\n data: {\n flow: undefined,\n entrypoints: this.entrypoints,\n },\n role: 'alertdialog',\n id: 'gioPsFlowFormDialog',\n },\n )\n .afterClosed()\n .pipe(\n tap(createdOrEdited => {\n if (!createdOrEdited) {\n return;\n }\n const editedFlowsGroups = cloneDeep(this.flowsGroups);\n\n const flowsGroupToEdit = editedFlowsGroups.find(fg => fg._id === flowGroup._id);\n if (!flowsGroupToEdit) {\n throw new Error(`Flow group ${flowGroup._id} not found`);\n }\n flowsGroupToEdit.flows.push(createdOrEdited);\n\n this.flowsGroupsChange.emit(editedFlowsGroups);\n this.selectedFlowChange.emit(createdOrEdited);\n }),\n )\n .subscribe();\n }\n}\n","<!--\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 <div class=\"header__configBtn\">\n <button mat-stroked-button mat-icon-button><mat-icon svgIcon=\"gio:settings\"></mat-icon></button>\n </div>\n</div>\n\n<div class=\"list\">\n <div *ngFor=\"let flowsGroup of flowsGroupsVMSelected\" class=\"list__flowsGroup\">\n <div class=\"list__flowsGroup__header\">\n <div class=\"list__flowsGroup__header__label\">\n <mat-icon *ngIf=\"flowsGroup._icon\" [svgIcon]=\"flowsGroup._icon\"></mat-icon>\n <span>{{ flowsGroup.name }}</span>\n </div>\n <div class=\"list__flowsGroup__header__addBtn\">\n <button mat-icon-button (click)=\"onAddFlow(flowsGroup)\"><mat-icon svgIcon=\"gio:plus\" matTooltip=\"New flow\"></mat-icon></button>\n </div>\n </div>\n\n <div\n *ngFor=\"let flow of flowsGroup.flows\"\n class=\"list__flowsGroup__flow\"\n [class.selected]=\"flow.selected\"\n (click)=\"selectFlow(flow)\"\n (mouseout)=\"flow.mouseOver = false\"\n (mouseover)=\"flow.mouseOver = true\"\n >\n <div *ngIf=\"flow.name\" class=\"list__flowsGroup__flow__name\" [attr.title]=\"flow.name\">\n {{ flow.name }}\n </div>\n <div class=\"list__flowsGroup__flow__infos\">\n <div class=\"list__flowsGroup__flow__infos__badges\">\n <span *ngFor=\"let badge of flow.badges\" class=\"list__flowsGroup__flow__infos__badges__badge\" [ngClass]=\"badge.class\">{{\n badge.label\n }}</span>\n </div>\n <div class=\"list__flowsGroup__flow__infos__pathOrChannelLabel\">{{ flow.pathOrChannelLabel }}</div>\n </div>\n </div>\n </div>\n</div>\n","/*\n * Copyright (C) 2022 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 */\nimport { Component, EventEmitter, Input, OnChanges, Output, SimpleChanges } from '@angular/core';\nimport { capitalize, flatten, omit, uniqueId } from 'lodash';\n\nimport { ApiType, ConnectorsInfo, Flow, Plan } from './models';\nimport { FlowGroupVM, FlowVM } from './gio-policy-studio.model';\n\n@Component({\n selector: 'gio-policy-studio',\n templateUrl: './gio-policy-studio.component.html',\n styleUrls: ['./gio-policy-studio.component.scss'],\n})\nexport class GioPolicyStudioComponent implements OnChanges {\n @Input()\n public apiType!: ApiType;\n\n /**\n * List of entrypoints to display\n */\n @Input()\n public entrypointsInfo: ConnectorsInfo[] = [];\n\n /**\n * List of endpoints to display\n */\n @Input()\n public endpointsInfo: ConnectorsInfo[] = [];\n\n @Input()\n public commonFlows: Flow[] = [];\n\n @Input()\n public plans: Plan[] = [];\n\n /**\n * Return common flows if they have been updated.\n */\n @Output()\n public commonFlowsChange = new EventEmitter<Flow[]>();\n\n /**\n * Return the list of plans with updated flows. Plans with no updated flows are not returned.\n **/\n @Output()\n public plansToUpdate = new EventEmitter<Plan[]>();\n\n public connectorsTooltip = '';\n\n public selectedFlow?: FlowVM = undefined;\n\n public flowsGroups: FlowGroupVM[] = [];\n\n public entrypointsType: string[] = [];\n\n public disableSaveButton = true;\n\n public ngOnChanges(changes: SimpleChanges): void {\n if (changes.entrypointsInfo || changes.endpointsInfo) {\n this.connectorsTooltip = `Entrypoints: ${(this.entrypointsInfo ?? []).map(e => capitalize(e.type)).join(', ')}\\nEndpoints: ${(\n this.endpointsInfo ?? []\n )\n .map(e => capitalize(e.type))\n .join(', ')}`;\n\n this.entrypointsType = (this.entrypointsInfo ?? []).map(e => e.type);\n }\n\n if (changes.commonFlows || changes.plans) {\n this.disableSaveButton = true;\n this.flowsGroups = getFlowsGroups(this.commonFlows, this.plans);\n\n // Select first flow by default on first load\n if (changes.commonFlows?.isFirstChange() || changes.plans?.isFirstChange()) {\n this.selectedFlow = this.flowsGroups[0].flows[0];\n }\n }\n }\n\n public onFlowsGroupsChange(flowsGroups: FlowGroupVM[]): void {\n this.flowsGroups = flowsGroups;\n this.disableSaveButton = false;\n }\n\n public onSelectedFlowChange(flow: FlowVM): void {\n this.flowsGroups = this.flowsGroups.map(flowGroup => ({\n ...flowGroup,\n flows: flowGroup.flows.map(f => (f._id === flow._id ? flow : f)),\n }));\n this.selectedFlow = flow;\n this.disableSaveButton = false;\n }\n\n public onDeleteSelectedFlow(flow: FlowVM): void {\n // Define next selected flow and remove flow from flowsGroups\n const allFLowsId = flatten(this.flowsGroups.map(flowGroup => flowGroup.flows)).map(f => f._id);\n const flowToDeleteIndex = allFLowsId.indexOf(flow._id);\n const nextSelectedFlow = allFLowsId[flowToDeleteIndex + 1] ?? allFLowsId[flowToDeleteIndex - 1];\n this.flowsGroups = this.flowsGroups.map(flowGroup => ({\n ...flowGroup,\n flows: flowGroup.flows.filter(f => f._id !== flow._id),\n }));\n this.selectedFlow = this.flowsGroups\n .find(flowGroup => flowGroup.flows.some(f => f._id === nextSelectedFlow))\n ?.flows.find(f => f._id === nextSelectedFlow);\n\n this.disableSaveButton = false;\n }\n\n public onSave(): void {\n // Emit common flows only if they have been updated\n const commonFlows = getCommonFlowsOutput(this.flowsGroups);\n if (commonFlows != null) {\n this.commonFlowsChange.emit(commonFlows);\n }\n // Emit plans only if they have been updated\n const plans = getPlansChangeOutput(this.flowsGroups);\n if (plans != null) {\n this.plansToUpdate.emit(plans);\n }\n }\n}\n\nconst getFlowsGroups = (commonFlows: Flow[] = [], plans: Plan[] = []): FlowGroupVM[] => {\n const commFlowsGroup: FlowGroupVM = {\n _id: 'flowsGroup_commonFlow',\n name: 'Common flows',\n flows: commonFlows.map(flow => ({ ...flow, _id: uniqueId('flow_'), _hasChanged: false })),\n };\n\n return [\n ...plans.map(plan => ({\n _id: uniqueId('flowsGroup_'),\n _icon: 'gio:shield',\n name: plan.name,\n flows: plan.flows.map(flow => ({ ...flow, _id: uniqueId('flow_'), _hasChanged: false })),\n })),\n commFlowsGroup,\n ];\n};\n\nconst getCommonFlowsOutput = (flowsGroups: FlowGroupVM[]): Flow[] | null => {\n const commonFlowsGroup = flowsGroups.find(flowGroup => flowGroup._id === 'flowsGroup_commonFlow');\n const hasChanged = commonFlowsGroup?.flows.some(flow => flow._hasChanged);\n\n return hasChanged ? (commonFlowsGroup?.flows ?? []).map(flow => omit(flow, '_id', '_hasChanged')) : null;\n};\n\nconst getPlansChangeOutput = (flowsGroups: FlowGroupVM[]): Plan[] | null => {\n const plans = flowsGroups.filter(flowGroup => flowGroup._id !== 'flowsGroup_commonFlow');\n const plansWithChangedFlows = plans.filter(plan => plan.flows.some(flow => flow._hasChanged));\n const plansWithChangedFlowsOutput = plansWithChangedFlows.map(plan => ({\n ...omit(plan, '_id', '_icon'),\n flows: plan.flows.map(flow => omit(flow, '_id', '_hasChanged')),\n }));\n\n return plansWithChangedFlowsOutput.length > 0 ? plansWithChangedFlowsOutput : null;\n};\n","<!--\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\n<div class=\"header\">\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 <mat-icon *ngFor=\"let entrypoint of entrypointsInfo\" class=\"gio-left\" [svgIcon]=\"entrypoint.icon\"></mat-icon>\n <mat-icon *ngFor=\"let endpoint of endpointsInfo\" class=\"gio-left\" [svgIcon]=\"endpoint.icon\"></mat-icon>\n </span>\n </div>\n\n <div class=\"header__btn\">\n <button mat-stroked-button color=\"primary\" [disabled]=\"disableSaveButton\" (click)=\"onSave()\">Save</button>\n </div>\n</div>\n\n<div class=\"wrapper\">\n <div class=\"wrapper__flowsMenu\">\n <gio-ps-flows-menu\n [flowsGroups]=\"flowsGroups\"\n [entrypoints]=\"entrypointsType\"\n (flowsGroupsChange)=\"onFlowsGroupsChange($event)\"\n [(selectedFlow)]=\"selectedFlow\"\n ></gio-ps-flows-menu>\n </div>\n\n <div class=\"wrapper__flowDetails\">\n <gio-ps-flow-details\n [flow]=\"selectedFlow\"\n [entrypoints]=\"entrypointsType\"\n (flowChange)=\"onSelectedFlowChange($event)\"\n (deleteFlow)=\"onDeleteSelectedFlow($event)\"\n ></gio-ps-flow-details>\n </div>\n</div>\n","/*\n * Copyright (C) 2022 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 */\nimport { NgModule } from '@angular/core';\nimport { MatButtonModule } from '@angular/material/button';\nimport { GioIconsModule } from '@gravitee/ui-particles-angular';\nimport { CommonModule } from '@angular/common';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { MatDialogModule } from '@angular/material/dialog';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatSelectModule } from '@angular/material/select';\nimport { ReactiveFormsModule } from '@angular/forms';\n\nimport { GioPolicyStudioFlowFormDialogComponent } from './components/flow-form-dialog/gio-ps-flow-form-dialog.component';\nimport { GioPolicyStudioDetailsComponent } from './components/flow-details/gio-ps-flow-details.component';\nimport { GioPolicyStudioFlowsMenuComponent } from './components/flows-menu/gio-ps-flows-menu.component';\nimport { GioPolicyStudioComponent } from './gio-policy-studio.component';\n\n@NgModule({\n declarations: [\n GioPolicyStudioComponent,\n GioPolicyStudioFlowsMenuComponent,\n GioPolicyStudioDetailsComponent,\n GioPolicyStudioFlowFormDialogComponent,\n ],\n imports: [\n CommonModule,\n ReactiveFormsModule,\n\n MatButtonModule,\n MatTooltipModule,\n MatFormFieldModule,\n MatInputModule,\n MatSelectModule,\n MatDialogModule,\n\n GioIconsModule,\n ],\n exports: [GioPolicyStudioComponent],\n})\nexport class GioPolicyStudioModule {}\n","/*\n * Copyright (C) 2022 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 * Public API Surface of ui-policy-studio-angular\n */\nexport * from './lib/models';\nexport { GioPolicyStudioModule } from './lib/gio-policy-studio.module';\nexport { GioPolicyStudioComponent } from './lib/gio-policy-studio.component';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|