@gravitee/ui-policy-studio-angular 7.4.0 → 7.5.0-apim-1550-ad9c2a7
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 +74 -8
- package/esm2020/lib/gio-policy-studio.model.mjs +1 -1
- package/esm2020/lib/models/index.mjs +2 -2
- package/esm2020/lib/models/plan/Plan.mjs +1 -1
- package/esm2020/testing/lib/models/plan/Plan.fixture.mjs +2 -1
- package/esm2020/testing/lib/models/plan/Plan.mjs +1 -1
- package/fesm2015/gravitee-ui-policy-studio-angular-testing.mjs +1 -0
- package/fesm2015/gravitee-ui-policy-studio-angular-testing.mjs.map +1 -1
- package/fesm2015/gravitee-ui-policy-studio-angular.mjs +79 -10
- package/fesm2015/gravitee-ui-policy-studio-angular.mjs.map +1 -1
- package/fesm2020/gravitee-ui-policy-studio-angular-testing.mjs +1 -0
- package/fesm2020/gravitee-ui-policy-studio-angular-testing.mjs.map +1 -1
- package/fesm2020/gravitee-ui-policy-studio-angular.mjs +78 -9
- package/fesm2020/gravitee-ui-policy-studio-angular.mjs.map +1 -1
- package/lib/gio-policy-studio.component.d.ts +13 -2
- package/lib/gio-policy-studio.model.d.ts +3 -1
- package/lib/models/index.d.ts +1 -1
- package/lib/models/plan/Plan.d.ts +1 -0
- package/package.json +1 -1
- package/testing/lib/models/plan/Plan.d.ts +1 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gravitee-ui-policy-studio-angular-testing.mjs","sources":["../../../projects/ui-policy-studio-angular/src/lib/models/flow/Flow.fixture.ts","../../../projects/ui-policy-studio-angular/src/lib/models/flow/index-testing.ts","../../../projects/ui-policy-studio-angular/src/lib/models/plan/Plan.fixture.ts","../../../projects/ui-policy-studio-angular/src/lib/models/plan/index-testing.ts","../../../projects/ui-policy-studio-angular/src/lib/models/index-testing.ts","../../../projects/ui-policy-studio-angular/src/testing/stories-resources/index.ts","../../../projects/ui-policy-studio-angular/src/testing/harnesses/div.harness.ts","../../../projects/ui-policy-studio-angular/src/testing/harnesses/index.ts","../../../projects/ui-policy-studio-angular/src/testing/index.ts","../../../projects/ui-policy-studio-angular/src/public-testing-api.ts","../../../projects/ui-policy-studio-angular/src/gravitee-ui-policy-studio-angular-testing.ts"],"sourcesContent":["/*\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 */\nimport { isFunction } from 'lodash';\n\nimport { Flow } from './Flow';\nimport { ChannelSelector, HttpSelector } from './Selector';\n\nexport function fakeChannelFlow(modifier?: Partial<Flow> | ((baseApi: Flow) => Flow)): Flow {\n const channelSelector: ChannelSelector = {\n type: 'CHANNEL',\n channel: 'channel',\n channelOperator: 'EQUALS',\n entrypoints: ['entrypoint'],\n operations: ['PUBLISH'],\n };\n\n const base: Flow = {\n name: 'Flow name',\n selectors: [channelSelector],\n request: [],\n response: [],\n subscribe: [],\n publish: [],\n enabled: true,\n };\n\n if (isFunction(modifier)) {\n return modifier(base);\n }\n\n return {\n ...base,\n ...modifier,\n };\n}\n\nexport function fakeHttpFlow(modifier?: Partial<Flow> | ((baseApi: Flow) => Flow)): Flow {\n const httpSelector: HttpSelector = {\n type: 'HTTP',\n path: '/path',\n pathOperator: 'EQUALS',\n methods: ['GET'],\n };\n\n const base: Flow = {\n name: 'Flow name',\n selectors: [httpSelector],\n request: [],\n response: [],\n subscribe: [],\n publish: [],\n enabled: true,\n };\n\n if (isFunction(modifier)) {\n return modifier(base);\n }\n\n return {\n ...base,\n ...modifier,\n };\n}\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.fixture';\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 */\nimport { isFunction } from 'lodash';\n\nimport { Plan } from './Plan';\n\nexport function fakePlan(modifier?: Partial<Plan> | ((base: Plan) => Plan)): Plan {\n const base: Plan = {\n name: 'Keyless plan',\n flows: [],\n };\n\n if (isFunction(modifier)) {\n return modifier(base);\n }\n\n return {\n ...base,\n ...modifier,\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 */\nexport * from './Plan.fixture';\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/index-testing';\nexport * from './plan/index-testing';\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\nimport _apimPolicies from './apim-policies.json';\nimport _apimResourceTypes from './apim-resource-types.json';\nimport _apimDefinition from './apim-definition.json';\nimport _apimFlow from './apim-flow.json';\nimport _apimPropertyProviders from './apim-property-providers.json';\n\nexport const apimPolicies = _apimPolicies;\nexport const apimResourceTypes = _apimResourceTypes;\nexport const apimDefinition = _apimDefinition;\nexport const apimFlow = _apimFlow;\nexport const apimPropertyProviders = _apimPropertyProviders;\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 */\nimport { AsyncFactoryFn, BaseHarnessFilters, ComponentHarness, HarnessPredicate, HarnessQuery, TestElement } from '@angular/cdk/testing';\n\nexport type DivHarnessFilters = BaseHarnessFilters & {\n /** Filters based on the text */\n text?: string | RegExp;\n};\n\nexport class DivHarness extends ComponentHarness {\n public static hostSelector = 'div';\n\n /**\n * Get Harness with the given filter.\n *\n * @param options Options for filtering which input instances are considered a match.\n * @return a `HarnessPredicate` configured with the given options.\n */\n public static with(options: DivHarnessFilters = {}): HarnessPredicate<DivHarness> {\n return new HarnessPredicate(DivHarness, options).addOption('text', options.text, (harness, text) =>\n HarnessPredicate.stringMatches(harness.getText(), text),\n );\n }\n\n public childLocatorFor<T extends ComponentHarness>(query: HarnessQuery<T>): AsyncFactoryFn<T> {\n return this.locatorFor(query);\n }\n\n public childLocatorForAll<T extends ComponentHarness>(query: HarnessQuery<T>): AsyncFactoryFn<T[]> {\n return this.locatorForAll(query);\n }\n\n public async getText(option?: { childSelector?: string }): Promise<string | null> {\n let element: TestElement | null = await this.host();\n if (option?.childSelector) {\n element = await this.locatorForOptional(option.childSelector)();\n }\n\n return element ? element.text() : null;\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 */\nexport * from './div.harness';\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 './stories-resources';\nexport * from './harnesses';\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 './lib/models/index-testing';\nexport * from './testing';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-testing-api';\n"],"names":[],"mappings":";;;AAAA;;;;;;;;;;;;;;;SAoBgB,eAAe,CAAC,QAAoD;IAClF,MAAM,eAAe,GAAoB;QACvC,IAAI,EAAE,SAAS;QACf,OAAO,EAAE,SAAS;QAClB,eAAe,EAAE,QAAQ;QACzB,WAAW,EAAE,CAAC,YAAY,CAAC;QAC3B,UAAU,EAAE,CAAC,SAAS,CAAC;KACxB,CAAC;IAEF,MAAM,IAAI,GAAS;QACjB,IAAI,EAAE,WAAW;QACjB,SAAS,EAAE,CAAC,eAAe,CAAC;QAC5B,OAAO,EAAE,EAAE;QACX,QAAQ,EAAE,EAAE;QACZ,SAAS,EAAE,EAAE;QACb,OAAO,EAAE,EAAE;QACX,OAAO,EAAE,IAAI;KACd,CAAC;IAEF,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE;QACxB,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC;KACvB;IAED,OAAO;QACL,GAAG,IAAI;QACP,GAAG,QAAQ;KACZ,CAAC;AACJ,CAAC;SAEe,YAAY,CAAC,QAAoD;IAC/E,MAAM,YAAY,GAAiB;QACjC,IAAI,EAAE,MAAM;QACZ,IAAI,EAAE,OAAO;QACb,YAAY,EAAE,QAAQ;QACtB,OAAO,EAAE,CAAC,KAAK,CAAC;KACjB,CAAC;IAEF,MAAM,IAAI,GAAS;QACjB,IAAI,EAAE,WAAW;QACjB,SAAS,EAAE,CAAC,YAAY,CAAC;QACzB,OAAO,EAAE,EAAE;QACX,QAAQ,EAAE,EAAE;QACZ,SAAS,EAAE,EAAE;QACb,OAAO,EAAE,EAAE;QACX,OAAO,EAAE,IAAI;KACd,CAAC;IAEF,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE;QACxB,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC;KACvB;IAED,OAAO;QACL,GAAG,IAAI;QACP,GAAG,QAAQ;KACZ,CAAC;AACJ;;AC3EA;;;;;;;;;;;;;;;;ACAA;;;;;;;;;;;;;;;SAmBgB,QAAQ,CAAC,QAAiD;IACxE,MAAM,IAAI,GAAS;QACjB,IAAI,EAAE,cAAc;QACpB,KAAK,EAAE,EAAE;KACV,CAAC;IAEF,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE;QACxB,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC;KACvB;IAED,OAAO;QACL,GAAG,IAAI;QACP,GAAG,QAAQ;KACZ,CAAC;AACJ;;ACjCA;;;;;;;;;;;;;;;;ACAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACAA;;;;;;;;;;;;;;;MAsBa,YAAY,GAAG,cAAc;MAC7B,iBAAiB,GAAG,mBAAmB;MACvC,cAAc,GAAG,gBAAgB;MACjC,QAAQ,GAAG,UAAU;MACrB,qBAAqB,GAAG;;AC1BrC;;;;;;;;;;;;;;;MAsBa,UAAW,SAAQ,gBAAgB;;;;;;;IASvC,OAAO,IAAI,CAAC,UAA6B,EAAE;QAChD,OAAO,IAAI,gBAAgB,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,OAAO,EAAE,IAAI,KAC7F,gBAAgB,CAAC,aAAa,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,IAAI,CAAC,CACxD,CAAC;KACH;IAEM,eAAe,CAA6B,KAAsB;QACvE,OAAO,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;KAC/B;IAEM,kBAAkB,CAA6B,KAAsB;QAC1E,OAAO,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;KAClC;IAEM,MAAM,OAAO,CAAC,MAAmC;QACtD,IAAI,OAAO,GAAuB,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QACpD,IAAI,MAAM,EAAE,aAAa,EAAE;YACzB,OAAO,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC;SACjE;QAED,OAAO,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC;KACxC;;AA7Ba,uBAAY,GAAG,KAAK;;ACvBpC;;;;;;;;;;;;;;;;ACAA;;;;;;;;;;;;;;;;ACAA;;;;;;;;;;;;;;;;ACAA;;;;;;"}
|
|
1
|
+
{"version":3,"file":"gravitee-ui-policy-studio-angular-testing.mjs","sources":["../../../projects/ui-policy-studio-angular/src/lib/models/flow/Flow.fixture.ts","../../../projects/ui-policy-studio-angular/src/lib/models/flow/index-testing.ts","../../../projects/ui-policy-studio-angular/src/lib/models/plan/Plan.fixture.ts","../../../projects/ui-policy-studio-angular/src/lib/models/plan/index-testing.ts","../../../projects/ui-policy-studio-angular/src/lib/models/index-testing.ts","../../../projects/ui-policy-studio-angular/src/testing/stories-resources/index.ts","../../../projects/ui-policy-studio-angular/src/testing/harnesses/div.harness.ts","../../../projects/ui-policy-studio-angular/src/testing/harnesses/index.ts","../../../projects/ui-policy-studio-angular/src/testing/index.ts","../../../projects/ui-policy-studio-angular/src/public-testing-api.ts","../../../projects/ui-policy-studio-angular/src/gravitee-ui-policy-studio-angular-testing.ts"],"sourcesContent":["/*\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 */\nimport { isFunction } from 'lodash';\n\nimport { Flow } from './Flow';\nimport { ChannelSelector, HttpSelector } from './Selector';\n\nexport function fakeChannelFlow(modifier?: Partial<Flow> | ((baseApi: Flow) => Flow)): Flow {\n const channelSelector: ChannelSelector = {\n type: 'CHANNEL',\n channel: 'channel',\n channelOperator: 'EQUALS',\n entrypoints: ['entrypoint'],\n operations: ['PUBLISH'],\n };\n\n const base: Flow = {\n name: 'Flow name',\n selectors: [channelSelector],\n request: [],\n response: [],\n subscribe: [],\n publish: [],\n enabled: true,\n };\n\n if (isFunction(modifier)) {\n return modifier(base);\n }\n\n return {\n ...base,\n ...modifier,\n };\n}\n\nexport function fakeHttpFlow(modifier?: Partial<Flow> | ((baseApi: Flow) => Flow)): Flow {\n const httpSelector: HttpSelector = {\n type: 'HTTP',\n path: '/path',\n pathOperator: 'EQUALS',\n methods: ['GET'],\n };\n\n const base: Flow = {\n name: 'Flow name',\n selectors: [httpSelector],\n request: [],\n response: [],\n subscribe: [],\n publish: [],\n enabled: true,\n };\n\n if (isFunction(modifier)) {\n return modifier(base);\n }\n\n return {\n ...base,\n ...modifier,\n };\n}\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.fixture';\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 */\nimport { isFunction } from 'lodash';\n\nimport { Plan } from './Plan';\n\nexport function fakePlan(modifier?: Partial<Plan> | ((base: Plan) => Plan)): Plan {\n const base: Plan = {\n id: 'plan-id',\n name: 'Keyless plan',\n flows: [],\n };\n\n if (isFunction(modifier)) {\n return modifier(base);\n }\n\n return {\n ...base,\n ...modifier,\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 */\nexport * from './Plan.fixture';\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/index-testing';\nexport * from './plan/index-testing';\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\nimport _apimPolicies from './apim-policies.json';\nimport _apimResourceTypes from './apim-resource-types.json';\nimport _apimDefinition from './apim-definition.json';\nimport _apimFlow from './apim-flow.json';\nimport _apimPropertyProviders from './apim-property-providers.json';\n\nexport const apimPolicies = _apimPolicies;\nexport const apimResourceTypes = _apimResourceTypes;\nexport const apimDefinition = _apimDefinition;\nexport const apimFlow = _apimFlow;\nexport const apimPropertyProviders = _apimPropertyProviders;\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 */\nimport { AsyncFactoryFn, BaseHarnessFilters, ComponentHarness, HarnessPredicate, HarnessQuery, TestElement } from '@angular/cdk/testing';\n\nexport type DivHarnessFilters = BaseHarnessFilters & {\n /** Filters based on the text */\n text?: string | RegExp;\n};\n\nexport class DivHarness extends ComponentHarness {\n public static hostSelector = 'div';\n\n /**\n * Get Harness with the given filter.\n *\n * @param options Options for filtering which input instances are considered a match.\n * @return a `HarnessPredicate` configured with the given options.\n */\n public static with(options: DivHarnessFilters = {}): HarnessPredicate<DivHarness> {\n return new HarnessPredicate(DivHarness, options).addOption('text', options.text, (harness, text) =>\n HarnessPredicate.stringMatches(harness.getText(), text),\n );\n }\n\n public childLocatorFor<T extends ComponentHarness>(query: HarnessQuery<T>): AsyncFactoryFn<T> {\n return this.locatorFor(query);\n }\n\n public childLocatorForAll<T extends ComponentHarness>(query: HarnessQuery<T>): AsyncFactoryFn<T[]> {\n return this.locatorForAll(query);\n }\n\n public async getText(option?: { childSelector?: string }): Promise<string | null> {\n let element: TestElement | null = await this.host();\n if (option?.childSelector) {\n element = await this.locatorForOptional(option.childSelector)();\n }\n\n return element ? element.text() : null;\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 */\nexport * from './div.harness';\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 './stories-resources';\nexport * from './harnesses';\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 './lib/models/index-testing';\nexport * from './testing';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-testing-api';\n"],"names":[],"mappings":"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"}
|
|
@@ -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, differenceBy, omit, unionBy } 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';
|
|
@@ -145,7 +145,7 @@ class GioPolicyStudioFlowFormDialogComponent {
|
|
|
145
145
|
const conditionSelector = flowDialogData?.flow?.selectors?.find(s => s.type === 'CONDITION');
|
|
146
146
|
this.flowFormGroup = new FormGroup({
|
|
147
147
|
name: new FormControl(flowDialogData?.flow?.name ?? ''),
|
|
148
|
-
channelOperator: new FormControl(channelSelector?.channelOperator ?? ''),
|
|
148
|
+
channelOperator: new FormControl(channelSelector?.channelOperator ?? 'EQUALS'),
|
|
149
149
|
channel: new FormControl(channelSelector?.channel ?? ''),
|
|
150
150
|
operations: new FormControl(channelSelector?.operations ?? []),
|
|
151
151
|
entrypoints: new FormControl(channelSelector?.entrypoints ?? []),
|
|
@@ -172,6 +172,9 @@ class GioPolicyStudioFlowFormDialogComponent {
|
|
|
172
172
|
_id: uniqueId('flow_'),
|
|
173
173
|
// If existing flow, keep root props
|
|
174
174
|
...this.existingFlow,
|
|
175
|
+
// Mark as changed
|
|
176
|
+
_hasChanged: true,
|
|
177
|
+
// Add changes
|
|
175
178
|
name: this.flowFormGroup?.get('name')?.value,
|
|
176
179
|
selectors: conditionSelectorToSave ? [chanelSelectorToSave, conditionSelectorToSave] : [chanelSelectorToSave],
|
|
177
180
|
enabled: true,
|
|
@@ -364,10 +367,10 @@ class GioPolicyStudioFlowsMenuComponent {
|
|
|
364
367
|
}
|
|
365
368
|
}
|
|
366
369
|
GioPolicyStudioFlowsMenuComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: GioPolicyStudioFlowsMenuComponent, deps: [{ token: i1.MatDialog }], target: i0.ɵɵFactoryTarget.Component });
|
|
367
|
-
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.
|
|
370
|
+
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"] }] });
|
|
368
371
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: GioPolicyStudioFlowsMenuComponent, decorators: [{
|
|
369
372
|
type: Component,
|
|
370
|
-
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.
|
|
373
|
+
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"] }]
|
|
371
374
|
}], ctorParameters: function () { return [{ type: i1.MatDialog }]; }, propDecorators: { flowsGroups: [{
|
|
372
375
|
type: Input
|
|
373
376
|
}], selectedFlow: [{
|
|
@@ -407,10 +410,21 @@ class GioPolicyStudioComponent {
|
|
|
407
410
|
this.endpointsInfo = [];
|
|
408
411
|
this.commonFlows = [];
|
|
409
412
|
this.plans = [];
|
|
413
|
+
/**
|
|
414
|
+
* Return common flows if they have been updated.
|
|
415
|
+
*/
|
|
416
|
+
this.commonFlowsChange = new EventEmitter();
|
|
417
|
+
/**
|
|
418
|
+
* Return the list of plans with updated flows. Plans with no updated flows are not returned.
|
|
419
|
+
**/
|
|
420
|
+
this.plansToUpdate = new EventEmitter();
|
|
410
421
|
this.connectorsTooltip = '';
|
|
411
422
|
this.selectedFlow = undefined;
|
|
412
423
|
this.flowsGroups = [];
|
|
413
424
|
this.entrypointsType = [];
|
|
425
|
+
this.disableSaveButton = true;
|
|
426
|
+
// Used to keep track of initial flows groups to know if there are deleted flows
|
|
427
|
+
this.initialFlowsGroups = [];
|
|
414
428
|
}
|
|
415
429
|
ngOnChanges(changes) {
|
|
416
430
|
if (changes.entrypointsInfo || changes.endpointsInfo) {
|
|
@@ -420,7 +434,9 @@ class GioPolicyStudioComponent {
|
|
|
420
434
|
this.entrypointsType = (this.entrypointsInfo ?? []).map(e => e.type);
|
|
421
435
|
}
|
|
422
436
|
if (changes.commonFlows || changes.plans) {
|
|
437
|
+
this.disableSaveButton = true;
|
|
423
438
|
this.flowsGroups = getFlowsGroups(this.commonFlows, this.plans);
|
|
439
|
+
this.initialFlowsGroups = cloneDeep(this.flowsGroups);
|
|
424
440
|
// Select first flow by default on first load
|
|
425
441
|
if (changes.commonFlows?.isFirstChange() || changes.plans?.isFirstChange()) {
|
|
426
442
|
this.selectedFlow = this.flowsGroups[0].flows[0];
|
|
@@ -429,6 +445,7 @@ class GioPolicyStudioComponent {
|
|
|
429
445
|
}
|
|
430
446
|
onFlowsGroupsChange(flowsGroups) {
|
|
431
447
|
this.flowsGroups = flowsGroups;
|
|
448
|
+
this.disableSaveButton = false;
|
|
432
449
|
}
|
|
433
450
|
onSelectedFlowChange(flow) {
|
|
434
451
|
this.flowsGroups = this.flowsGroups.map(flowGroup => ({
|
|
@@ -436,6 +453,7 @@ class GioPolicyStudioComponent {
|
|
|
436
453
|
flows: flowGroup.flows.map(f => (f._id === flow._id ? flow : f)),
|
|
437
454
|
}));
|
|
438
455
|
this.selectedFlow = flow;
|
|
456
|
+
this.disableSaveButton = false;
|
|
439
457
|
}
|
|
440
458
|
onDeleteSelectedFlow(flow) {
|
|
441
459
|
// Define next selected flow and remove flow from flowsGroups
|
|
@@ -449,13 +467,26 @@ class GioPolicyStudioComponent {
|
|
|
449
467
|
this.selectedFlow = this.flowsGroups
|
|
450
468
|
.find(flowGroup => flowGroup.flows.some(f => f._id === nextSelectedFlow))
|
|
451
469
|
?.flows.find(f => f._id === nextSelectedFlow);
|
|
470
|
+
this.disableSaveButton = false;
|
|
471
|
+
}
|
|
472
|
+
onSave() {
|
|
473
|
+
// Emit common flows only if they have been updated
|
|
474
|
+
const commonFlows = getCommonFlowsOutput(this.flowsGroups, this.initialFlowsGroups);
|
|
475
|
+
if (commonFlows != null) {
|
|
476
|
+
this.commonFlowsChange.emit(commonFlows);
|
|
477
|
+
}
|
|
478
|
+
// Emit plans only if they have been updated
|
|
479
|
+
const plans = getPlansChangeOutput(this.flowsGroups, this.initialFlowsGroups);
|
|
480
|
+
if (plans != null) {
|
|
481
|
+
this.plansToUpdate.emit(plans);
|
|
482
|
+
}
|
|
452
483
|
}
|
|
453
484
|
}
|
|
454
485
|
GioPolicyStudioComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: GioPolicyStudioComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
455
|
-
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 } });
|
|
486
|
+
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 } });
|
|
456
487
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: GioPolicyStudioComponent, decorators: [{
|
|
457
488
|
type: Component,
|
|
458
|
-
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"] }]
|
|
489
|
+
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"] }]
|
|
459
490
|
}], propDecorators: { apiType: [{
|
|
460
491
|
type: Input
|
|
461
492
|
}], entrypointsInfo: [{
|
|
@@ -466,23 +497,61 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImpo
|
|
|
466
497
|
type: Input
|
|
467
498
|
}], plans: [{
|
|
468
499
|
type: Input
|
|
500
|
+
}], commonFlowsChange: [{
|
|
501
|
+
type: Output
|
|
502
|
+
}], plansToUpdate: [{
|
|
503
|
+
type: Output
|
|
469
504
|
}] } });
|
|
470
505
|
const getFlowsGroups = (commonFlows = [], plans = []) => {
|
|
471
506
|
const commFlowsGroup = {
|
|
472
507
|
_id: 'flowsGroup_commonFlow',
|
|
473
508
|
name: 'Common flows',
|
|
474
|
-
flows: commonFlows.map(flow => ({ ...flow, _id: uniqueId('flow_') })),
|
|
509
|
+
flows: commonFlows.map(flow => ({ ...flow, _id: uniqueId('flow_'), _hasChanged: false })),
|
|
475
510
|
};
|
|
476
511
|
return [
|
|
477
512
|
...plans.map(plan => ({
|
|
478
513
|
_id: uniqueId('flowsGroup_'),
|
|
514
|
+
_icon: 'gio:shield',
|
|
515
|
+
_planId: plan.id,
|
|
479
516
|
name: plan.name,
|
|
480
|
-
|
|
481
|
-
flows: plan.flows.map(flow => ({ ...flow, _id: uniqueId('flow_') })),
|
|
517
|
+
flows: plan.flows.map(flow => ({ ...flow, _id: uniqueId('flow_'), _hasChanged: false })),
|
|
482
518
|
})),
|
|
483
519
|
commFlowsGroup,
|
|
484
520
|
];
|
|
485
521
|
};
|
|
522
|
+
const getCommonFlowsOutput = (flowsGroups, initialFlowsGroups) => {
|
|
523
|
+
const commonFlowsGroup = flowsGroups.find(flowGroup => flowGroup._id === 'flowsGroup_commonFlow');
|
|
524
|
+
const initialCommonFlowsGroup = initialFlowsGroups.find(flowGroup => flowGroup._id === 'flowsGroup_commonFlow');
|
|
525
|
+
// Check if common flows have been updated
|
|
526
|
+
const hasChanged = commonFlowsGroup?.flows.some(flow => flow._hasChanged);
|
|
527
|
+
// Check if common flows have been deleted
|
|
528
|
+
const hasDeletedFlow = differenceBy(initialCommonFlowsGroup?.flows ?? [], commonFlowsGroup?.flows ?? [], '_id').length > 0;
|
|
529
|
+
return hasChanged || hasDeletedFlow ? (commonFlowsGroup?.flows ?? []).map(flow => omit(flow, '_id', '_hasChanged')) : null;
|
|
530
|
+
};
|
|
531
|
+
const getPlansChangeOutput = (flowsGroups, initialFlowsGroups) => {
|
|
532
|
+
const plansGroups = flowsGroups.filter(flowGroup => flowGroup._id !== 'flowsGroup_commonFlow');
|
|
533
|
+
const initialPlansGroups = initialFlowsGroups.filter(flowGroup => flowGroup._id !== 'flowsGroup_commonFlow');
|
|
534
|
+
// Get plans with changed flows
|
|
535
|
+
const plansGroupsWithChangedFlows = plansGroups.filter(plan => plan.flows.some(flow => flow._hasChanged));
|
|
536
|
+
// Get plans with deleted flows
|
|
537
|
+
const plansGroupsWithDeletedFlows = [];
|
|
538
|
+
// Check if there are deleted flows in initial initialPlansGroups
|
|
539
|
+
initialPlansGroups.forEach(plan => {
|
|
540
|
+
const planGroupToCompare = plansGroups.find(p => p._planId === plan._planId);
|
|
541
|
+
if (planGroupToCompare && differenceBy(plan.flows, planGroupToCompare?.flows ?? [], '_id').length > 0) {
|
|
542
|
+
// If there are deleted flows, we need to return the complete plan with the new flows
|
|
543
|
+
plansGroupsWithDeletedFlows.push(planGroupToCompare);
|
|
544
|
+
}
|
|
545
|
+
});
|
|
546
|
+
// Merge plans with changed flows and plans with deleted flows
|
|
547
|
+
const plansWithChangedFlowsOutput = unionBy([...plansGroupsWithChangedFlows, ...plansGroupsWithDeletedFlows], '_planId').map(plan => ({
|
|
548
|
+
...omit(plan, '_id', '_icon', '_planId'),
|
|
549
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- planId is always defined
|
|
550
|
+
id: plan._planId,
|
|
551
|
+
flows: plan.flows.map(flow => omit(flow, '_id', '_hasChanged')),
|
|
552
|
+
}));
|
|
553
|
+
return plansWithChangedFlowsOutput.length > 0 ? plansWithChangedFlowsOutput : null;
|
|
554
|
+
};
|
|
486
555
|
|
|
487
556
|
/*
|
|
488
557
|
* 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/FlowExecution.ts","../../../projects/ui-policy-studio-angular/src/lib/models/flow/HttpMethod.ts","../../../projects/ui-policy-studio-angular/src/lib/models/flow/index.ts","../../../projects/ui-policy-studio-angular/src/lib/models/plan/Plan.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) 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 * API's flow mode.\n */\nexport type FlowMode = 'BEST_MATCH' | 'DEFAULT';\n\nexport interface FlowExecution {\n mode?: FlowMode;\n /**\n * Is the flow execution match required.\n */\n matchRequired?: boolean;\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\nexport type HttpMethod = 'CONNECT' | 'DELETE' | 'GET' | 'HEAD' | 'OPTIONS' | 'PATCH' | 'POST' | 'PUT' | 'TRACE' | 'OTHER';\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 './ApiType';\nexport * from './Flow';\nexport * from './FlowExecution';\nexport * from './HttpMethod';\nexport * from './Selector';\nexport * from './Step';\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\nimport { Flow } from '../flow';\n\nexport interface Plan {\n name: string;\n flows: Flow[];\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 */\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/FlowExecution.ts","../../../projects/ui-policy-studio-angular/src/lib/models/flow/HttpMethod.ts","../../../projects/ui-policy-studio-angular/src/lib/models/flow/index.ts","../../../projects/ui-policy-studio-angular/src/lib/models/plan/Plan.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) 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 * API's flow mode.\n */\nexport type FlowMode = 'BEST_MATCH' | 'DEFAULT';\n\nexport interface FlowExecution {\n mode?: FlowMode;\n /**\n * Is the flow execution match required.\n */\n matchRequired?: boolean;\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\nexport type HttpMethod = 'CONNECT' | 'DELETE' | 'GET' | 'HEAD' | 'OPTIONS' | 'PATCH' | 'POST' | 'PUT' | 'TRACE' | 'OTHER';\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 './ApiType';\nexport * from './Flow';\nexport * from './FlowExecution';\nexport * from './HttpMethod';\nexport * from './Selector';\nexport * from './Step';\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\nimport { Flow } from '../flow';\n\nexport interface Plan {\n id: string;\n name: string;\n flows: Flow[];\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 */\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, cloneDeep, differenceBy, flatten, omit, unionBy, 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 // Used to keep track of initial flows groups to know if there are deleted flows\n private initialFlowsGroups: FlowGroupVM[] = [];\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 this.initialFlowsGroups = cloneDeep(this.flowsGroups);\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, this.initialFlowsGroups);\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, this.initialFlowsGroups);\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 _planId: plan.id,\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[], initialFlowsGroups: FlowGroupVM[]): Flow[] | null => {\n const commonFlowsGroup = flowsGroups.find(flowGroup => flowGroup._id === 'flowsGroup_commonFlow');\n const initialCommonFlowsGroup = initialFlowsGroups.find(flowGroup => flowGroup._id === 'flowsGroup_commonFlow');\n // Check if common flows have been updated\n const hasChanged = commonFlowsGroup?.flows.some(flow => flow._hasChanged);\n\n // Check if common flows have been deleted\n const hasDeletedFlow = differenceBy(initialCommonFlowsGroup?.flows ?? [], commonFlowsGroup?.flows ?? [], '_id').length > 0;\n\n return hasChanged || hasDeletedFlow ? (commonFlowsGroup?.flows ?? []).map(flow => omit(flow, '_id', '_hasChanged')) : null;\n};\n\nconst getPlansChangeOutput = (flowsGroups: FlowGroupVM[], initialFlowsGroups: FlowGroupVM[]): Plan[] | null => {\n const plansGroups = flowsGroups.filter(flowGroup => flowGroup._id !== 'flowsGroup_commonFlow');\n const initialPlansGroups = initialFlowsGroups.filter(flowGroup => flowGroup._id !== 'flowsGroup_commonFlow');\n\n // Get plans with changed flows\n const plansGroupsWithChangedFlows = plansGroups.filter(plan => plan.flows.some(flow => flow._hasChanged));\n\n // Get plans with deleted flows\n const plansGroupsWithDeletedFlows: FlowGroupVM[] = [];\n\n // Check if there are deleted flows in initial initialPlansGroups\n initialPlansGroups.forEach(plan => {\n const planGroupToCompare = plansGroups.find(p => p._planId === plan._planId);\n if (planGroupToCompare && differenceBy(plan.flows, planGroupToCompare?.flows ?? [], '_id').length > 0) {\n // If there are deleted flows, we need to return the complete plan with the new flows\n plansGroupsWithDeletedFlows.push(planGroupToCompare);\n }\n });\n\n // Merge plans with changed flows and plans with deleted flows\n const plansWithChangedFlowsOutput = unionBy([...plansGroupsWithChangedFlows, ...plansGroupsWithDeletedFlows], '_planId').map(plan => ({\n ...omit(plan, '_id', '_icon', '_planId'),\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- planId is always defined\n id: plan._planId!,\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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"}
|