@valtimo/plugin-management 13.46.0 → 13.47.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (34) hide show
  1. package/fesm2022/valtimo-plugin-management.mjs +4829 -320
  2. package/fesm2022/valtimo-plugin-management.mjs.map +1 -1
  3. package/lib/components/plugin-add-modal/plugin-add-modal.component.d.ts +90 -14
  4. package/lib/components/plugin-add-select/plugin-add-select.component.d.ts +17 -11
  5. package/lib/components/plugin-app-add-modal/plugin-app-add-modal.component.d.ts +127 -0
  6. package/lib/components/plugin-apps-page/plugin-apps-page.component.d.ts +120 -0
  7. package/lib/components/plugin-edit-modal/plugin-edit-modal.component.d.ts +10 -1
  8. package/lib/components/plugin-external-configure/plugin-external-configure.component.d.ts +78 -0
  9. package/lib/components/plugin-external-edit-modal/plugin-external-edit-modal.component.d.ts +79 -0
  10. package/lib/components/plugin-external-permissions/plugin-external-permissions.component.d.ts +83 -0
  11. package/lib/components/plugin-external-review-modal/plugin-external-review-modal.component.d.ts +41 -0
  12. package/lib/components/plugin-host-connection-form/plugin-host-connection-form.component.d.ts +85 -0
  13. package/lib/components/plugin-host-edit-modal/plugin-host-edit-modal.component.d.ts +58 -0
  14. package/lib/components/plugin-host-event-queue-modal/plugin-host-event-queue-modal.component.d.ts +34 -0
  15. package/lib/components/plugin-host-frontend-origins-modal/plugin-host-frontend-origins-modal.component.d.ts +30 -0
  16. package/lib/components/plugin-host-modal/plugin-host-modal.component.d.ts +46 -0
  17. package/lib/components/plugin-hosts-page/plugin-hosts-page.component.d.ts +84 -0
  18. package/lib/components/plugin-log-modal/plugin-log-modal.component.d.ts +55 -0
  19. package/lib/components/plugin-management/plugin-management.component.d.ts +102 -13
  20. package/lib/components/plugin-upload-modal/plugin-upload-modal.component.d.ts +76 -0
  21. package/lib/components/plugin-usage-modal/plugin-usage-modal.component.d.ts +26 -0
  22. package/lib/constants/index.d.ts +2 -0
  23. package/lib/constants/plugin-app-add-modal.test-ids.d.ts +8 -0
  24. package/lib/constants/plugin-external-review-modal.test-ids.d.ts +4 -0
  25. package/lib/models/external-plugin-permissions.model.d.ts +6 -0
  26. package/lib/models/index.d.ts +2 -0
  27. package/lib/models/unified-plugin-definition.model.d.ts +41 -0
  28. package/lib/plugin-management.module.d.ts +12 -5
  29. package/lib/utils/csp-allows-origin.util.d.ts +13 -0
  30. package/lib/utils/external-plugin-compatibility.util.d.ts +11 -0
  31. package/lib/utils/external-plugin-egress.util.d.ts +15 -0
  32. package/lib/utils/index.d.ts +3 -0
  33. package/package.json +1 -1
  34. package/public-api.d.ts +5 -0
@@ -1 +1 @@
1
- {"version":3,"file":"valtimo-plugin-management.mjs","sources":["../../../../projects/valtimo/plugin-management/src/lib/models/plugin-modal.model.ts","../../../../projects/valtimo/plugin-management/src/lib/models/index.ts","../../../../projects/valtimo/plugin-management/src/lib/services/plugin-management-state.service.ts","../../../../projects/valtimo/plugin-management/src/lib/services/index.ts","../../../../projects/valtimo/plugin-management/src/lib/components/plugin-add-select/plugin-add-select.component.ts","../../../../projects/valtimo/plugin-management/src/lib/components/plugin-add-select/plugin-add-select.component.html","../../../../projects/valtimo/plugin-management/src/lib/components/plugin-configure/plugin-configure.component.ts","../../../../projects/valtimo/plugin-management/src/lib/components/plugin-configure/plugin-configure.component.html","../../../../projects/valtimo/plugin-management/src/lib/components/plugin-add-modal/plugin-add-modal.component.ts","../../../../projects/valtimo/plugin-management/src/lib/components/plugin-add-modal/plugin-add-modal.component.html","../../../../projects/valtimo/plugin-management/src/lib/components/plugin-edit/plugin-edit.component.ts","../../../../projects/valtimo/plugin-management/src/lib/components/plugin-edit/plugin-edit.component.html","../../../../projects/valtimo/plugin-management/src/lib/components/plugin-edit-modal/plugin-edit-modal.component.ts","../../../../projects/valtimo/plugin-management/src/lib/components/plugin-edit-modal/plugin-edit-modal.component.html","../../../../projects/valtimo/plugin-management/src/lib/components/plugin-management/plugin-management.component.ts","../../../../projects/valtimo/plugin-management/src/lib/components/plugin-management/plugin-management.component.html","../../../../projects/valtimo/plugin-management/src/lib/plugin-management-routing.ts","../../../../projects/valtimo/plugin-management/src/lib/plugin-management.module.ts","../../../../projects/valtimo/plugin-management/src/public-api.ts","../../../../projects/valtimo/plugin-management/src/valtimo-plugin-management.ts"],"sourcesContent":["/*\n * Copyright 2015-2025 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (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 * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\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\ntype PluginModal = 'add' | 'edit';\n\nexport {PluginModal};\n","/*\n * Copyright 2015-2025 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (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 * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\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 * from './plugin-modal.model';\n","/*\n * Copyright 2015-2025 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (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 * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\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 {Injectable} from '@angular/core';\nimport {BehaviorSubject, combineLatest, Observable, Subject} from 'rxjs';\nimport {map, take} from 'rxjs/operators';\nimport {PluginModal} from '../models';\nimport {\n PluginService,\n PluginSpecification,\n PluginConfiguration,\n PluginDefinition,\n PluginDefinitionWithLogo,\n} from '@valtimo/plugin';\nimport {DomSanitizer} from '@angular/platform-browser';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class PluginManagementStateService {\n private readonly _showModal$ = new Subject<PluginModal>();\n private readonly _hideModal$ = new Subject();\n private readonly _inputDisabled$ = new BehaviorSubject<boolean>(false);\n private readonly _refresh$ = new BehaviorSubject<null>(null);\n private readonly _save$ = new Subject<null>();\n private readonly _saveEdit$ = new Subject<null>();\n private readonly _delete$ = new Subject<null>();\n private readonly _hideModalSaveButton$ = new BehaviorSubject<boolean>(false);\n private readonly _pluginDefinitions$ = new BehaviorSubject<Array<PluginDefinition> | undefined>(\n undefined\n );\n private readonly _pluginDefinitionsWithLogos$: Observable<\n Array<PluginDefinitionWithLogo> | undefined\n > = combineLatest([\n this._pluginDefinitions$,\n this.pluginService.pluginSpecifications$,\n this.pluginService.availablePluginIds$,\n ]).pipe(\n map(([pluginDefinitions, pluginSpecifications, availablePluginIds]) =>\n pluginDefinitions\n ?.filter(pluginDefinition => availablePluginIds.includes(pluginDefinition.key))\n .map(pluginDefinition => {\n const pluginSpecification = pluginSpecifications.find(\n specification => specification.pluginId === pluginDefinition.key\n );\n\n return {\n ...pluginDefinition,\n ...(pluginSpecification?.pluginLogoBase64 && {\n pluginLogoBase64: this.sanitizer.bypassSecurityTrustResourceUrl(\n pluginSpecification?.pluginLogoBase64\n ),\n }),\n };\n })\n )\n );\n private readonly _selectedPluginDefinition$ = new BehaviorSubject<PluginDefinition | undefined>(\n undefined\n );\n\n private readonly _selectedPluginConfiguration$ = new BehaviorSubject<\n PluginConfiguration | undefined\n >(undefined);\n\n constructor(\n private readonly pluginService: PluginService,\n private readonly sanitizer: DomSanitizer\n ) {}\n\n get showModal$(): Observable<PluginModal> {\n return this._showModal$.asObservable();\n }\n\n get hideModal$(): Observable<any> {\n return this._hideModal$.asObservable();\n }\n\n get inputDisabled$(): Observable<boolean> {\n return this._inputDisabled$.asObservable();\n }\n\n get refresh$(): Observable<any> {\n return this._refresh$.asObservable();\n }\n\n get pluginDefinitions$(): Observable<Array<PluginDefinition> | undefined> {\n return this._pluginDefinitions$.asObservable();\n }\n\n get pluginDefinitionsWithLogos$(): Observable<Array<PluginDefinitionWithLogo> | undefined> {\n return this._pluginDefinitionsWithLogos$;\n }\n\n get selectedPluginDefinition$(): Observable<PluginDefinition | undefined> {\n return this._selectedPluginDefinition$.asObservable();\n }\n\n get selectedPluginConfiguration$(): Observable<PluginConfiguration | undefined> {\n return this._selectedPluginConfiguration$.asObservable();\n }\n\n get save$(): Observable<any> {\n return this._save$.asObservable();\n }\n\n get saveEdit$(): Observable<any> {\n return this._saveEdit$.asObservable();\n }\n\n get delete$(): Observable<any> {\n return this._delete$.asObservable();\n }\n\n get hideModalSaveButton$(): Observable<boolean> {\n return this._hideModalSaveButton$.asObservable();\n }\n\n showModal(modalType: PluginModal): void {\n this._showModal$.next(modalType);\n }\n\n hideModal(): void {\n this._hideModal$.next(null);\n }\n\n disableInput(): void {\n this._inputDisabled$.next(true);\n }\n\n enableInput(): void {\n this._inputDisabled$.next(false);\n }\n\n refresh(): void {\n this._refresh$.next(null);\n }\n\n setPluginDefinitions(definitions: Array<PluginDefinition>): void {\n this._pluginDefinitions$.next(definitions);\n }\n\n selectPluginDefinition(definition: PluginDefinition): void {\n this._selectedPluginDefinition$.next(definition);\n }\n\n selectPluginConfiguration(configuration: PluginConfiguration): void {\n this._selectedPluginConfiguration$.next(configuration);\n }\n\n clearSelectedPluginDefinition(): void {\n this._selectedPluginDefinition$.next(undefined);\n }\n\n clearSelectedPluginConfiguration(): void {\n this._selectedPluginConfiguration$.next(undefined);\n }\n\n save(): void {\n this._save$.next(null);\n }\n\n saveEdit(): void {\n this._saveEdit$.next(null);\n }\n\n delete(): void {\n this._delete$.next(null);\n }\n\n hideModalSaveButton(): void {\n this._hideModalSaveButton$.next(true);\n }\n\n showModalSaveButton(): void {\n this._hideModalSaveButton$.next(false);\n }\n\n clear(): void {\n this.clearSelectedPluginDefinition();\n this.clearSelectedPluginConfiguration();\n }\n}\n","/*\n * Copyright 2015-2025 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (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 * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\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 * from './plugin-management-state.service';\n","/*\n * Copyright 2015-2025 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (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 * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\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 {Component, OnDestroy, OnInit} from '@angular/core';\nimport {combineLatest, Subscription} from 'rxjs';\nimport {PluginManagementStateService} from '../../services';\nimport {PluginDefinition, PluginManagementService, PLUGIN_CATALOG_TEST_IDS} from '@valtimo/plugin';\n\n@Component({\n standalone: false,\n selector: 'valtimo-plugin-add-select',\n templateUrl: './plugin-add-select.component.html',\n styleUrls: ['./plugin-add-select.component.scss'],\n})\nexport class PluginAddSelectComponent implements OnInit, OnDestroy {\n public readonly selectedPluginDefinition$ = this.stateService.selectedPluginDefinition$;\n public readonly disabled$ = this.stateService.inputDisabled$;\n public readonly pluginDefinitionsWithLogos$ = this.stateService.pluginDefinitionsWithLogos$;\n public readonly testIds = PLUGIN_CATALOG_TEST_IDS;\n\n private refreshSubscription!: Subscription;\n\n constructor(\n private readonly pluginManagementService: PluginManagementService,\n private readonly stateService: PluginManagementStateService\n ) {}\n\n public ngOnInit(): void {\n this.openRefreshSubscription();\n this.getPluginDefinitions();\n }\n\n public ngOnDestroy(): void {\n this.refreshSubscription?.unsubscribe();\n }\n\n public selectPluginDefinition(event: {value: PluginDefinition}): void {\n this.stateService.selectPluginDefinition(event.value);\n }\n\n public deselectPluginDefinition(): void {\n this.stateService.clearSelectedPluginDefinition();\n }\n\n private getPluginDefinitions(): void {\n this.pluginManagementService.getPluginDefinitions().subscribe(pluginDefinitions => {\n this.stateService.setPluginDefinitions(pluginDefinitions);\n });\n }\n\n private openRefreshSubscription(): void {\n this.refreshSubscription = combineLatest([\n this.stateService.showModal$,\n this.stateService.refresh$,\n ]).subscribe(() => {\n this.stateService.clearSelectedPluginDefinition();\n });\n }\n}\n","<!--\n ~ Copyright 2015-2025 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (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 ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\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=\"pluginDefinitionsWithLogos$ | async as pluginDefinitions; else loading\">\n <div class=\"plugin-definition__grid\" [attr.data-test-id]=\"testIds.tileGrid\">\n <ng-container\n *ngTemplateOutlet=\"pluginDefinitionsTemplate; context: {pluginDefinitions: pluginDefinitions}\"\n ></ng-container>\n <ng-container\n *ngTemplateOutlet=\"\n noPluginDefinitionsTemplate;\n context: {pluginDefinitions: pluginDefinitions}\n \"\n ></ng-container>\n </div>\n</ng-container>\n\n<ng-template #noPluginDefinitionsTemplate let-pluginDefinitions=\"pluginDefinitions\">\n <div *ngIf=\"pluginDefinitions?.length === 0\" class=\"plugin-definition__no-results\">\n <v-paragraph [center]=\"true\" [fullWidth]=\"true\">{{\n 'pluginManagement.noDefinitions' | translate\n }}</v-paragraph>\n </div>\n</ng-template>\n\n<ng-template #pluginDefinitionsTemplate let-pluginDefinitions=\"pluginDefinitions\">\n <cds-tile-group [multiple]=\"false\" (selected)=\"selectPluginDefinition($event)\" [cdsLayer]=\"1\">\n <cds-selection-tile\n *ngFor=\"let pluginDefinition of pluginDefinitions\"\n [value]=\"pluginDefinition\"\n [selected]=\"(selectedPluginDefinition$ | async)?.key === pluginDefinition.key\"\n >\n <img\n class=\"plugin-definition-logo\"\n [title]=\"'title' | pluginTranslate: pluginDefinition.key | async\"\n [src]=\"pluginDefinition.pluginLogoBase64\"\n [attr.data-test-id]=\"testIds.tileLogo\"\n />\n\n <h5 [attr.data-test-id]=\"testIds.tileTitle\">\n {{ 'title' | pluginTranslate: pluginDefinition.key | async }}\n </h5>\n\n <p [attr.data-test-id]=\"testIds.tileDescription\">\n {{ 'description' | pluginTranslate: pluginDefinition.key | async }}\n </p>\n </cds-selection-tile>\n </cds-tile-group>\n</ng-template>\n\n<ng-template #loading>\n <div class=\"plugin-definition__grid\">\n <ng-container *ngTemplateOutlet=\"loadingCard\"></ng-container>\n <ng-container *ngTemplateOutlet=\"loadingCard\"></ng-container>\n <ng-container *ngTemplateOutlet=\"loadingCard\"></ng-container>\n </div>\n</ng-template>\n\n<ng-template #loadingCard>\n <div class=\"plugin-definition__item\">\n <cds-loading size=\"sm\"></cds-loading>\n </div>\n</ng-template>\n","/*\n * Copyright 2015-2025 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (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 * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\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 {Component, EventEmitter, Input, Output} from '@angular/core';\nimport {map, switchMap} from 'rxjs/operators';\nimport {PluginManagementStateService} from '../../services';\nimport {PluginConfigurationData} from '@valtimo/plugin';\nimport {of} from 'rxjs';\n\n@Component({\n standalone: false,\n selector: 'valtimo-plugin-configure',\n templateUrl: './plugin-configure.component.html',\n styleUrls: ['./plugin-configure.component.scss'],\n})\nexport class PluginConfigureComponent {\n @Output() valid: EventEmitter<boolean> = new EventEmitter<boolean>();\n @Output() configuration: EventEmitter<PluginConfigurationData> =\n new EventEmitter<PluginConfigurationData>();\n\n public readonly save$ = this.stateService.save$;\n\n public readonly pluginDefinitionKey$ = this.stateService.selectedPluginDefinition$.pipe(\n map(definition => definition?.key)\n );\n\n public readonly prefillConfiguration$ = of(undefined);\n\n public readonly disabled$ = this.stateService.inputDisabled$;\n\n constructor(private readonly stateService: PluginManagementStateService) {}\n\n public onValid(valid: boolean): void {\n this.valid.emit(valid);\n }\n\n public onFunctionConfiguration(configuration: PluginConfigurationData): void{\n this.configuration.emit(configuration);\n }\n}\n","<!--\n ~ Copyright 2015-2025 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (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 ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\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<valtimo-plugin-configuration-container\n *ngIf=\"pluginDefinitionKey$ | async as pluginDefinitionKey\"\n [cdsLayer]=\"1\"\n [pluginDefinitionKey]=\"pluginDefinitionKey\"\n [prefillConfiguration$]=\"prefillConfiguration$\"\n [save$]=\"save$\"\n [disabled$]=\"disabled$\"\n (valid)=\"onValid($event)\"\n (configuration)=\"onFunctionConfiguration($event)\"\n type=\"configuration\"\n></valtimo-plugin-configuration-container>\n","/*\n * Copyright 2015-2025 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (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 * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\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 {Component, EventEmitter, Input, Output} from '@angular/core';\nimport {PluginManagementStateService} from '../../services';\nimport {take} from 'rxjs/operators';\nimport {BehaviorSubject, Subject} from 'rxjs';\nimport {PluginConfigurationData, PluginManagementService} from '@valtimo/plugin';\nimport {NGXLogger} from 'ngx-logger';\nimport {CARBON_CONSTANTS} from '@valtimo/components';\n\n@Component({\n standalone: false,\n selector: 'valtimo-plugin-add-modal',\n templateUrl: './plugin-add-modal.component.html',\n styleUrls: ['./plugin-add-modal.component.scss'],\n})\nexport class PluginAddModalComponent {\n @Input() open = false;\n\n @Output() closeModal: EventEmitter<boolean> = new EventEmitter();\n\n public readonly inputDisabled$ = this.stateService.inputDisabled$;\n public readonly selectedPluginDefinition$ = this.stateService.selectedPluginDefinition$;\n public readonly configurationValid$ = new BehaviorSubject<boolean>(false);\n public readonly returnToFirstStepSubject$ = new Subject<boolean>();\n\n constructor(\n private readonly stateService: PluginManagementStateService,\n private readonly pluginManagementService: PluginManagementService,\n private readonly logger: NGXLogger\n ) {}\n\n public complete(): void {\n this.stateService.save();\n }\n\n public hide(): void {\n this.closeModal.emit();\n\n setTimeout(() => {\n this.returnToFirstStep();\n this.stateService.enableInput();\n this.stateService.clear();\n }, CARBON_CONSTANTS.modalAnimationMs);\n }\n\n public onValid(valid: boolean): void {\n this.configurationValid$.next(valid);\n }\n\n public onConfiguration(configuration: PluginConfigurationData): void {\n const pluginConfiguration = {...configuration};\n delete pluginConfiguration['configurationId'];\n delete pluginConfiguration['configurationTitle'];\n\n this.stateService.disableInput();\n\n this.stateService.selectedPluginDefinition$.pipe(take(1)).subscribe(selectedDefinition => {\n this.pluginManagementService\n .savePluginConfiguration({\n id: configuration.configurationId,\n definitionKey: selectedDefinition.key,\n title: configuration.configurationTitle,\n properties: pluginConfiguration,\n })\n .subscribe({\n next: () => {\n this.stateService.refresh();\n this.hide();\n },\n error: () => {\n this.logger.error('Something went wrong with saving the plugin configuration.');\n this.stateService.enableInput();\n },\n });\n });\n }\n\n private returnToFirstStep(): void {\n this.returnToFirstStepSubject$.next(true);\n }\n}\n","<!--\n ~ Copyright 2015-2025 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (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 ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\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<v-stepper-container\n (completeEvent)=\"complete()\"\n (cancelClickEvent)=\"hide()\"\n [disabled]=\"inputDisabled$ | async\"\n [returnToFirstStepSubject$]=\"returnToFirstStepSubject$\"\n>\n <cds-modal valtimoCdsModal #pluginAddModal [open]=\"open\" (close)=\"hide()\">\n <cds-modal-header [showCloseButton]=\"true\" (closeSelect)=\"hide()\">\n <v-stepper-header></v-stepper-header>\n </cds-modal-header>\n <section cdsModalContent>\n <v-stepper-content>\n <v-stepper-step titleTranslationKey=\"pluginManagement.addSteps.step0\">\n <valtimo-plugin-add-select></valtimo-plugin-add-select>\n </v-stepper-step>\n <v-stepper-step titleTranslationKey=\"pluginManagement.addSteps.step1\">\n <valtimo-plugin-configure\n (valid)=\"onValid($event)\"\n (configuration)=\"onConfiguration($event)\"\n ></valtimo-plugin-configure>\n </v-stepper-step>\n </v-stepper-content>\n </section>\n <cds-modal-footer>\n <v-stepper-footer class=\"stepper-footer\">\n <v-stepper-footer-step\n nextButtonTranslationKey=\"pluginManagement.addSteps.step1\"\n [nextButtonEnabled]=\"selectedPluginDefinition$ | async\"\n ></v-stepper-footer-step>\n <v-stepper-footer-step\n completeButtonTranslationKey=\"pluginManagement.addSteps.complete\"\n [completeButtonEnabled]=\"configurationValid$ | async\"\n ></v-stepper-footer-step>\n </v-stepper-footer>\n </cds-modal-footer>\n </cds-modal>\n</v-stepper-container>\n","/*\n * Copyright 2015-2025 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (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 * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\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 {Component, EventEmitter, Input, Output} from '@angular/core';\nimport {map, switchMap} from 'rxjs/operators';\nimport {PluginManagementStateService} from '../../services';\nimport {PluginConfigurationData} from '@valtimo/plugin';\n\n@Component({\n standalone: false,\n selector: 'valtimo-plugin-edit',\n templateUrl: './plugin-edit.component.html',\n styleUrls: ['./plugin-edit.component.scss'],\n})\nexport class PluginEditComponent {\n @Output() valid: EventEmitter<boolean> = new EventEmitter<boolean>();\n @Output() configuration: EventEmitter<PluginConfigurationData> =\n new EventEmitter<PluginConfigurationData>();\n\n public readonly saveEdit$ = this.stateService.saveEdit$;\n\n public readonly pluginDefinitionKey$ = this.stateService.selectedPluginConfiguration$.pipe(\n map(configuration => configuration?.pluginDefinition?.key)\n );\n\n public readonly prefillConfiguration$ = this.stateService.selectedPluginConfiguration$.pipe(\n map(configuration =>\n configuration\n ? {\n ...configuration.properties,\n configurationId: configuration.id,\n configurationTitle: configuration.title,\n }\n : undefined\n )\n );\n\n public readonly disabled$ = this.stateService.inputDisabled$;\n\n constructor(private readonly stateService: PluginManagementStateService) {}\n\n public onValid(valid: boolean): void {\n this.valid.emit(valid);\n }\n\n public onFunctionConfiguration(configuration: PluginConfigurationData): void {\n this.configuration.emit(configuration);\n }\n}\n","<!--\n ~ Copyright 2015-2025 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (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 ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\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<valtimo-plugin-configuration-container\n *ngIf=\"pluginDefinitionKey$ | async as pluginDefinitionKey\"\n [cdsLayer]=\"1\"\n [pluginDefinitionKey]=\"pluginDefinitionKey\"\n [prefillConfiguration$]=\"prefillConfiguration$\"\n [save$]=\"saveEdit$\"\n [disabled$]=\"disabled$\"\n (valid)=\"onValid($event)\"\n (configuration)=\"onFunctionConfiguration($event)\"\n type=\"configuration\"\n></valtimo-plugin-configuration-container>\n","/*\n * Copyright 2015-2025 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (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 * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\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 {Component, EventEmitter, Input, Output} from '@angular/core';\nimport {PluginManagementStateService} from '../../services';\nimport {take} from 'rxjs/operators';\nimport {BehaviorSubject, Observable} from 'rxjs';\nimport {\n PLUGIN_EDIT_MODAL_TEST_IDS,\n PluginConfiguration,\n PluginConfigurationData,\n PluginManagementService,\n} from '@valtimo/plugin';\nimport {NGXLogger} from 'ngx-logger';\n\n@Component({\n standalone: false,\n selector: 'valtimo-plugin-edit-modal',\n templateUrl: './plugin-edit-modal.component.html',\n styleUrls: ['./plugin-edit-modal.component.scss'],\n})\nexport class PluginEditModalComponent {\n @Input() public readonly open = false;\n @Input() public readonly saveNewConfiguration = false;\n\n @Output() closeModal: EventEmitter<boolean> = new EventEmitter();\n\n public readonly inputDisabled$ = this.stateService.inputDisabled$;\n public readonly selectedPluginConfiguration$: Observable<PluginConfiguration> =\n this.stateService.selectedPluginConfiguration$;\n public readonly configurationValid$ = new BehaviorSubject<boolean>(false);\n public readonly testIds = PLUGIN_EDIT_MODAL_TEST_IDS;\n\n constructor(\n private readonly stateService: PluginManagementStateService,\n private readonly pluginManagementService: PluginManagementService,\n private readonly logger: NGXLogger\n ) {}\n\n public save(): void {\n this.stateService.saveEdit();\n }\n\n public delete(): void {\n this.stateService.delete();\n this.stateService.disableInput();\n\n this.stateService.selectedPluginConfiguration$\n .pipe(take(1))\n .subscribe(selectedPluginConfiguration => {\n this.pluginManagementService\n .deletePluginConfiguration(selectedPluginConfiguration.id)\n .subscribe(\n () => {\n this.stateService.refresh();\n this.hide();\n },\n () => {\n this.logger.error('Something went wrong with deleting the plugin configuration.');\n this.stateService.enableInput();\n }\n );\n });\n }\n\n public hide(): void {\n this.closeModal.emit();\n this.stateService.enableInput();\n }\n\n public onPluginValid(valid: boolean): void {\n this.configurationValid$.next(valid);\n }\n\n public onPluginConfiguration(configuration: PluginConfigurationData): void {\n this.stateService.disableInput();\n\n if (this.saveNewConfiguration) {\n this.saveNewPluginConfiguration(configuration);\n return;\n }\n\n this.stateService.selectedPluginConfiguration$\n .pipe(take(1))\n .subscribe(selectedPluginConfiguration => {\n const configurationId = configuration.configurationId;\n const configurationTitle = configuration.configurationTitle;\n const configurationData = {...configuration};\n delete configurationData['configurationTitle'];\n\n this.pluginManagementService\n .updatePluginConfiguration(\n selectedPluginConfiguration.id,\n configurationId,\n configurationTitle,\n configurationData\n )\n .subscribe({\n next: () => {\n this.stateService.refresh();\n this.hide();\n },\n error: () => {\n this.logger.error('Something went wrong with updating the plugin configuration.');\n this.stateService.enableInput();\n },\n });\n });\n }\n\n private saveNewPluginConfiguration(configuration: PluginConfigurationData): void {\n this.stateService.selectedPluginConfiguration$\n .pipe(take(1))\n .subscribe(selectedPluginConfiguration => {\n const duplicatedConfiguration = {...selectedPluginConfiguration, properties: configuration};\n\n duplicatedConfiguration.title = duplicatedConfiguration.properties.configurationTitle;\n\n delete duplicatedConfiguration.properties.configurationTitle;\n delete duplicatedConfiguration.properties.configurationId;\n\n this.pluginManagementService.savePluginConfiguration(duplicatedConfiguration).subscribe({\n next: () => {\n this.stateService.refresh();\n this.hide();\n },\n error: () => {\n this.logger.error(\n 'Something went wrong with saving the duplicated plugin configuration.'\n );\n this.stateService.enableInput();\n },\n });\n });\n }\n}\n","<!--\n ~ Copyright 2015-2025 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (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 ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\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<cds-modal\n #pluginEditModal\n valtimoCdsModal\n [open]=\"open\"\n (close)=\"hide()\"\n *ngIf=\"{selectedConfiguration: selectedPluginConfiguration$ | async} as obs\"\n>\n <cds-modal-header [showCloseButton]=\"true\" (closeSelect)=\"hide()\">\n {{\n obs.selectedConfiguration?.title +\n ' - ' +\n ('title' | pluginTranslate: obs.selectedConfiguration?.pluginDefinition?.key | async)\n }}\n </cds-modal-header>\n <section cdsModalContent>\n <valtimo-plugin-edit\n (valid)=\"onPluginValid($event)\"\n (configuration)=\"onPluginConfiguration($event)\"\n ></valtimo-plugin-edit>\n </section>\n <cds-modal-footer>\n <button\n cdsButton=\"danger\"\n [attr.data-test-id]=\"testIds.deleteButton\"\n (click)=\"delete()\"\n [disabled]=\"inputDisabled$ | async\"\n >\n {{ 'pluginManagement.remove' | translate }}\n </button>\n <button\n cdsButton=\"primary\"\n [attr.data-test-id]=\"testIds.saveButton\"\n [disabled]=\"(configurationValid$ | async) === false || (inputDisabled$ | async)\"\n (click)=\"save()\"\n >\n {{ 'pluginManagement.save' | translate }}\n </button>\n </cds-modal-footer>\n</cds-modal>\n","/*\n * Copyright 2015-2025 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (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 * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\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} from '@angular/core';\nimport {TranslateService} from '@ngx-translate/core';\nimport {ActionItem, ColumnConfig, ViewType} from '@valtimo/components';\nimport {\n PluginConfiguration,\n PluginManagementService,\n PluginTranslationService,\n} from '@valtimo/plugin';\nimport {NGXLogger} from 'ngx-logger';\nimport {BehaviorSubject, combineLatest, Observable} from 'rxjs';\nimport {map, switchMap, take, tap} from 'rxjs/operators';\nimport {PluginManagementStateService} from '../../services';\nimport {cloneDeep} from 'lodash';\nimport {v4 as uuidv4} from 'uuid';\n\n@Component({\n standalone: false,\n selector: 'valtimo-plugin-management',\n templateUrl: './plugin-management.component.html',\n styleUrls: ['./plugin-management.component.scss'],\n})\nexport class PluginManagementComponent {\n public readonly fields: ColumnConfig[] = [\n {\n key: 'title',\n label: 'pluginManagement.labels.configurationName',\n viewType: ViewType.TEXT,\n },\n {\n key: 'pluginName',\n label: 'pluginManagement.labels.pluginName',\n viewType: ViewType.TEXT,\n },\n {\n key: 'definitionKey',\n label: 'pluginManagement.labels.identifier',\n viewType: ViewType.TEXT,\n },\n ];\n public readonly actionItems: ActionItem[] = [\n {\n callback: this.editConfiguration.bind(this),\n label: 'interface.edit',\n },\n {\n label: 'interface.duplicate',\n callback: this.duplicateConfiguration.bind(this),\n },\n {\n callback: this.deleteConfiguration.bind(this),\n label: 'interface.delete',\n type: 'danger',\n },\n ];\n\n public readonly loading$ = new BehaviorSubject<boolean>(true);\n public readonly showEditModal$ = new BehaviorSubject<boolean>(false);\n public readonly showAddModal$ = new BehaviorSubject<boolean>(false);\n public readonly pluginConfigurations$: Observable<PluginConfiguration[]> =\n this.stateService.refresh$.pipe(\n switchMap(() =>\n combineLatest([\n this.pluginManagementService.getAllPluginConfigurations(),\n this.translateService.stream('key'),\n ]).pipe(\n map(([pluginConfigurations]) =>\n pluginConfigurations.map(configuration => ({\n ...configuration,\n pluginName: this.pluginTranslationService.instant(\n 'title',\n configuration.pluginDefinition?.key ?? ''\n ),\n definitionKey: configuration.pluginDefinition?.key ?? '',\n }))\n ),\n tap(() => {\n this.loading$.next(false);\n })\n )\n )\n );\n\n public readonly saveNewConfiguration$ = new BehaviorSubject<boolean>(false);\n\n constructor(\n private readonly logger: NGXLogger,\n private readonly pluginManagementService: PluginManagementService,\n private readonly pluginTranslationService: PluginTranslationService,\n private readonly stateService: PluginManagementStateService,\n private readonly translateService: TranslateService\n ) {}\n\n public showAddModal(): void {\n this.showAddModal$.next(true);\n }\n\n public editConfiguration(configuration: PluginConfiguration): void {\n this.showEditModal$.next(true);\n this.saveNewConfiguration$.next(false);\n this.stateService.selectPluginConfiguration(configuration);\n }\n\n public deleteConfiguration(configuration: PluginConfiguration): void {\n if (!configuration.id) {\n return;\n }\n\n this.pluginManagementService\n .deletePluginConfiguration(configuration.id)\n .pipe(take(1))\n .subscribe({\n next: () => {\n this.stateService.refresh();\n },\n error: () => {\n this.logger.error('Something went wrong with deleting the plugin configuration.');\n },\n });\n }\n\n public closeEditModal(): void {\n this.showEditModal$.next(false);\n }\n\n public closeAddModal(): void {\n this.showAddModal$.next(false);\n }\n\n public duplicateConfiguration(configuration: PluginConfiguration): void {\n const configurationClone = cloneDeep(configuration);\n configurationClone.id = uuidv4();\n this.showEditModal$.next(true);\n this.saveNewConfiguration$.next(true);\n this.stateService.selectPluginConfiguration(configurationClone);\n }\n}\n","<!--\n ~ Copyright 2015-2025 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (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 ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\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<ng-container\n *ngIf=\"{\n pluginConfigurations: pluginConfigurations$ | async,\n loading: loading$ | async,\n } as obs\"\n>\n <valtimo-carbon-list\n [actionItems]=\"actionItems\"\n [loading]=\"obs.loading\"\n [items]=\"obs.pluginConfigurations\"\n [fields]=\"fields\"\n [header]=\"false\"\n (rowClicked)=\"editConfiguration($event)\"\n >\n <ng-container carbonToolbarContent [ngTemplateOutlet]=\"configurePluginButton\"></ng-container>\n\n <valtimo-no-results\n [action]=\"configurePluginButton\"\n [title]=\"'pages.plugins.noResults' | translate\"\n ></valtimo-no-results>\n </valtimo-carbon-list>\n\n <ng-template #configurePluginButton>\n <button cdsButton=\"primary\" [disabled]=\"obs.loading\" (click)=\"showAddModal()\">\n {{ 'pluginManagement.add' | translate }}\n\n <svg cdsIcon=\"add\" size=\"16\" class=\"cds--btn__icon\"></svg>\n </button>\n </ng-template>\n</ng-container>\n\n<valtimo-plugin-add-modal\n [open]=\"showAddModal$ | async\"\n (closeModal)=\"closeAddModal()\"\n></valtimo-plugin-add-modal>\n\n<valtimo-plugin-edit-modal\n [open]=\"showEditModal$ | async\"\n [saveNewConfiguration]=\"saveNewConfiguration$ | async\"\n (closeModal)=\"closeEditModal()\"\n></valtimo-plugin-edit-modal>\n","/*\n * Copyright 2015-2025 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (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 * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\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 {NgModule} from '@angular/core';\nimport {RouterModule, Routes} from '@angular/router';\nimport {CommonModule} from '@angular/common';\nimport {AuthGuardService} from '@valtimo/security';\nimport {ROLE_ADMIN} from '@valtimo/shared';\nimport {PluginManagementComponent} from './components/plugin-management/plugin-management.component';\n\nconst routes: Routes = [\n {\n path: 'plugins',\n component: PluginManagementComponent,\n canActivate: [AuthGuardService],\n data: {title: 'Plugins', roles: [ROLE_ADMIN]},\n },\n];\n\n@NgModule({\n declarations: [],\n imports: [CommonModule, RouterModule.forChild(routes)],\n exports: [RouterModule],\n})\nexport class PluginManagementRoutingModule {}\n","/*\n * Copyright 2015-2025 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (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 * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\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 {NgModule} from '@angular/core';\nimport {PluginManagementRoutingModule} from './plugin-management-routing';\nimport {CommonModule} from '@angular/common';\nimport {TranslateModule} from '@ngx-translate/core';\nimport {PluginManagementComponent} from './components/plugin-management/plugin-management.component';\nimport {PluginAddModalComponent} from './components/plugin-add-modal/plugin-add-modal.component';\nimport {PluginManagementStateService} from './services';\nimport {PluginAddSelectComponent} from './components/plugin-add-select/plugin-add-select.component';\nimport {PluginConfigureComponent} from './components/plugin-configure/plugin-configure.component';\nimport {PluginConfigurationContainerModule, PluginTranslatePipeModule} from '@valtimo/plugin';\nimport {PluginEditModalComponent} from './components/plugin-edit-modal/plugin-edit-modal.component';\nimport {PluginEditComponent} from './components/plugin-edit/plugin-edit.component';\nimport {\n CarbonListModule,\n ParagraphModule,\n StepperModule,\n TableModule,\n ValtimoCdsModalDirective,\n VModalModule,\n} from '@valtimo/components';\nimport {\n ButtonModule as CarbonButtonModule,\n IconModule,\n LayerModule,\n LoadingModule,\n ModalModule as CarbonModalModule,\n TilesModule,\n} from 'carbon-components-angular';\n\n@NgModule({\n providers: [PluginManagementStateService],\n declarations: [\n PluginManagementComponent,\n PluginAddModalComponent,\n PluginAddSelectComponent,\n PluginConfigureComponent,\n PluginEditModalComponent,\n PluginEditComponent,\n ],\n imports: [\n CommonModule,\n PluginManagementRoutingModule,\n TranslateModule,\n ParagraphModule,\n TableModule,\n StepperModule,\n VModalModule,\n PluginTranslatePipeModule,\n PluginConfigurationContainerModule,\n CarbonButtonModule,\n CarbonListModule,\n CarbonModalModule,\n IconModule,\n ValtimoCdsModalDirective,\n LayerModule,\n TilesModule,\n LoadingModule,\n ],\n exports: [\n PluginManagementComponent,\n PluginAddModalComponent,\n PluginAddSelectComponent,\n PluginConfigureComponent,\n PluginEditModalComponent,\n PluginEditComponent,\n ],\n})\nexport class PluginManagementModule {}\n","/*\n * Copyright 2015-2025 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (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 * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\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 * Public API Surface of plugin-management\n */\n\nexport * from './lib/models';\nexport * from './lib/services';\nexport * from './lib/plugin-management.module';\nexport * from './lib/components/plugin-management/plugin-management.component';\nexport * from './lib/components/plugin-add-modal/plugin-add-modal.component';\nexport * from './lib/components/plugin-add-select/plugin-add-select.component';\nexport * from './lib/components/plugin-configure/plugin-configure.component';\nexport * from './lib/components/plugin-edit-modal/plugin-edit-modal.component';\nexport * from './lib/components/plugin-edit/plugin-edit.component';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","i2","i2.PluginManagementStateService","i6","i1.PluginManagementStateService","i3","i4","i6.PluginAddSelectComponent","i7.PluginConfigureComponent","i8","i7.PluginEditComponent","uuidv4","i3.PluginManagementStateService","i5","i7","i8.PluginAddModalComponent","i9.PluginEditModalComponent","CarbonButtonModule","CarbonModalModule"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAAA;;;;;;;;;;;;;;AAcG;;ACdH;;;;;;;;;;;;;;AAcG;;ACdH;;;;;;;;;;;;;;AAcG;MAkBU,4BAA4B,CAAA;IA8CvC,WAAA,CACmB,aAA4B,EAC5B,SAAuB,EAAA;QADvB,IAAA,CAAA,aAAa,GAAb,aAAa;QACb,IAAA,CAAA,SAAS,GAAT,SAAS;AA/CX,QAAA,IAAA,CAAA,WAAW,GAAG,IAAI,OAAO,EAAe;AACxC,QAAA,IAAA,CAAA,WAAW,GAAG,IAAI,OAAO,EAAE;AAC3B,QAAA,IAAA,CAAA,eAAe,GAAG,IAAI,eAAe,CAAU,KAAK,CAAC;AACrD,QAAA,IAAA,CAAA,SAAS,GAAG,IAAI,eAAe,CAAO,IAAI,CAAC;AAC3C,QAAA,IAAA,CAAA,MAAM,GAAG,IAAI,OAAO,EAAQ;AAC5B,QAAA,IAAA,CAAA,UAAU,GAAG,IAAI,OAAO,EAAQ;AAChC,QAAA,IAAA,CAAA,QAAQ,GAAG,IAAI,OAAO,EAAQ;AAC9B,QAAA,IAAA,CAAA,qBAAqB,GAAG,IAAI,eAAe,CAAU,KAAK,CAAC;AAC3D,QAAA,IAAA,CAAA,mBAAmB,GAAG,IAAI,eAAe,CACxD,SAAS,CACV;QACgB,IAAA,CAAA,4BAA4B,GAEzC,aAAa,CAAC;AAChB,YAAA,IAAI,CAAC,mBAAmB;YACxB,IAAI,CAAC,aAAa,CAAC,qBAAqB;YACxC,IAAI,CAAC,aAAa,CAAC,mBAAmB;AACvC,SAAA,CAAC,CAAC,IAAI,CACL,GAAG,CAAC,CAAC,CAAC,iBAAiB,EAAE,oBAAoB,EAAE,kBAAkB,CAAC,KAChE;AACE,cAAE,MAAM,CAAC,gBAAgB,IAAI,kBAAkB,CAAC,QAAQ,CAAC,gBAAgB,CAAC,GAAG,CAAC;aAC7E,GAAG,CAAC,gBAAgB,IAAG;AACtB,YAAA,MAAM,mBAAmB,GAAG,oBAAoB,CAAC,IAAI,CACnD,aAAa,IAAI,aAAa,CAAC,QAAQ,KAAK,gBAAgB,CAAC,GAAG,CACjE;YAED,OAAO;AACL,gBAAA,GAAG,gBAAgB;AACnB,gBAAA,IAAI,mBAAmB,EAAE,gBAAgB,IAAI;oBAC3C,gBAAgB,EAAE,IAAI,CAAC,SAAS,CAAC,8BAA8B,CAC7D,mBAAmB,EAAE,gBAAgB,CACtC;iBACF,CAAC;aACH;QACH,CAAC,CAAC,CACL,CACF;AACgB,QAAA,IAAA,CAAA,0BAA0B,GAAG,IAAI,eAAe,CAC/D,SAAS,CACV;AAEgB,QAAA,IAAA,CAAA,6BAA6B,GAAG,IAAI,eAAe,CAElE,SAAS,CAAC;IAKT;AAEH,IAAA,IAAI,UAAU,GAAA;AACZ,QAAA,OAAO,IAAI,CAAC,WAAW,CAAC,YAAY,EAAE;IACxC;AAEA,IAAA,IAAI,UAAU,GAAA;AACZ,QAAA,OAAO,IAAI,CAAC,WAAW,CAAC,YAAY,EAAE;IACxC;AAEA,IAAA,IAAI,cAAc,GAAA;AAChB,QAAA,OAAO,IAAI,CAAC,eAAe,CAAC,YAAY,EAAE;IAC5C;AAEA,IAAA,IAAI,QAAQ,GAAA;AACV,QAAA,OAAO,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE;IACtC;AAEA,IAAA,IAAI,kBAAkB,GAAA;AACpB,QAAA,OAAO,IAAI,CAAC,mBAAmB,CAAC,YAAY,EAAE;IAChD;AAEA,IAAA,IAAI,2BAA2B,GAAA;QAC7B,OAAO,IAAI,CAAC,4BAA4B;IAC1C;AAEA,IAAA,IAAI,yBAAyB,GAAA;AAC3B,QAAA,OAAO,IAAI,CAAC,0BAA0B,CAAC,YAAY,EAAE;IACvD;AAEA,IAAA,IAAI,4BAA4B,GAAA;AAC9B,QAAA,OAAO,IAAI,CAAC,6BAA6B,CAAC,YAAY,EAAE;IAC1D;AAEA,IAAA,IAAI,KAAK,GAAA;AACP,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE;IACnC;AAEA,IAAA,IAAI,SAAS,GAAA;AACX,QAAA,OAAO,IAAI,CAAC,UAAU,CAAC,YAAY,EAAE;IACvC;AAEA,IAAA,IAAI,OAAO,GAAA;AACT,QAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,YAAY,EAAE;IACrC;AAEA,IAAA,IAAI,oBAAoB,GAAA;AACtB,QAAA,OAAO,IAAI,CAAC,qBAAqB,CAAC,YAAY,EAAE;IAClD;AAEA,IAAA,SAAS,CAAC,SAAsB,EAAA;AAC9B,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC;IAClC;IAEA,SAAS,GAAA;AACP,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC;IAC7B;IAEA,YAAY,GAAA;AACV,QAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC;IACjC;IAEA,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC;IAClC;IAEA,OAAO,GAAA;AACL,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC;IAC3B;AAEA,IAAA,oBAAoB,CAAC,WAAoC,EAAA;AACvD,QAAA,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,WAAW,CAAC;IAC5C;AAEA,IAAA,sBAAsB,CAAC,UAA4B,EAAA;AACjD,QAAA,IAAI,CAAC,0BAA0B,CAAC,IAAI,CAAC,UAAU,CAAC;IAClD;AAEA,IAAA,yBAAyB,CAAC,aAAkC,EAAA;AAC1D,QAAA,IAAI,CAAC,6BAA6B,CAAC,IAAI,CAAC,aAAa,CAAC;IACxD;IAEA,6BAA6B,GAAA;AAC3B,QAAA,IAAI,CAAC,0BAA0B,CAAC,IAAI,CAAC,SAAS,CAAC;IACjD;IAEA,gCAAgC,GAAA;AAC9B,QAAA,IAAI,CAAC,6BAA6B,CAAC,IAAI,CAAC,SAAS,CAAC;IACpD;IAEA,IAAI,GAAA;AACF,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;IACxB;IAEA,QAAQ,GAAA;AACN,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC;IAC5B;IAEA,MAAM,GAAA;AACJ,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;IAC1B;IAEA,mBAAmB,GAAA;AACjB,QAAA,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC;IACvC;IAEA,mBAAmB,GAAA;AACjB,QAAA,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,KAAK,CAAC;IACxC;IAEA,KAAK,GAAA;QACH,IAAI,CAAC,6BAA6B,EAAE;QACpC,IAAI,CAAC,gCAAgC,EAAE;IACzC;+GAlKW,4BAA4B,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAA,EAAA,CAAA,aAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,IAAA,CAAA,YAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAA5B,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,4BAA4B,cAF3B,MAAM,EAAA,CAAA,CAAA;;4FAEP,4BAA4B,EAAA,UAAA,EAAA,CAAA;kBAHxC,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;;AC/BD;;;;;;;;;;;;;;AAcG;;ACdH;;;;;;;;;;;;;;AAcG;MAaU,wBAAwB,CAAA;IAQnC,WAAA,CACmB,uBAAgD,EAChD,YAA0C,EAAA;QAD1C,IAAA,CAAA,uBAAuB,GAAvB,uBAAuB;QACvB,IAAA,CAAA,YAAY,GAAZ,YAAY;AATf,QAAA,IAAA,CAAA,yBAAyB,GAAG,IAAI,CAAC,YAAY,CAAC,yBAAyB;AACvE,QAAA,IAAA,CAAA,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,cAAc;AAC5C,QAAA,IAAA,CAAA,2BAA2B,GAAG,IAAI,CAAC,YAAY,CAAC,2BAA2B;QAC3E,IAAA,CAAA,OAAO,GAAG,uBAAuB;IAO9C;IAEI,QAAQ,GAAA;QACb,IAAI,CAAC,uBAAuB,EAAE;QAC9B,IAAI,CAAC,oBAAoB,EAAE;IAC7B;IAEO,WAAW,GAAA;AAChB,QAAA,IAAI,CAAC,mBAAmB,EAAE,WAAW,EAAE;IACzC;AAEO,IAAA,sBAAsB,CAAC,KAAgC,EAAA;QAC5D,IAAI,CAAC,YAAY,CAAC,sBAAsB,CAAC,KAAK,CAAC,KAAK,CAAC;IACvD;IAEO,wBAAwB,GAAA;AAC7B,QAAA,IAAI,CAAC,YAAY,CAAC,6BAA6B,EAAE;IACnD;IAEQ,oBAAoB,GAAA;QAC1B,IAAI,CAAC,uBAAuB,CAAC,oBAAoB,EAAE,CAAC,SAAS,CAAC,iBAAiB,IAAG;AAChF,YAAA,IAAI,CAAC,YAAY,CAAC,oBAAoB,CAAC,iBAAiB,CAAC;AAC3D,QAAA,CAAC,CAAC;IACJ;IAEQ,uBAAuB,GAAA;AAC7B,QAAA,IAAI,CAAC,mBAAmB,GAAG,aAAa,CAAC;YACvC,IAAI,CAAC,YAAY,CAAC,UAAU;YAC5B,IAAI,CAAC,YAAY,CAAC,QAAQ;AAC3B,SAAA,CAAC,CAAC,SAAS,CAAC,MAAK;AAChB,YAAA,IAAI,CAAC,YAAY,CAAC,6BAA6B,EAAE;AACnD,QAAA,CAAC,CAAC;IACJ;+GA3CW,wBAAwB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAD,EAAA,CAAA,uBAAA,EAAA,EAAA,EAAA,KAAA,EAAAE,4BAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAxB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,wBAAwB,sFC3BrC,k6FA4EA,EAAA,MAAA,EAAA,CAAA,g/CAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,cAAA,EAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,WAAA,EAAA,QAAA,EAAA,QAAA,EAAA,SAAA,EAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,cAAA,EAAA,QAAA,EAAA,wBAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,wCAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,IAAA,EAAA,UAAA,EAAA,OAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,gCAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,QAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,0BAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,UAAA,EAAA,MAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,IAAA,EAAA,OAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,aAAA,EAAA,IAAA,EAAA,WAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAH,EAAA,CAAA,mBAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FDjDa,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBANpC,SAAS;AACI,YAAA,IAAA,EAAA,CAAA,EAAA,UAAA,EAAA,KAAK,YACP,2BAA2B,EAAA,QAAA,EAAA,k6FAAA,EAAA,MAAA,EAAA,CAAA,g/CAAA,CAAA,EAAA;;;AEvBvC;;;;;;;;;;;;;;AAcG;MAcU,wBAAwB,CAAA;AAenC,IAAA,WAAA,CAA6B,YAA0C,EAAA;QAA1C,IAAA,CAAA,YAAY,GAAZ,YAAY;AAd/B,QAAA,IAAA,CAAA,KAAK,GAA0B,IAAI,YAAY,EAAW;AAC1D,QAAA,IAAA,CAAA,aAAa,GACrB,IAAI,YAAY,EAA2B;AAE7B,QAAA,IAAA,CAAA,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK;QAE/B,IAAA,CAAA,oBAAoB,GAAG,IAAI,CAAC,YAAY,CAAC,yBAAyB,CAAC,IAAI,CACrF,GAAG,CAAC,UAAU,IAAI,UAAU,EAAE,GAAG,CAAC,CACnC;AAEe,QAAA,IAAA,CAAA,qBAAqB,GAAG,EAAE,CAAC,SAAS,CAAC;AAErC,QAAA,IAAA,CAAA,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,cAAc;IAEc;AAEnE,IAAA,OAAO,CAAC,KAAc,EAAA;AAC3B,QAAA,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC;IACxB;AAEO,IAAA,uBAAuB,CAAC,aAAsC,EAAA;AACnE,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,aAAa,CAAC;IACxC;+GAvBW,wBAAwB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAI,4BAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAxB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,wBAAwB,kJC5BrC,okCA2BA,EAAA,MAAA,EAAA,CAAA,goBAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAH,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAI,EAAA,CAAA,qCAAA,EAAA,QAAA,EAAA,wCAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,qBAAA,EAAA,aAAA,EAAA,OAAA,EAAA,WAAA,EAAA,8BAAA,EAAA,uBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,OAAA,EAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,cAAA,EAAA,QAAA,EAAA,wBAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAL,EAAA,CAAA,SAAA,EAAA,IAAA,EAAA,OAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FDCa,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBANpC,SAAS;AACI,YAAA,IAAA,EAAA,CAAA,EAAA,UAAA,EAAA,KAAK,YACP,0BAA0B,EAAA,QAAA,EAAA,okCAAA,EAAA,MAAA,EAAA,CAAA,goBAAA,CAAA,EAAA;8FAK1B,KAAK,EAAA,CAAA;sBAAd;gBACS,aAAa,EAAA,CAAA;sBAAtB;;;AE9BH;;;;;;;;;;;;;;AAcG;MAgBU,uBAAuB,CAAA;AAUlC,IAAA,WAAA,CACmB,YAA0C,EAC1C,uBAAgD,EAChD,MAAiB,EAAA;QAFjB,IAAA,CAAA,YAAY,GAAZ,YAAY;QACZ,IAAA,CAAA,uBAAuB,GAAvB,uBAAuB;QACvB,IAAA,CAAA,MAAM,GAAN,MAAM;QAZhB,IAAA,CAAA,IAAI,GAAG,KAAK;AAEX,QAAA,IAAA,CAAA,UAAU,GAA0B,IAAI,YAAY,EAAE;AAEhD,QAAA,IAAA,CAAA,cAAc,GAAG,IAAI,CAAC,YAAY,CAAC,cAAc;AACjD,QAAA,IAAA,CAAA,yBAAyB,GAAG,IAAI,CAAC,YAAY,CAAC,yBAAyB;AACvE,QAAA,IAAA,CAAA,mBAAmB,GAAG,IAAI,eAAe,CAAU,KAAK,CAAC;AACzD,QAAA,IAAA,CAAA,yBAAyB,GAAG,IAAI,OAAO,EAAW;IAM/D;IAEI,QAAQ,GAAA;AACb,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE;IAC1B;IAEO,IAAI,GAAA;AACT,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE;QAEtB,UAAU,CAAC,MAAK;YACd,IAAI,CAAC,iBAAiB,EAAE;AACxB,YAAA,IAAI,CAAC,YAAY,CAAC,WAAW,EAAE;AAC/B,YAAA,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE;AAC3B,QAAA,CAAC,EAAE,gBAAgB,CAAC,gBAAgB,CAAC;IACvC;AAEO,IAAA,OAAO,CAAC,KAAc,EAAA;AAC3B,QAAA,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,KAAK,CAAC;IACtC;AAEO,IAAA,eAAe,CAAC,aAAsC,EAAA;AAC3D,QAAA,MAAM,mBAAmB,GAAG,EAAC,GAAG,aAAa,EAAC;AAC9C,QAAA,OAAO,mBAAmB,CAAC,iBAAiB,CAAC;AAC7C,QAAA,OAAO,mBAAmB,CAAC,oBAAoB,CAAC;AAEhD,QAAA,IAAI,CAAC,YAAY,CAAC,YAAY,EAAE;AAEhC,QAAA,IAAI,CAAC,YAAY,CAAC,yBAAyB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,kBAAkB,IAAG;AACvF,YAAA,IAAI,CAAC;AACF,iBAAA,uBAAuB,CAAC;gBACvB,EAAE,EAAE,aAAa,CAAC,eAAe;gBACjC,aAAa,EAAE,kBAAkB,CAAC,GAAG;gBACrC,KAAK,EAAE,aAAa,CAAC,kBAAkB;AACvC,gBAAA,UAAU,EAAE,mBAAmB;aAChC;AACA,iBAAA,SAAS,CAAC;gBACT,IAAI,EAAE,MAAK;AACT,oBAAA,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE;oBAC3B,IAAI,CAAC,IAAI,EAAE;gBACb,CAAC;gBACD,KAAK,EAAE,MAAK;AACV,oBAAA,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,4DAA4D,CAAC;AAC/E,oBAAA,IAAI,CAAC,YAAY,CAAC,WAAW,EAAE;gBACjC,CAAC;AACF,aAAA,CAAC;AACN,QAAA,CAAC,CAAC;IACJ;IAEQ,iBAAiB,GAAA;AACvB,QAAA,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,IAAI,CAAC;IAC3C;+GAhEW,uBAAuB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAG,4BAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,uBAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,IAAA,CAAA,SAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAvB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,uBAAuB,sJC9BpC,srEAqDA,EAAA,MAAA,EAAA,CAAA,6pBAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,yBAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,2BAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,kBAAA,EAAA,eAAA,EAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,uBAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,sBAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,sBAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,0BAAA,EAAA,QAAA,EAAA,uBAAA,EAAA,MAAA,EAAA,CAAA,mBAAA,EAAA,uBAAA,EAAA,0BAAA,EAAA,4BAAA,EAAA,8BAAA,EAAA,uBAAA,EAAA,oBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,QAAA,EAAA,sBAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,OAAA,EAAA,WAAA,EAAA,MAAA,EAAA,SAAA,EAAA,qBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,iBAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,WAAA,EAAA,QAAA,EAAA,oCAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,YAAA,EAAA,iBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,WAAA,EAAA,QAAA,EAAA,oCAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,YAAA,EAAA,QAAA,EAAA,sCAAA,EAAA,MAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,wBAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAE,wBAAA,EAAA,QAAA,EAAA,2BAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,wBAAA,EAAA,QAAA,EAAA,0BAAA,EAAA,OAAA,EAAA,CAAA,OAAA,EAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,SAAA,EAAA,IAAA,EAAA,OAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FDvBa,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBANnC,SAAS;AACI,YAAA,IAAA,EAAA,CAAA,EAAA,UAAA,EAAA,KAAK,YACP,0BAA0B,EAAA,QAAA,EAAA,srEAAA,EAAA,MAAA,EAAA,CAAA,6pBAAA,CAAA,EAAA;8JAK3B,IAAI,EAAA,CAAA;sBAAZ;gBAES,UAAU,EAAA,CAAA;sBAAnB;;;AEjCH;;;;;;;;;;;;;;AAcG;MAaU,mBAAmB,CAAA;AAyB9B,IAAA,WAAA,CAA6B,YAA0C,EAAA;QAA1C,IAAA,CAAA,YAAY,GAAZ,YAAY;AAxB/B,QAAA,IAAA,CAAA,KAAK,GAA0B,IAAI,YAAY,EAAW;AAC1D,QAAA,IAAA,CAAA,aAAa,GACrB,IAAI,YAAY,EAA2B;AAE7B,QAAA,IAAA,CAAA,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,SAAS;QAEvC,IAAA,CAAA,oBAAoB,GAAG,IAAI,CAAC,YAAY,CAAC,4BAA4B,CAAC,IAAI,CACxF,GAAG,CAAC,aAAa,IAAI,aAAa,EAAE,gBAAgB,EAAE,GAAG,CAAC,CAC3D;AAEe,QAAA,IAAA,CAAA,qBAAqB,GAAG,IAAI,CAAC,YAAY,CAAC,4BAA4B,CAAC,IAAI,CACzF,GAAG,CAAC,aAAa,IACf;AACE,cAAE;gBACE,GAAG,aAAa,CAAC,UAAU;gBAC3B,eAAe,EAAE,aAAa,CAAC,EAAE;gBACjC,kBAAkB,EAAE,aAAa,CAAC,KAAK;AACxC;AACH,cAAE,SAAS,CACd,CACF;AAEe,QAAA,IAAA,CAAA,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,cAAc;IAEc;AAEnE,IAAA,OAAO,CAAC,KAAc,EAAA;AAC3B,QAAA,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC;IACxB;AAEO,IAAA,uBAAuB,CAAC,aAAsC,EAAA;AACnE,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,aAAa,CAAC;IACxC;+GAjCW,mBAAmB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAL,4BAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAnB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,mBAAmB,6IC3BhC,wkCA2BA,EAAA,MAAA,EAAA,CAAA,goBAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAH,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAI,EAAA,CAAA,qCAAA,EAAA,QAAA,EAAA,wCAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,qBAAA,EAAA,aAAA,EAAA,OAAA,EAAA,WAAA,EAAA,8BAAA,EAAA,uBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,OAAA,EAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,cAAA,EAAA,QAAA,EAAA,wBAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAL,EAAA,CAAA,SAAA,EAAA,IAAA,EAAA,OAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FDAa,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAN/B,SAAS;AACI,YAAA,IAAA,EAAA,CAAA,EAAA,UAAA,EAAA,KAAK,YACP,qBAAqB,EAAA,QAAA,EAAA,wkCAAA,EAAA,MAAA,EAAA,CAAA,goBAAA,CAAA,EAAA;8FAKrB,KAAK,EAAA,CAAA;sBAAd;gBACS,aAAa,EAAA,CAAA;sBAAtB;;;AE7BH;;;;;;;;;;;;;;AAcG;MAoBU,wBAAwB,CAAA;AAYnC,IAAA,WAAA,CACmB,YAA0C,EAC1C,uBAAgD,EAChD,MAAiB,EAAA;QAFjB,IAAA,CAAA,YAAY,GAAZ,YAAY;QACZ,IAAA,CAAA,uBAAuB,GAAvB,uBAAuB;QACvB,IAAA,CAAA,MAAM,GAAN,MAAM;QAdA,IAAA,CAAA,IAAI,GAAG,KAAK;QACZ,IAAA,CAAA,oBAAoB,GAAG,KAAK;AAE3C,QAAA,IAAA,CAAA,UAAU,GAA0B,IAAI,YAAY,EAAE;AAEhD,QAAA,IAAA,CAAA,cAAc,GAAG,IAAI,CAAC,YAAY,CAAC,cAAc;AACjD,QAAA,IAAA,CAAA,4BAA4B,GAC1C,IAAI,CAAC,YAAY,CAAC,4BAA4B;AAChC,QAAA,IAAA,CAAA,mBAAmB,GAAG,IAAI,eAAe,CAAU,KAAK,CAAC;QACzD,IAAA,CAAA,OAAO,GAAG,0BAA0B;IAMjD;IAEI,IAAI,GAAA;AACT,QAAA,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE;IAC9B;IAEO,MAAM,GAAA;AACX,QAAA,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE;AAC1B,QAAA,IAAI,CAAC,YAAY,CAAC,YAAY,EAAE;QAEhC,IAAI,CAAC,YAAY,CAAC;AACf,aAAA,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;aACZ,SAAS,CAAC,2BAA2B,IAAG;AACvC,YAAA,IAAI,CAAC;AACF,iBAAA,yBAAyB,CAAC,2BAA2B,CAAC,EAAE;iBACxD,SAAS,CACR,MAAK;AACH,gBAAA,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE;gBAC3B,IAAI,CAAC,IAAI,EAAE;YACb,CAAC,EACD,MAAK;AACH,gBAAA,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,8DAA8D,CAAC;AACjF,gBAAA,IAAI,CAAC,YAAY,CAAC,WAAW,EAAE;AACjC,YAAA,CAAC,CACF;AACL,QAAA,CAAC,CAAC;IACN;IAEO,IAAI,GAAA;AACT,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE;AACtB,QAAA,IAAI,CAAC,YAAY,CAAC,WAAW,EAAE;IACjC;AAEO,IAAA,aAAa,CAAC,KAAc,EAAA;AACjC,QAAA,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,KAAK,CAAC;IACtC;AAEO,IAAA,qBAAqB,CAAC,aAAsC,EAAA;AACjE,QAAA,IAAI,CAAC,YAAY,CAAC,YAAY,EAAE;AAEhC,QAAA,IAAI,IAAI,CAAC,oBAAoB,EAAE;AAC7B,YAAA,IAAI,CAAC,0BAA0B,CAAC,aAAa,CAAC;YAC9C;QACF;QAEA,IAAI,CAAC,YAAY,CAAC;AACf,aAAA,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;aACZ,SAAS,CAAC,2BAA2B,IAAG;AACvC,YAAA,MAAM,eAAe,GAAG,aAAa,CAAC,eAAe;AACrD,YAAA,MAAM,kBAAkB,GAAG,aAAa,CAAC,kBAAkB;AAC3D,YAAA,MAAM,iBAAiB,GAAG,EAAC,GAAG,aAAa,EAAC;AAC5C,YAAA,OAAO,iBAAiB,CAAC,oBAAoB,CAAC;AAE9C,YAAA,IAAI,CAAC;iBACF,yBAAyB,CACxB,2BAA2B,CAAC,EAAE,EAC9B,eAAe,EACf,kBAAkB,EAClB,iBAAiB;AAElB,iBAAA,SAAS,CAAC;gBACT,IAAI,EAAE,MAAK;AACT,oBAAA,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE;oBAC3B,IAAI,CAAC,IAAI,EAAE;gBACb,CAAC;gBACD,KAAK,EAAE,MAAK;AACV,oBAAA,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,8DAA8D,CAAC;AACjF,oBAAA,IAAI,CAAC,YAAY,CAAC,WAAW,EAAE;gBACjC,CAAC;AACF,aAAA,CAAC;AACN,QAAA,CAAC,CAAC;IACN;AAEQ,IAAA,0BAA0B,CAAC,aAAsC,EAAA;QACvE,IAAI,CAAC,YAAY,CAAC;AACf,aAAA,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;aACZ,SAAS,CAAC,2BAA2B,IAAG;YACvC,MAAM,uBAAuB,GAAG,EAAC,GAAG,2BAA2B,EAAE,UAAU,EAAE,aAAa,EAAC;YAE3F,uBAAuB,CAAC,KAAK,GAAG,uBAAuB,CAAC,UAAU,CAAC,kBAAkB;AAErF,YAAA,OAAO,uBAAuB,CAAC,UAAU,CAAC,kBAAkB;AAC5D,YAAA,OAAO,uBAAuB,CAAC,UAAU,CAAC,eAAe;YAEzD,IAAI,CAAC,uBAAuB,CAAC,uBAAuB,CAAC,uBAAuB,CAAC,CAAC,SAAS,CAAC;gBACtF,IAAI,EAAE,MAAK;AACT,oBAAA,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE;oBAC3B,IAAI,CAAC,IAAI,EAAE;gBACb,CAAC;gBACD,KAAK,EAAE,MAAK;AACV,oBAAA,IAAI,CAAC,MAAM,CAAC,KAAK,CACf,uEAAuE,CACxE;AACD,oBAAA,IAAI,CAAC,YAAY,CAAC,WAAW,EAAE;gBACjC,CAAC;AACF,aAAA,CAAC;AACJ,QAAA,CAAC,CAAC;IACN;+GAjHW,wBAAwB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAG,4BAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,uBAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,IAAA,CAAA,SAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAxB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,wBAAwB,qMClCrC,m1DAuDA,EAAA,MAAA,EAAA,CAAA,goBAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,QAAA,EAAA,0BAAA,EAAA,MAAA,EAAA,CAAA,WAAA,EAAA,WAAA,EAAA,MAAA,EAAA,UAAA,EAAA,UAAA,EAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,QAAA,EAAA,sBAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,OAAA,EAAA,WAAA,EAAA,MAAA,EAAA,SAAA,EAAA,qBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,iBAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,WAAA,EAAA,QAAA,EAAA,oCAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,YAAA,EAAA,iBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,WAAA,EAAA,QAAA,EAAA,oCAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,YAAA,EAAA,QAAA,EAAA,sCAAA,EAAA,MAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAH,EAAA,CAAA,wBAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAO,mBAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,OAAA,EAAA,CAAA,OAAA,EAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAJ,EAAA,CAAA,SAAA,EAAA,IAAA,EAAA,OAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAG,IAAA,CAAA,aAAA,EAAA,IAAA,EAAA,WAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,EAAA,CAAA,mBAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FDrBa,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBANpC,SAAS;AACI,YAAA,IAAA,EAAA,CAAA,EAAA,UAAA,EAAA,KAAK,YACP,2BAA2B,EAAA,QAAA,EAAA,m1DAAA,EAAA,MAAA,EAAA,CAAA,goBAAA,CAAA,EAAA;8JAKZ,IAAI,EAAA,CAAA;sBAA5B;gBACwB,oBAAoB,EAAA,CAAA;sBAA5C;gBAES,UAAU,EAAA,CAAA;sBAAnB;;;AEtCH;;;;;;;;;;;;;;AAcG;MAsBU,yBAAyB,CAAA;IA+DpC,WAAA,CACmB,MAAiB,EACjB,uBAAgD,EAChD,wBAAkD,EAClD,YAA0C,EAC1C,gBAAkC,EAAA;QAJlC,IAAA,CAAA,MAAM,GAAN,MAAM;QACN,IAAA,CAAA,uBAAuB,GAAvB,uBAAuB;QACvB,IAAA,CAAA,wBAAwB,GAAxB,wBAAwB;QACxB,IAAA,CAAA,YAAY,GAAZ,YAAY;QACZ,IAAA,CAAA,gBAAgB,GAAhB,gBAAgB;AAnEnB,QAAA,IAAA,CAAA,MAAM,GAAmB;AACvC,YAAA;AACE,gBAAA,GAAG,EAAE,OAAO;AACZ,gBAAA,KAAK,EAAE,2CAA2C;gBAClD,QAAQ,EAAE,QAAQ,CAAC,IAAI;AACxB,aAAA;AACD,YAAA;AACE,gBAAA,GAAG,EAAE,YAAY;AACjB,gBAAA,KAAK,EAAE,oCAAoC;gBAC3C,QAAQ,EAAE,QAAQ,CAAC,IAAI;AACxB,aAAA;AACD,YAAA;AACE,gBAAA,GAAG,EAAE,eAAe;AACpB,gBAAA,KAAK,EAAE,oCAAoC;gBAC3C,QAAQ,EAAE,QAAQ,CAAC,IAAI;AACxB,aAAA;SACF;AACe,QAAA,IAAA,CAAA,WAAW,GAAiB;AAC1C,YAAA;gBACE,QAAQ,EAAE,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC;AAC3C,gBAAA,KAAK,EAAE,gBAAgB;AACxB,aAAA;AACD,YAAA;AACE,gBAAA,KAAK,EAAE,qBAAqB;gBAC5B,QAAQ,EAAE,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,IAAI,CAAC;AACjD,aAAA;AACD,YAAA;gBACE,QAAQ,EAAE,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC;AAC7C,gBAAA,KAAK,EAAE,kBAAkB;AACzB,gBAAA,IAAI,EAAE,QAAQ;AACf,aAAA;SACF;AAEe,QAAA,IAAA,CAAA,QAAQ,GAAG,IAAI,eAAe,CAAU,IAAI,CAAC;AAC7C,QAAA,IAAA,CAAA,cAAc,GAAG,IAAI,eAAe,CAAU,KAAK,CAAC;AACpD,QAAA,IAAA,CAAA,aAAa,GAAG,IAAI,eAAe,CAAU,KAAK,CAAC;AACnD,QAAA,IAAA,CAAA,qBAAqB,GACnC,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,IAAI,CAC7B,SAAS,CAAC,MACR,aAAa,CAAC;AACZ,YAAA,IAAI,CAAC,uBAAuB,CAAC,0BAA0B,EAAE;AACzD,YAAA,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,KAAK,CAAC;SACpC,CAAC,CAAC,IAAI,CACL,GAAG,CAAC,CAAC,CAAC,oBAAoB,CAAC,KACzB,oBAAoB,CAAC,GAAG,CAAC,aAAa,KAAK;AACzC,YAAA,GAAG,aAAa;AAChB,YAAA,UAAU,EAAE,IAAI,CAAC,wBAAwB,CAAC,OAAO,CAC/C,OAAO,EACP,aAAa,CAAC,gBAAgB,EAAE,GAAG,IAAI,EAAE,CAC1C;AACD,YAAA,aAAa,EAAE,aAAa,CAAC,gBAAgB,EAAE,GAAG,IAAI,EAAE;AACzD,SAAA,CAAC,CAAC,CACJ,EACD,GAAG,CAAC,MAAK;AACP,YAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC;AAC3B,QAAA,CAAC,CAAC,CACH,CACF,CACF;AAEa,QAAA,IAAA,CAAA,qBAAqB,GAAG,IAAI,eAAe,CAAU,KAAK,CAAC;IAQxE;IAEI,YAAY,GAAA;AACjB,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC;IAC/B;AAEO,IAAA,iBAAiB,CAAC,aAAkC,EAAA;AACzD,QAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC;AAC9B,QAAA,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,KAAK,CAAC;AACtC,QAAA,IAAI,CAAC,YAAY,CAAC,yBAAyB,CAAC,aAAa,CAAC;IAC5D;AAEO,IAAA,mBAAmB,CAAC,aAAkC,EAAA;AAC3D,QAAA,IAAI,CAAC,aAAa,CAAC,EAAE,EAAE;YACrB;QACF;AAEA,QAAA,IAAI,CAAC;AACF,aAAA,yBAAyB,CAAC,aAAa,CAAC,EAAE;AAC1C,aAAA,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AACZ,aAAA,SAAS,CAAC;YACT,IAAI,EAAE,MAAK;AACT,gBAAA,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE;YAC7B,CAAC;YACD,KAAK,EAAE,MAAK;AACV,gBAAA,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,8DAA8D,CAAC;YACnF,CAAC;AACF,SAAA,CAAC;IACN;IAEO,cAAc,GAAA;AACnB,QAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC;IACjC;IAEO,aAAa,GAAA;AAClB,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC;IAChC;AAEO,IAAA,sBAAsB,CAAC,aAAkC,EAAA;AAC9D,QAAA,MAAM,kBAAkB,GAAG,SAAS,CAAC,aAAa,CAAC;AACnD,QAAA,kBAAkB,CAAC,EAAE,GAAGE,EAAM,EAAE;AAChC,QAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC;AAC9B,QAAA,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC;AACrC,QAAA,IAAI,CAAC,YAAY,CAAC,yBAAyB,CAAC,kBAAkB,CAAC;IACjE;+GAjHW,yBAAyB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAX,IAAA,CAAA,SAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,uBAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,wBAAA,EAAA,EAAA,EAAA,KAAA,EAAAY,4BAAA,EAAA,EAAA,EAAA,KAAA,EAAAN,IAAA,CAAA,gBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAzB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,yBAAyB,sFCpCtC,g5DAwDA,EAAA,MAAA,EAAA,CAAA,goBAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAO,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAV,EAAA,CAAA,MAAA,EAAA,QAAA,EAAA,0BAAA,EAAA,MAAA,EAAA,CAAA,WAAA,EAAA,WAAA,EAAA,MAAA,EAAA,UAAA,EAAA,UAAA,EAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAW,EAAA,CAAA,mBAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,SAAA,EAAA,kBAAA,EAAA,SAAA,EAAA,aAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,kBAAA,EAAA,WAAA,EAAA,cAAA,EAAA,oBAAA,EAAA,kBAAA,EAAA,qBAAA,EAAA,cAAA,EAAA,uBAAA,EAAA,oBAAA,EAAA,sBAAA,EAAA,qBAAA,EAAA,SAAA,EAAA,aAAA,EAAA,6BAAA,EAAA,mBAAA,EAAA,aAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,gBAAA,EAAA,YAAA,CAAA,EAAA,OAAA,EAAA,CAAA,YAAA,EAAA,mBAAA,EAAA,eAAA,EAAA,QAAA,EAAA,aAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,wBAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,aAAA,EAAA,cAAA,EAAA,OAAA,EAAA,cAAA,EAAA,oBAAA,EAAA,wBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAX,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,sBAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,SAAA,EAAA,MAAA,EAAA,OAAA,EAAA,WAAA,EAAA,gBAAA,EAAA,YAAA,EAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAY,uBAAA,EAAA,QAAA,EAAA,0BAAA,EAAA,MAAA,EAAA,CAAA,MAAA,CAAA,EAAA,OAAA,EAAA,CAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,wBAAA,EAAA,QAAA,EAAA,2BAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,sBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAH,EAAA,CAAA,SAAA,EAAA,IAAA,EAAA,OAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAP,IAAA,CAAA,aAAA,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FDpBa,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBANrC,SAAS;AACI,YAAA,IAAA,EAAA,CAAA,EAAA,UAAA,EAAA,KAAK,YACP,2BAA2B,EAAA,QAAA,EAAA,g5DAAA,EAAA,MAAA,EAAA,CAAA,goBAAA,CAAA,EAAA;;;AEhCvC;;;;;;;;;;;;;;AAcG;AASH,MAAM,MAAM,GAAW;AACrB,IAAA;AACE,QAAA,IAAI,EAAE,SAAS;AACf,QAAA,SAAS,EAAE,yBAAyB;QACpC,WAAW,EAAE,CAAC,gBAAgB,CAAC;QAC/B,IAAI,EAAE,EAAC,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,UAAU,CAAC,EAAC;AAC9C,KAAA;CACF;MAOY,6BAA6B,CAAA;+GAA7B,6BAA6B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA,CAAA;gHAA7B,6BAA6B,EAAA,OAAA,EAAA,CAH9B,YAAY,EAAA,EAAA,CAAA,YAAA,CAAA,EAAA,OAAA,EAAA,CACZ,YAAY,CAAA,EAAA,CAAA,CAAA;gHAEX,6BAA6B,EAAA,OAAA,EAAA,CAH9B,YAAY,EAAE,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC,EAC3C,YAAY,CAAA,EAAA,CAAA,CAAA;;4FAEX,6BAA6B,EAAA,UAAA,EAAA,CAAA;kBALzC,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;AACR,oBAAA,YAAY,EAAE,EAAE;oBAChB,OAAO,EAAE,CAAC,YAAY,EAAE,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;oBACtD,OAAO,EAAE,CAAC,YAAY,CAAC;AACxB,iBAAA;;;ACpCD;;;;;;;;;;;;;;AAcG;MAqEU,sBAAsB,CAAA;+GAAtB,sBAAsB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA,CAAA;AAAtB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,sBAAsB,iBAnC/B,yBAAyB;YACzB,uBAAuB;YACvB,wBAAwB;YACxB,wBAAwB;YACxB,wBAAwB;AACxB,YAAA,mBAAmB,aAGnB,YAAY;YACZ,6BAA6B;YAC7B,eAAe;YACf,eAAe;YACf,WAAW;YACX,aAAa;YACb,YAAY;YACZ,yBAAyB;YACzB,kCAAkC;YAClCW,YAAkB;YAClB,gBAAgB;YAChBC,WAAiB;YACjB,UAAU;YACV,wBAAwB;YACxB,WAAW;YACX,WAAW;AACX,YAAA,aAAa,aAGb,yBAAyB;YACzB,uBAAuB;YACvB,wBAAwB;YACxB,wBAAwB;YACxB,wBAAwB;YACxB,mBAAmB,CAAA,EAAA,CAAA,CAAA;AAGV,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,sBAAsB,EAAA,SAAA,EArCtB,CAAC,4BAA4B,CAAC,YAUvC,YAAY;YACZ,6BAA6B;YAC7B,eAAe;YACf,eAAe;YACf,WAAW;YACX,aAAa;YACb,YAAY;YACZ,yBAAyB;YACzB,kCAAkC;YAClCD,YAAkB;YAClB,gBAAgB;YAChBC,WAAiB;YACjB,UAAU;YAEV,WAAW;YACX,WAAW;YACX,aAAa,CAAA,EAAA,CAAA,CAAA;;4FAWJ,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBAtClC,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;oBACR,SAAS,EAAE,CAAC,4BAA4B,CAAC;AACzC,oBAAA,YAAY,EAAE;wBACZ,yBAAyB;wBACzB,uBAAuB;wBACvB,wBAAwB;wBACxB,wBAAwB;wBACxB,wBAAwB;wBACxB,mBAAmB;AACpB,qBAAA;AACD,oBAAA,OAAO,EAAE;wBACP,YAAY;wBACZ,6BAA6B;wBAC7B,eAAe;wBACf,eAAe;wBACf,WAAW;wBACX,aAAa;wBACb,YAAY;wBACZ,yBAAyB;wBACzB,kCAAkC;wBAClCD,YAAkB;wBAClB,gBAAgB;wBAChBC,WAAiB;wBACjB,UAAU;wBACV,wBAAwB;wBACxB,WAAW;wBACX,WAAW;wBACX,aAAa;AACd,qBAAA;AACD,oBAAA,OAAO,EAAE;wBACP,yBAAyB;wBACzB,uBAAuB;wBACvB,wBAAwB;wBACxB,wBAAwB;wBACxB,wBAAwB;wBACxB,mBAAmB;AACpB,qBAAA;AACF,iBAAA;;;AClFD;;;;;;;;;;;;;;AAcG;AAEH;;AAEG;;AClBH;;AAEG;;;;"}
1
+ {"version":3,"file":"valtimo-plugin-management.mjs","sources":["../../../../projects/valtimo/plugin-management/src/lib/constants/plugin-app-add-modal.test-ids.ts","../../../../projects/valtimo/plugin-management/src/lib/constants/plugin-external-review-modal.test-ids.ts","../../../../projects/valtimo/plugin-management/src/lib/constants/index.ts","../../../../projects/valtimo/plugin-management/src/lib/models/external-plugin-permissions.model.ts","../../../../projects/valtimo/plugin-management/src/lib/models/plugin-modal.model.ts","../../../../projects/valtimo/plugin-management/src/lib/models/unified-plugin-definition.model.ts","../../../../projects/valtimo/plugin-management/src/lib/models/index.ts","../../../../projects/valtimo/plugin-management/src/lib/services/plugin-management-state.service.ts","../../../../projects/valtimo/plugin-management/src/lib/services/index.ts","../../../../projects/valtimo/plugin-management/src/lib/utils/csp-allows-origin.util.ts","../../../../projects/valtimo/plugin-management/src/lib/utils/external-plugin-compatibility.util.ts","../../../../projects/valtimo/plugin-management/src/lib/utils/external-plugin-egress.util.ts","../../../../projects/valtimo/plugin-management/src/lib/utils/index.ts","../../../../projects/valtimo/plugin-management/src/lib/components/plugin-external-permissions/plugin-external-permissions.component.ts","../../../../projects/valtimo/plugin-management/src/lib/components/plugin-external-permissions/plugin-external-permissions.component.html","../../../../projects/valtimo/plugin-management/src/lib/components/plugin-external-edit-modal/plugin-external-edit-modal.component.ts","../../../../projects/valtimo/plugin-management/src/lib/components/plugin-external-edit-modal/plugin-external-edit-modal.component.html","../../../../projects/valtimo/plugin-management/src/lib/components/plugin-upload-modal/plugin-upload-modal.component.ts","../../../../projects/valtimo/plugin-management/src/lib/components/plugin-upload-modal/plugin-upload-modal.component.html","../../../../projects/valtimo/plugin-management/src/lib/components/plugin-usage-modal/plugin-usage-modal.component.ts","../../../../projects/valtimo/plugin-management/src/lib/components/plugin-usage-modal/plugin-usage-modal.component.html","../../../../projects/valtimo/plugin-management/src/lib/components/plugin-log-modal/plugin-log-modal.component.ts","../../../../projects/valtimo/plugin-management/src/lib/components/plugin-log-modal/plugin-log-modal.component.html","../../../../projects/valtimo/plugin-management/src/lib/components/plugin-external-configure/plugin-external-configure.component.ts","../../../../projects/valtimo/plugin-management/src/lib/components/plugin-external-configure/plugin-external-configure.component.html","../../../../projects/valtimo/plugin-management/src/lib/components/plugin-add-select/plugin-add-select.component.ts","../../../../projects/valtimo/plugin-management/src/lib/components/plugin-add-select/plugin-add-select.component.html","../../../../projects/valtimo/plugin-management/src/lib/components/plugin-configure/plugin-configure.component.ts","../../../../projects/valtimo/plugin-management/src/lib/components/plugin-configure/plugin-configure.component.html","../../../../projects/valtimo/plugin-management/src/lib/components/plugin-add-modal/plugin-add-modal.component.ts","../../../../projects/valtimo/plugin-management/src/lib/components/plugin-add-modal/plugin-add-modal.component.html","../../../../projects/valtimo/plugin-management/src/lib/components/plugin-edit/plugin-edit.component.ts","../../../../projects/valtimo/plugin-management/src/lib/components/plugin-edit/plugin-edit.component.html","../../../../projects/valtimo/plugin-management/src/lib/components/plugin-edit-modal/plugin-edit-modal.component.ts","../../../../projects/valtimo/plugin-management/src/lib/components/plugin-edit-modal/plugin-edit-modal.component.html","../../../../projects/valtimo/plugin-management/src/lib/components/plugin-management/plugin-management.component.ts","../../../../projects/valtimo/plugin-management/src/lib/components/plugin-management/plugin-management.component.html","../../../../projects/valtimo/plugin-management/src/lib/components/plugin-host-connection-form/plugin-host-connection-form.component.ts","../../../../projects/valtimo/plugin-management/src/lib/components/plugin-host-connection-form/plugin-host-connection-form.component.html","../../../../projects/valtimo/plugin-management/src/lib/components/plugin-host-modal/plugin-host-modal.component.ts","../../../../projects/valtimo/plugin-management/src/lib/components/plugin-host-modal/plugin-host-modal.component.html","../../../../projects/valtimo/plugin-management/src/lib/components/plugin-host-edit-modal/plugin-host-edit-modal.component.ts","../../../../projects/valtimo/plugin-management/src/lib/components/plugin-host-edit-modal/plugin-host-edit-modal.component.html","../../../../projects/valtimo/plugin-management/src/lib/components/plugin-host-event-queue-modal/plugin-host-event-queue-modal.component.ts","../../../../projects/valtimo/plugin-management/src/lib/components/plugin-host-event-queue-modal/plugin-host-event-queue-modal.component.html","../../../../projects/valtimo/plugin-management/src/lib/components/plugin-host-frontend-origins-modal/plugin-host-frontend-origins-modal.component.ts","../../../../projects/valtimo/plugin-management/src/lib/components/plugin-host-frontend-origins-modal/plugin-host-frontend-origins-modal.component.html","../../../../projects/valtimo/plugin-management/src/lib/components/plugin-hosts-page/plugin-hosts-page.component.ts","../../../../projects/valtimo/plugin-management/src/lib/components/plugin-hosts-page/plugin-hosts-page.component.html","../../../../projects/valtimo/plugin-management/src/lib/components/plugin-app-add-modal/plugin-app-add-modal.component.ts","../../../../projects/valtimo/plugin-management/src/lib/components/plugin-app-add-modal/plugin-app-add-modal.component.html","../../../../projects/valtimo/plugin-management/src/lib/components/plugin-external-review-modal/plugin-external-review-modal.component.ts","../../../../projects/valtimo/plugin-management/src/lib/components/plugin-external-review-modal/plugin-external-review-modal.component.html","../../../../projects/valtimo/plugin-management/src/lib/components/plugin-apps-page/plugin-apps-page.component.ts","../../../../projects/valtimo/plugin-management/src/lib/components/plugin-apps-page/plugin-apps-page.component.html","../../../../projects/valtimo/plugin-management/src/lib/plugin-management-routing.ts","../../../../projects/valtimo/plugin-management/src/lib/plugin-management.module.ts","../../../../projects/valtimo/plugin-management/src/public-api.ts","../../../../projects/valtimo/plugin-management/src/valtimo-plugin-management.ts"],"sourcesContent":["/*\n * Copyright 2015-2026 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (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 * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\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 const PLUGIN_APP_ADD_MODAL_TEST_IDS = {\n cancelButton: 'pluginAppAddModalCancelButton',\n connectButton: 'pluginAppAddModalConnectButton',\n continueButton: 'pluginAppAddModalContinueButton',\n retryButton: 'pluginAppAddModalRetryButton',\n nextButton: 'pluginAppAddModalNextButton',\n completeButton: 'pluginAppAddModalCompleteButton',\n} as const;\n","/*\n * Copyright 2015-2026 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (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 * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\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 const PLUGIN_EXTERNAL_REVIEW_MODAL_TEST_IDS = {\n cancelButton: 'pluginExternalReviewModalCancelButton',\n acceptButton: 'pluginExternalReviewModalAcceptButton',\n} as const;\n","/*\n * Copyright 2015-2026 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (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 * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\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 * from './plugin-app-add-modal.test-ids';\nexport * from './plugin-external-review-modal.test-ids';\n","/*\n * Copyright 2015-2026 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (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 * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\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 {ExternalPluginEndpoint} from '@valtimo/plugin';\n\n/** A manifest endpoint enriched with its localized description for display in the permission list. */\ninterface EnrichedEndpoint extends ExternalPluginEndpoint {\n description: string | null;\n}\n\nexport {EnrichedEndpoint};\n","/*\n * Copyright 2015-2025 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (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 * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\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\ntype PluginModal = 'add' | 'edit';\n\nexport {PluginModal};\n","/*\n * Copyright 2015-2026 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (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 * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\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 {PluginDefinitionWithLogo} from '@valtimo/plugin';\n\ntype PluginConfigurationSource = 'embedded' | 'external';\n\ninterface UnifiedPluginDefinition extends PluginDefinitionWithLogo {\n source: PluginConfigurationSource;\n externalDefinitionId?: string;\n externalName?: string | null;\n externalDescription?: string | null;\n externalLogoUrl?: string | null;\n}\n\ninterface UnifiedPluginConfigurationRow {\n id?: string;\n title: string;\n pluginName: string;\n definitionKey: string;\n source: PluginConfigurationSource;\n sourceLabel?: string;\n properties?: object;\n pluginDefinition?: {key: string};\n externalDefinitionId?: string;\n /**\n * Set on external rows whose plugin definition is incompatible with the running GZAC version.\n * Drives the \"Incompatible\" tag and its tooltip ([compatibilityMessage]) in the table.\n */\n incompatible?: boolean;\n compatibilityMessage?: string;\n /**\n * Drives the \"Awaiting host\" tag: the configuration is real and everything referencing it\n * resolves, but its plugin cannot run until its host serves it.\n */\n awaitingHost?: boolean;\n /**\n * Drives the \"Review required\" tag: the plugin's package changed after acceptance, so nothing is\n * pushed and no service token is issued until an admin accepts it.\n */\n reviewRequired?: boolean;\n reviewMessage?: string;\n hostName?: string;\n}\n\nexport {PluginConfigurationSource, UnifiedPluginDefinition, UnifiedPluginConfigurationRow};\n","/*\n * Copyright 2015-2025 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (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 * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\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 * from './external-plugin-permissions.model';\nexport * from './plugin-modal.model';\nexport * from './unified-plugin-definition.model';\n","/*\n * Copyright 2015-2025 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (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 * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\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 {Injectable} from '@angular/core';\nimport {BehaviorSubject, combineLatest, Observable, Subject} from 'rxjs';\nimport {map, take} from 'rxjs/operators';\nimport {PluginModal} from '../models';\nimport {\n PluginService,\n PluginSpecification,\n PluginConfiguration,\n PluginDefinition,\n PluginDefinitionWithLogo,\n} from '@valtimo/plugin';\nimport {DomSanitizer} from '@angular/platform-browser';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class PluginManagementStateService {\n private readonly _showModal$ = new Subject<PluginModal>();\n private readonly _hideModal$ = new Subject();\n private readonly _inputDisabled$ = new BehaviorSubject<boolean>(false);\n private readonly _refresh$ = new BehaviorSubject<null>(null);\n private readonly _save$ = new Subject<null>();\n private readonly _saveEdit$ = new Subject<null>();\n private readonly _delete$ = new Subject<null>();\n private readonly _hideModalSaveButton$ = new BehaviorSubject<boolean>(false);\n private readonly _pluginDefinitions$ = new BehaviorSubject<Array<PluginDefinition> | undefined>(\n undefined\n );\n private readonly _pluginDefinitionsWithLogos$: Observable<\n Array<PluginDefinitionWithLogo> | undefined\n > = combineLatest([\n this._pluginDefinitions$,\n this.pluginService.pluginSpecifications$,\n this.pluginService.availablePluginIds$,\n ]).pipe(\n map(([pluginDefinitions, pluginSpecifications, availablePluginIds]) =>\n pluginDefinitions\n ?.filter(pluginDefinition => availablePluginIds.includes(pluginDefinition.key))\n .map(pluginDefinition => {\n const pluginSpecification = pluginSpecifications.find(\n specification => specification.pluginId === pluginDefinition.key\n );\n\n return {\n ...pluginDefinition,\n ...(pluginSpecification?.pluginLogoBase64 && {\n pluginLogoBase64: this.sanitizer.bypassSecurityTrustResourceUrl(\n pluginSpecification?.pluginLogoBase64\n ),\n }),\n };\n })\n )\n );\n private readonly _selectedPluginDefinition$ = new BehaviorSubject<PluginDefinition | undefined>(\n undefined\n );\n\n private readonly _selectedPluginConfiguration$ = new BehaviorSubject<\n PluginConfiguration | undefined\n >(undefined);\n\n constructor(\n private readonly pluginService: PluginService,\n private readonly sanitizer: DomSanitizer\n ) {}\n\n get showModal$(): Observable<PluginModal> {\n return this._showModal$.asObservable();\n }\n\n get hideModal$(): Observable<any> {\n return this._hideModal$.asObservable();\n }\n\n get inputDisabled$(): Observable<boolean> {\n return this._inputDisabled$.asObservable();\n }\n\n get refresh$(): Observable<any> {\n return this._refresh$.asObservable();\n }\n\n get pluginDefinitions$(): Observable<Array<PluginDefinition> | undefined> {\n return this._pluginDefinitions$.asObservable();\n }\n\n get pluginDefinitionsWithLogos$(): Observable<Array<PluginDefinitionWithLogo> | undefined> {\n return this._pluginDefinitionsWithLogos$;\n }\n\n get selectedPluginDefinition$(): Observable<PluginDefinition | undefined> {\n return this._selectedPluginDefinition$.asObservable();\n }\n\n get selectedPluginConfiguration$(): Observable<PluginConfiguration | undefined> {\n return this._selectedPluginConfiguration$.asObservable();\n }\n\n get save$(): Observable<any> {\n return this._save$.asObservable();\n }\n\n get saveEdit$(): Observable<any> {\n return this._saveEdit$.asObservable();\n }\n\n get delete$(): Observable<any> {\n return this._delete$.asObservable();\n }\n\n get hideModalSaveButton$(): Observable<boolean> {\n return this._hideModalSaveButton$.asObservable();\n }\n\n showModal(modalType: PluginModal): void {\n this._showModal$.next(modalType);\n }\n\n hideModal(): void {\n this._hideModal$.next(null);\n }\n\n disableInput(): void {\n this._inputDisabled$.next(true);\n }\n\n enableInput(): void {\n this._inputDisabled$.next(false);\n }\n\n refresh(): void {\n this._refresh$.next(null);\n }\n\n setPluginDefinitions(definitions: Array<PluginDefinition>): void {\n this._pluginDefinitions$.next(definitions);\n }\n\n selectPluginDefinition(definition: PluginDefinition): void {\n this._selectedPluginDefinition$.next(definition);\n }\n\n selectPluginConfiguration(configuration: PluginConfiguration): void {\n this._selectedPluginConfiguration$.next(configuration);\n }\n\n clearSelectedPluginDefinition(): void {\n this._selectedPluginDefinition$.next(undefined);\n }\n\n clearSelectedPluginConfiguration(): void {\n this._selectedPluginConfiguration$.next(undefined);\n }\n\n save(): void {\n this._save$.next(null);\n }\n\n saveEdit(): void {\n this._saveEdit$.next(null);\n }\n\n delete(): void {\n this._delete$.next(null);\n }\n\n hideModalSaveButton(): void {\n this._hideModalSaveButton$.next(true);\n }\n\n showModalSaveButton(): void {\n this._hideModalSaveButton$.next(false);\n }\n\n clear(): void {\n this.clearSelectedPluginDefinition();\n this.clearSelectedPluginConfiguration();\n }\n}\n","/*\n * Copyright 2015-2025 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (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 * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\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 * from './plugin-management-state.service';\n","/*\n * Copyright 2015-2026 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (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 * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\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 {CSP_META_ID} from '@valtimo/security';\n\n/**\n * Whether the CSP meta tag the app bootstrapped with allows framing content from the given URL's\n * origin. The meta tag is immutable once parsed, so a host registered *after* bootstrap is not\n * covered until the page is reloaded — that is exactly what this check detects.\n *\n * Returns `true` when no CSP meta tag is present (no CSP configured → nothing blocks the iframe)\n * or when the URL cannot be parsed (nothing sensible to check; the iframe component itself refuses\n * unsafe URLs). The matcher intentionally covers only the source forms this app's CSP is built\n * from (exact origins, `*`, scheme-only and `*.domain` sources) — anything unrecognised counts as\n * \"not allowed\", which errs on the side of a harmless extra page refresh.\n */\nfunction cspAllowsFrameOrigin(url: string, doc: Document = document): boolean {\n const cspMeta = doc.getElementById(CSP_META_ID) as HTMLMetaElement | null;\n if (!cspMeta?.content) return true;\n\n let origin: URL;\n try {\n origin = new URL(new URL(url).origin);\n } catch {\n return true;\n }\n\n const directives = new Map<string, string[]>();\n cspMeta.content.split(';').forEach(part => {\n const tokens = part.trim().split(/\\s+/).filter(Boolean);\n if (tokens.length > 0) directives.set(tokens[0].toLowerCase(), tokens.slice(1));\n });\n\n // frame-src falls back to child-src, then default-src (the CSP fallback chain).\n const sources =\n directives.get('frame-src') ?? directives.get('child-src') ?? directives.get('default-src');\n // A CSP without any of these directives does not restrict framing.\n if (!sources) return true;\n\n return sources.some(source => matchesSource(source, origin, doc));\n}\n\nfunction matchesSource(source: string, origin: URL, doc: Document): boolean {\n const normalized = source.trim().toLowerCase();\n\n if (normalized === '*') return true;\n if (normalized === \"'self'\") return origin.origin === new URL(doc.location.origin).origin;\n // Scheme-only sources (\"https:\") allow every origin with that scheme.\n if (/^[a-z][a-z0-9+.-]*:$/.test(normalized)) return origin.protocol === normalized;\n\n // Host sources, with optional scheme and wildcard subdomain: [scheme://]host[:port]\n const match = normalized.match(/^(?:([a-z][a-z0-9+.-]*):\\/\\/)?([^/]+)$/);\n if (!match) return false;\n\n const [, scheme, hostAndPort] = match;\n if (scheme && `${scheme}:` !== origin.protocol) return false;\n\n const originHostAndPort = origin.host.toLowerCase();\n if (hostAndPort.startsWith('*.')) {\n return originHostAndPort.endsWith(hostAndPort.slice(1));\n }\n // Without an explicit port, a host source matches the scheme's default port as well.\n return originHostAndPort === hostAndPort || origin.hostname.toLowerCase() === hostAndPort;\n}\n\nexport {cspAllowsFrameOrigin};\n","/*\n * Copyright 2015-2026 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (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 * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\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 {TranslateService} from '@ngx-translate/core';\nimport {ExternalPluginCompatibilityInfo} from '@valtimo/plugin';\n\n/**\n * Builds the localized, non-blocking compatibility warning shown wherever an incompatible external\n * plugin surfaces (add-configuration modal, configuration table tooltip, upload confirmation).\n *\n * Keeps it simple: state that the version is incompatible, the version in use, and the supported\n * bounds — the maximum only when the plugin declares one. Single source of truth so every entry\n * point reads identically.\n */\nexport function buildExternalPluginCompatibilityMessage(\n info: ExternalPluginCompatibilityInfo,\n translateService: TranslateService\n): string {\n const current = info.currentGzacVersion ?? '?';\n\n const parts: string[] = [\n translateService.instant('pluginManagement.compatibility.intro'),\n translateService.instant('pluginManagement.compatibility.current', {current}),\n ];\n\n if (info.minGzacVersion) {\n parts.push(\n translateService.instant('pluginManagement.compatibility.minimum', {min: info.minGzacVersion})\n );\n }\n if (info.maxGzacVersion) {\n parts.push(\n translateService.instant('pluginManagement.compatibility.maximum', {max: info.maxGzacVersion})\n );\n }\n\n return parts.join(' ');\n}\n","/*\n * Copyright 2015-2026 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (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 * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\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\nconst DEFAULT_PORTS: Record<string, string> = {'http:': '80', 'https:': '443'};\n\n/**\n * Preview of the `http_request` destinations GZAC will derive from a configuration's own values —\n * the origins of the properties the plugin marked `x-egress-target: true` in its\n * `configurationSchema`.\n *\n * Display only. GZAC recomputes this server-side on every push (`PluginEgressTargets`) and that\n * result is what the plugin host enforces; this exists so the permissions step can show the admin\n * the destinations their own input just authorised, alongside the manifest-declared ones. Kept in\n * step with the server by normalising the same way: scheme + host + port, with an absent port\n * meaning the scheme's default.\n *\n * Only top-level properties are inspected, matching the server-side walkers for `x-secret` and\n * `x-egress-target`.\n */\nexport function deriveExternalPluginEgressOrigins(\n configurationSchema: unknown,\n properties: Record<string, unknown> | null | undefined\n): Array<string> {\n const origins = new Set<string>();\n for (const field of egressTargetFieldNames(configurationSchema)) {\n const value = properties?.[field];\n if (typeof value !== 'string') continue;\n const origin = normalizeEgressOrigin(value);\n if (origin !== null) origins.add(origin);\n }\n return [...origins];\n}\n\nfunction egressTargetFieldNames(configurationSchema: unknown): Array<string> {\n if (typeof configurationSchema !== 'object' || configurationSchema === null) return [];\n const schemaProperties = (configurationSchema as Record<string, unknown>)['properties'];\n if (typeof schemaProperties !== 'object' || schemaProperties === null) return [];\n return Object.entries(schemaProperties as Record<string, unknown>)\n .filter(\n ([, fieldSchema]) =>\n typeof fieldSchema === 'object' &&\n fieldSchema !== null &&\n (fieldSchema as Record<string, unknown>)['x-egress-target'] === true\n )\n .map(([field]) => field);\n}\n\n/** Canonical `scheme://host:port`, or null when the value is not an absolute http(s) URL. */\nfunction normalizeEgressOrigin(value: string): string | null {\n const trimmed = value.trim();\n if (trimmed === '') return null;\n let url: URL;\n try {\n url = new URL(trimmed);\n } catch {\n return null;\n }\n const port = url.port || DEFAULT_PORTS[url.protocol];\n if (port === undefined || url.hostname === '') return null;\n return `${url.protocol}//${url.hostname}:${port}`;\n}\n","/*\n * Copyright 2015-2026 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (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 * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\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 * from './csp-allows-origin.util';\nexport * from './external-plugin-compatibility.util';\nexport * from './external-plugin-egress.util';\n","/*\n * Copyright 2015-2026 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (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 * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\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 {\n ChangeDetectionStrategy,\n Component,\n EventEmitter,\n inject,\n Input,\n OnChanges,\n Output,\n signal,\n SimpleChanges,\n} from '@angular/core';\nimport {CommonModule} from '@angular/common';\nimport {TranslateModule, TranslateService} from '@ngx-translate/core';\nimport {\n CheckboxModule,\n NotificationModule,\n StructuredListModule,\n TagModule,\n} from 'carbon-components-angular';\nimport {\n ExternalPluginGrantedEndpointEntry,\n ExternalPluginGrantedEventEntry,\n ExternalPluginEndpoint,\n ExternalPluginService,\n} from '@valtimo/plugin';\nimport {EnrichedEndpoint} from '../../models';\n\n/**\n * Lists the GZAC API endpoints, platform events, host capabilities and outbound destinations an\n * external plugin requires. Permissions are all-or-nothing: the backend rejects a configuration\n * unless every endpoint, `eventSubscriptions` type, capability and `permissions.egress` origin the\n * manifest declares is granted. The admin reviews the full list and accepts all of it with a single\n * acknowledgement before saving.\n *\n * The outbound-destination section has two halves, which differ in who decided them:\n *\n * - {@link egress} — declared in the manifest, so part of the grant the admin accepts here.\n * - {@link derivedEgress} — origins computed from the configuration values the admin just entered in\n * properties marked `x-egress-target`. Not a separate grant: typing the URL *is* the grant, and it\n * is shown so the admin sees the complete set of destinations the plugin will be able to reach.\n *\n * In `readonlyMode` (editing an existing configuration) the list is informational only — the\n * permissions were already accepted at activation — so no acknowledgement is required.\n */\n@Component({\n standalone: true,\n selector: 'valtimo-plugin-external-permissions',\n templateUrl: './plugin-external-permissions.component.html',\n styleUrls: ['./plugin-external-permissions.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n CommonModule,\n TranslateModule,\n CheckboxModule,\n NotificationModule,\n StructuredListModule,\n TagModule,\n ],\n})\nexport class PluginExternalPermissionsComponent implements OnChanges {\n @Input() public endpoints: Array<ExternalPluginEndpoint> = [];\n @Input() public eventSubscriptions: Array<string> = [];\n @Input() public capabilities: Array<string> = [];\n /** Manifest-declared origins (`permissions.egress`), granted as a set with the rest. */\n @Input() public egress: Array<string> = [];\n /** Origins derived from the admin's own `x-egress-target` configuration values. */\n @Input() public derivedEgress: Array<string> = [];\n @Input() public readonlyMode = false;\n\n @Output() public validEvent = new EventEmitter<boolean>();\n @Output() public grantedEndpointsChange = new EventEmitter<\n Array<ExternalPluginGrantedEndpointEntry>\n >();\n @Output() public grantedEventsChange = new EventEmitter<Array<ExternalPluginGrantedEventEntry>>();\n @Output() public grantedCapabilitiesChange = new EventEmitter<Array<string>>();\n @Output() public grantedEgressChange = new EventEmitter<Array<string>>();\n\n public readonly $enrichedEndpoints = signal<Array<EnrichedEndpoint>>([]);\n public readonly $eventTypes = signal<Array<string>>([]);\n public readonly $capabilities = signal<Array<string>>([]);\n public readonly $egress = signal<Array<string>>([]);\n public readonly $derivedEgress = signal<Array<string>>([]);\n public readonly $accepted = signal<boolean>(false);\n\n private readonly _externalPluginService = inject(ExternalPluginService);\n private readonly _translateService = inject(TranslateService);\n\n /**\n * True when the manifest requests nothing — no review or acknowledgement is needed then.\n * Derived egress is deliberately not part of this: it is not a grant (the admin typing the URL\n * is the grant), so it is only ever displayed, never accepted.\n */\n public get isEmpty(): boolean {\n return (\n this.endpoints.length === 0 &&\n this.eventSubscriptions.length === 0 &&\n this.capabilities.length === 0 &&\n this.egress.length === 0\n );\n }\n\n public ngOnChanges(changes: SimpleChanges): void {\n if (\n changes['endpoints'] ||\n changes['eventSubscriptions'] ||\n changes['capabilities'] ||\n changes['egress'] ||\n changes['derivedEgress'] ||\n changes['readonlyMode']\n ) {\n this.$accepted.set(false);\n this.$eventTypes.set([...this.eventSubscriptions]);\n this.$capabilities.set([...this.capabilities]);\n this.$egress.set([...this.egress]);\n this.$derivedEgress.set([...this.derivedEgress]);\n this._emitGrantedEvents(this.$eventTypes());\n this._emitGrantedCapabilities(this.$capabilities());\n this._emitGrantedEgress(this.$egress());\n this._fetchDescriptionsAndInit();\n }\n }\n\n public onAcceptanceChange(accepted: boolean): void {\n this.$accepted.set(accepted);\n this._emitValidity();\n }\n\n public _httpMethodTagType(method: string): string {\n switch (method.toUpperCase()) {\n case 'GET':\n return 'blue';\n case 'POST':\n return 'green';\n case 'PUT':\n return 'teal';\n case 'PATCH':\n return 'cyan';\n case 'DELETE':\n return 'red';\n default:\n return 'warm-gray';\n }\n }\n\n private _endpointKey(endpoint: ExternalPluginEndpoint): string {\n return `${endpoint.method.toUpperCase()}:${endpoint.pattern}`;\n }\n\n private _fetchDescriptionsAndInit(): void {\n if (this.endpoints.length === 0) {\n this._setEnriched([]);\n return;\n }\n\n const queries = this.endpoints.map(ep => ({method: ep.method, pattern: ep.pattern}));\n const locale = this._translateService.currentLang || this._translateService.defaultLang || 'en';\n\n this._externalPluginService.getEndpointDescriptions(queries, locale).subscribe({\n next: descriptions => {\n const descriptionMap = new Map(\n descriptions.map(d => [`${d.method.toUpperCase()}:${d.pattern}`, d.description])\n );\n\n this._setEnriched(\n this.endpoints.map(ep => ({\n ...ep,\n description: descriptionMap.get(this._endpointKey(ep)) ?? null,\n }))\n );\n },\n error: () => {\n this._setEnriched(this.endpoints.map(ep => ({...ep, description: null})));\n },\n });\n }\n\n private _setEnriched(enriched: Array<EnrichedEndpoint>): void {\n this.$enrichedEndpoints.set(enriched);\n this._emitGrantedEndpoints(enriched);\n this._emitValidity();\n }\n\n /**\n * Accepting the permissions grants the full declared set — partial grants are not allowed by the\n * backend, so the component always emits every endpoint.\n */\n private _emitGrantedEndpoints(enriched: Array<EnrichedEndpoint>): void {\n this.grantedEndpointsChange.emit(\n enriched.map(ep => ({method: ep.method.toUpperCase(), pattern: ep.pattern}))\n );\n }\n\n /**\n * Mirror of {@link _emitGrantedEndpoints} for event subscriptions — same all-or-nothing model:\n * the host treats the granted list as the dispatch allowlist, narrower-or-equal to the manifest's\n * declared `eventSubscriptions`.\n */\n private _emitGrantedEvents(eventTypes: Array<string>): void {\n this.grantedEventsChange.emit(eventTypes.map(eventType => ({eventType})));\n }\n\n private _emitGrantedCapabilities(caps: Array<string>): void {\n this.grantedCapabilitiesChange.emit([...caps]);\n }\n\n /**\n * Only the manifest-declared origins are emitted. Derived ones are not a grant the backend accepts\n * — it recomputes them from the configuration values on every push — so sending them would trip the\n * exact-match check against the manifest.\n */\n private _emitGrantedEgress(targets: Array<string>): void {\n this.grantedEgressChange.emit([...targets]);\n }\n\n /**\n * A `*.` entry authorises every subdomain under it, which is a materially wider grant than a fixed\n * host — under author-controlled DNS it reopens both arbitrary-subdomain exfiltration and the DNS\n * channel. The template renders these distinctly so the difference is visible, not buried in a list.\n */\n public _isWildcardEgress(target: string): boolean {\n return target.includes('*.');\n }\n\n private _emitValidity(): void {\n // Derived origins are deliberately excluded: they are not part of what the acknowledgement\n // grants, so a plugin whose only destination comes from a config value the admin typed does not\n // need an extra acceptance for it.\n const empty =\n this.$enrichedEndpoints().length === 0 &&\n this.$eventTypes().length === 0 &&\n this.$capabilities().length === 0 &&\n this.$egress().length === 0;\n const valid = this.readonlyMode || empty || this.$accepted();\n this.validEvent.emit(valid);\n }\n}\n","<!--\n ~ Copyright 2015-2026 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (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 ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\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<cds-inline-notification\n *ngIf=\"!isEmpty\"\n class=\"plugin-external-permissions__trust-notice\"\n [notificationObj]=\"{\n type: readonlyMode ? 'info' : 'warning',\n title: '',\n message:\n (readonlyMode\n ? 'pluginManagement.permissions.descriptionReadonly'\n : 'pluginManagement.permissions.description'\n ) | translate,\n showClose: false,\n lowContrast: true,\n }\"\n></cds-inline-notification>\n\n<cds-inline-notification\n *ngIf=\"isEmpty && $derivedEgress().length === 0\"\n [notificationObj]=\"{\n type: 'info',\n title: '',\n message: 'pluginManagement.permissions.noEndpoints' | translate,\n showClose: false,\n lowContrast: true,\n }\"\n></cds-inline-notification>\n\n<section *ngIf=\"$capabilities().length > 0\" class=\"plugin-external-permissions__section\">\n <h6 class=\"cds--type-heading-compact-02 plugin-external-permissions__section-heading\">\n {{ 'pluginManagement.permissions.capabilitiesHeading' | translate }}\n </h6>\n\n <cds-structured-list>\n <cds-list-header>\n <cds-list-column nowrap=\"true\">\n {{ 'pluginManagement.permissions.capabilityHeading' | translate }}\n </cds-list-column>\n <cds-list-column>\n {{ 'pluginManagement.permissions.descriptionHeading' | translate }}\n </cds-list-column>\n </cds-list-header>\n\n <cds-list-row\n *ngFor=\"let cap of $capabilities()\"\n [attr.data-test-id]=\"'external-plugin-permission-capability-' + cap\"\n >\n <cds-list-column nowrap=\"true\">\n <cds-tag type=\"purple\" size=\"sm\">{{ cap }}</cds-tag>\n </cds-list-column>\n\n <cds-list-column>\n {{ 'pluginManagement.permissions.capability.' + cap | translate }}\n </cds-list-column>\n </cds-list-row>\n </cds-structured-list>\n</section>\n\n<section *ngIf=\"$enrichedEndpoints().length > 0\" class=\"plugin-external-permissions__section\">\n <h6 class=\"cds--type-heading-compact-02 plugin-external-permissions__section-heading\">\n {{ 'pluginManagement.permissions.endpointsHeading' | translate }}\n </h6>\n\n <cds-structured-list>\n <cds-list-header>\n <cds-list-column nowrap=\"true\">\n {{ 'pluginManagement.permissions.methodHeading' | translate }}\n </cds-list-column>\n <cds-list-column nowrap=\"true\">\n {{ 'pluginManagement.permissions.endpointHeading' | translate }}\n </cds-list-column>\n <cds-list-column>\n {{ 'pluginManagement.permissions.descriptionHeading' | translate }}\n </cds-list-column>\n </cds-list-header>\n\n <cds-list-row\n *ngFor=\"let endpoint of $enrichedEndpoints()\"\n [attr.data-test-id]=\"'external-plugin-permission-' + endpoint.method + '-' + endpoint.pattern\"\n >\n <cds-list-column nowrap=\"true\">\n <cds-tag [type]=\"_httpMethodTagType(endpoint.method)\" size=\"sm\">{{\n endpoint.method | uppercase\n }}</cds-tag>\n </cds-list-column>\n\n <cds-list-column nowrap=\"true\">\n <cds-tag type=\"cool-gray\" size=\"sm\">{{ endpoint.pattern }}</cds-tag>\n </cds-list-column>\n\n <cds-list-column>\n <span *ngIf=\"endpoint.description; else noDescription\">{{ endpoint.description }}</span>\n <ng-template #noDescription>\n <span class=\"plugin-external-permissions__helper\">—</span>\n </ng-template>\n </cds-list-column>\n </cds-list-row>\n </cds-structured-list>\n</section>\n\n<section *ngIf=\"$eventTypes().length > 0\" class=\"plugin-external-permissions__section\">\n <h6 class=\"cds--type-heading-compact-02 plugin-external-permissions__section-heading\">\n {{ 'pluginManagement.permissions.eventsHeading' | translate }}\n </h6>\n\n <div class=\"plugin-external-permissions__tag-cloud\">\n <cds-tag\n *ngFor=\"let eventType of $eventTypes()\"\n type=\"teal\"\n size=\"sm\"\n [attr.data-test-id]=\"'external-plugin-permission-event-' + eventType\"\n >\n {{ eventType }}\n </cds-tag>\n </div>\n</section>\n\n<section\n *ngIf=\"$egress().length > 0 || $derivedEgress().length > 0\"\n class=\"plugin-external-permissions__section\"\n>\n <h6 class=\"cds--type-heading-compact-02 plugin-external-permissions__section-heading\">\n {{ 'pluginManagement.permissions.egressHeading' | translate }}\n </h6>\n\n <p class=\"plugin-external-permissions__helper\">\n {{ 'pluginManagement.permissions.egressDescription' | translate }}\n </p>\n\n <cds-structured-list>\n <cds-list-header>\n <cds-list-column nowrap=\"true\">\n {{ 'pluginManagement.permissions.egressTargetHeading' | translate }}\n </cds-list-column>\n <cds-list-column>\n {{ 'pluginManagement.permissions.egressSourceHeading' | translate }}\n </cds-list-column>\n </cds-list-header>\n\n <cds-list-row\n *ngFor=\"let target of $egress()\"\n [attr.data-test-id]=\"'external-plugin-permission-egress-' + target\"\n >\n <cds-list-column nowrap=\"true\">\n <cds-tag [type]=\"_isWildcardEgress(target) ? 'magenta' : 'cool-gray'\" size=\"sm\">{{\n target\n }}</cds-tag>\n </cds-list-column>\n\n <cds-list-column>\n <span *ngIf=\"_isWildcardEgress(target); else fixedTarget\">\n {{ 'pluginManagement.permissions.egressWildcard' | translate }}\n </span>\n <ng-template #fixedTarget>\n {{ 'pluginManagement.permissions.egressFromManifest' | translate }}\n </ng-template>\n </cds-list-column>\n </cds-list-row>\n\n <cds-list-row\n *ngFor=\"let target of $derivedEgress()\"\n [attr.data-test-id]=\"'external-plugin-permission-egress-derived-' + target\"\n >\n <cds-list-column nowrap=\"true\">\n <cds-tag type=\"blue\" size=\"sm\">{{ target }}</cds-tag>\n </cds-list-column>\n\n <cds-list-column>\n {{ 'pluginManagement.permissions.egressFromConfiguration' | translate }}\n </cds-list-column>\n </cds-list-row>\n </cds-structured-list>\n</section>\n\n<cds-checkbox\n *ngIf=\"!readonlyMode && !isEmpty\"\n class=\"plugin-external-permissions__acceptance\"\n [checked]=\"$accepted()\"\n (checkedChange)=\"onAcceptanceChange($event)\"\n data-test-id=\"external-plugin-permissions-accept\"\n>\n {{ 'pluginManagement.permissions.accept' | translate }}\n</cds-checkbox>\n","/*\n * Copyright 2015-2026 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (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 * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\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 {\n ChangeDetectionStrategy,\n Component,\n EventEmitter,\n Input,\n OnChanges,\n OnDestroy,\n Output,\n signal,\n SimpleChanges,\n} from '@angular/core';\nimport {CommonModule} from '@angular/common';\nimport {TranslateModule, TranslateService} from '@ngx-translate/core';\nimport {FormControl, FormGroup, ReactiveFormsModule, Validators} from '@angular/forms';\nimport {\n ButtonModule,\n LoadingModule,\n ModalModule,\n NotificationModule,\n ProgressIndicatorModule,\n} from 'carbon-components-angular';\nimport {CARBON_CONSTANTS, ValtimoCdsModalDirective} from '@valtimo/components';\nimport {\n ExternalPluginDefinition,\n ExternalPluginIframeComponent,\n ExternalPluginEndpoint,\n ExternalPluginService,\n getExternalPluginDisplayName,\n} from '@valtimo/plugin';\nimport {UnifiedPluginConfigurationRow} from '../../models';\nimport {forkJoin, Subscription} from 'rxjs';\nimport {PluginExternalPermissionsComponent} from '../plugin-external-permissions/plugin-external-permissions.component';\n\n@Component({\n standalone: true,\n selector: 'valtimo-plugin-external-edit-modal',\n templateUrl: './plugin-external-edit-modal.component.html',\n styleUrls: ['./plugin-external-edit-modal.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n CommonModule,\n TranslateModule,\n ReactiveFormsModule,\n ModalModule,\n ButtonModule,\n LoadingModule,\n NotificationModule,\n ProgressIndicatorModule,\n ValtimoCdsModalDirective,\n ExternalPluginIframeComponent,\n PluginExternalPermissionsComponent,\n ],\n})\nexport class PluginExternalEditModalComponent implements OnChanges, OnDestroy {\n @Input() public open = false;\n @Input() public configuration: UnifiedPluginConfigurationRow | null = null;\n\n @Output() public closeEvent = new EventEmitter<void>();\n @Output() public savedEvent = new EventEmitter<void>();\n @Output() public deleteEvent = new EventEmitter<string>();\n\n public readonly _form = new FormGroup({\n title: new FormControl('', Validators.required),\n properties: new FormControl('{}'),\n });\n\n public readonly $loading = signal(false);\n public readonly $propertiesInvalid = signal(false);\n public readonly $configBundleUrl = signal<string | null>(null);\n public readonly $prefillConfiguration = signal<{\n title: string;\n configuration: Record<string, unknown>;\n } | null>(null);\n\n public readonly $endpoints = signal<Array<ExternalPluginEndpoint>>([]);\n public readonly $eventSubscriptions = signal<Array<string>>([]);\n public readonly $capabilities = signal<Array<string>>([]);\n public readonly $egress = signal<Array<string>>([]);\n /**\n * Destinations derived from this configuration's own `x-egress-target` values. Taken from the saved\n * configuration rather than recomputed locally, so the list matches what GZAC pushed to the host.\n */\n public readonly $derivedEgress = signal<Array<string>>([]);\n public readonly $permissionsValid = signal(false);\n public readonly $hasPermissionsStep = signal(false);\n public readonly $definitionName = signal<string>('');\n public readonly $awaitingHost = signal(false);\n\n public currentStepIndex = 0;\n public progressSteps: Array<{label: string; complete: boolean}> = [];\n\n private _iframeConfigTitle: string = '';\n private _iframeConfigData: Record<string, unknown> | null = null;\n private readonly _$configurationSchema = signal<unknown | null>(null);\n private readonly _$iframeValid = signal(false);\n private readonly _$definition = signal<ExternalPluginDefinition | null>(null);\n\n private readonly _subscriptions = new Subscription();\n private _propertiesValueSubscription: Subscription | null = null;\n\n constructor(\n private readonly _externalPluginService: ExternalPluginService,\n private readonly _translateService: TranslateService\n ) {\n this._buildProgressSteps();\n this._subscriptions.add(\n this._translateService.onLangChange.subscribe(() => {\n this._buildProgressSteps();\n this._updateDefinitionName();\n })\n );\n }\n\n public ngOnDestroy(): void {\n this._subscriptions.unsubscribe();\n this._propertiesValueSubscription?.unsubscribe();\n }\n\n public ngOnChanges(changes: SimpleChanges): void {\n if (changes['open'] && this.open && this.configuration) {\n this._initForm();\n }\n }\n\n public goToNextStep(): void {\n if (this.currentStepIndex < this.progressSteps.length - 1) {\n this.currentStepIndex++;\n }\n }\n\n public onSave(): void {\n if (!this.configuration?.id) return;\n\n if (this.$configBundleUrl()) {\n this._saveFromIframe();\n return;\n }\n\n if (this._form.invalid || this.$propertiesInvalid()) return;\n\n let properties: Record<string, unknown>;\n try {\n properties = JSON.parse(this._form.value.properties ?? '{}');\n } catch {\n this.$propertiesInvalid.set(true);\n return;\n }\n\n this.$loading.set(true);\n\n // Permissions are accepted at activation and are immutable afterwards, so they are not sent\n // on update — the backend leaves the granted endpoints unchanged when they are omitted.\n this._externalPluginService\n .updateConfiguration(this.configuration.id, {\n title: this._form.value.title ?? '',\n properties,\n })\n .subscribe({\n next: () => {\n this.$loading.set(false);\n this.savedEvent.emit();\n },\n error: () => {\n this.$loading.set(false);\n },\n });\n }\n\n public onDelete(): void {\n if (!this.configuration?.id) return;\n this.deleteEvent.emit(this.configuration.id);\n }\n\n public onClose(): void {\n this.closeEvent.emit();\n setTimeout(() => {\n this._resetForm();\n }, CARBON_CONSTANTS.modalAnimationMs);\n }\n\n public onIframeConfigurationChanged(event: {\n valid: boolean;\n title: string;\n data: Record<string, unknown>;\n }): void {\n this._iframeConfigTitle = event.title;\n this._iframeConfigData = event.data;\n this._$iframeValid.set(event.valid);\n }\n\n public onPermissionsValid(valid: boolean): void {\n this.$permissionsValid.set(valid);\n }\n\n public get configValid(): boolean {\n if (this.$awaitingHost()) return false;\n if (this.$configBundleUrl()) {\n return this._$iframeValid();\n }\n return this._form.valid && !this.$propertiesInvalid();\n }\n\n private _saveFromIframe(): void {\n if (!this.configuration?.id) return;\n\n const prefill = this.$prefillConfiguration();\n const title = this._iframeConfigTitle || prefill?.title || this.configuration.title;\n const properties = this._iframeConfigData ?? prefill?.configuration ?? {};\n\n this.$loading.set(true);\n\n this._externalPluginService\n .updateConfiguration(this.configuration.id, {\n title,\n properties,\n })\n .subscribe({\n next: () => {\n this.$loading.set(false);\n this.savedEvent.emit();\n },\n error: () => {\n this.$loading.set(false);\n },\n });\n }\n\n private _initForm(): void {\n this.currentStepIndex = 0;\n this._form.reset({\n title: this.configuration?.title ?? '',\n properties: '{}',\n });\n this.$propertiesInvalid.set(false);\n this._$configurationSchema.set(null);\n this.$configBundleUrl.set(null);\n this.$prefillConfiguration.set(null);\n this._$iframeValid.set(false);\n this._iframeConfigTitle = '';\n this._iframeConfigData = null;\n this.$endpoints.set([]);\n this.$eventSubscriptions.set([]);\n this.$capabilities.set([]);\n this.$egress.set([]);\n this.$derivedEgress.set([]);\n this.$permissionsValid.set(false);\n this.$hasPermissionsStep.set(false);\n this._$definition.set(null);\n this.$definitionName.set('');\n this.$awaitingHost.set(false);\n\n const configId = this.configuration?.id;\n const definitionId = this.configuration?.externalDefinitionId;\n\n if (configId && definitionId) {\n this.$loading.set(true);\n forkJoin([\n this._externalPluginService.getConfiguration(configId),\n this._externalPluginService.getDefinition(definitionId),\n ]).subscribe({\n next: ([configDetail, definition]) => {\n this._setDefinition(definition);\n this._$configurationSchema.set(definition.configurationSchema);\n this._resolveConfigBundleUrl(definition);\n\n if (this.$configBundleUrl()) {\n this.$prefillConfiguration.set({\n title: configDetail.title,\n configuration: configDetail.properties ?? {},\n });\n } else {\n this._form.patchValue({\n title: configDetail.title,\n properties: JSON.stringify(configDetail.properties ?? {}, null, 2),\n });\n }\n\n const endpoints = definition.manifest?.permissions?.endpoints ?? [];\n const eventSubscriptions = definition.manifest?.eventSubscriptions ?? [];\n const capabilities = definition.manifest?.permissions?.capabilities ?? [];\n // Egress comes off the configuration, not the manifest: the manifest-declared grants are\n // what was accepted at activation, and the derived ones follow the values actually stored.\n const egress = configDetail.grantedEgress?.map(entry => entry.target) ?? [];\n const derivedEgress = configDetail.derivedEgress ?? [];\n this.$endpoints.set(endpoints);\n this.$eventSubscriptions.set(eventSubscriptions);\n this.$capabilities.set(capabilities);\n this.$egress.set(egress);\n this.$derivedEgress.set(derivedEgress);\n this.$hasPermissionsStep.set(\n endpoints.length > 0 ||\n eventSubscriptions.length > 0 ||\n capabilities.length > 0 ||\n egress.length > 0 ||\n derivedEgress.length > 0\n );\n this.$permissionsValid.set(true);\n\n this._buildProgressSteps();\n this.$loading.set(false);\n },\n error: () => {\n this.$loading.set(false);\n },\n });\n } else if (definitionId) {\n this.$loading.set(true);\n this._externalPluginService.getDefinition(definitionId).subscribe({\n next: definition => {\n this._setDefinition(definition);\n this._$configurationSchema.set(definition.configurationSchema);\n this._resolveConfigBundleUrl(definition);\n\n const endpoints = definition.manifest?.permissions?.endpoints ?? [];\n const eventSubscriptions = definition.manifest?.eventSubscriptions ?? [];\n const capabilities = definition.manifest?.permissions?.capabilities ?? [];\n const egress = definition.manifest?.permissions?.egress ?? [];\n this.$endpoints.set(endpoints);\n this.$eventSubscriptions.set(eventSubscriptions);\n this.$capabilities.set(capabilities);\n this.$egress.set(egress);\n this.$hasPermissionsStep.set(\n endpoints.length > 0 ||\n eventSubscriptions.length > 0 ||\n capabilities.length > 0 ||\n egress.length > 0\n );\n this.$permissionsValid.set(true);\n\n this._buildProgressSteps();\n this.$loading.set(false);\n },\n error: () => {\n this.$loading.set(false);\n },\n });\n } else {\n this._buildProgressSteps();\n }\n\n // `_initForm` runs on every modal open: tear down the previous subscription first so they do\n // not accumulate over repeated opens.\n this._propertiesValueSubscription?.unsubscribe();\n this._propertiesValueSubscription =\n this._form.get('properties')?.valueChanges.subscribe(value => {\n try {\n JSON.parse(value ?? '{}');\n this.$propertiesInvalid.set(false);\n } catch {\n this.$propertiesInvalid.set(true);\n }\n }) ?? null;\n }\n\n private _setDefinition(definition: ExternalPluginDefinition): void {\n this._$definition.set(definition);\n this.$awaitingHost.set(definition.awaitingDiscovery);\n this._updateDefinitionName();\n }\n\n private _updateDefinitionName(): void {\n const definition = this._$definition();\n this.$definitionName.set(\n definition ? getExternalPluginDisplayName(definition, this._translateService.currentLang) : ''\n );\n }\n\n private _resolveConfigBundleUrl(definition: ExternalPluginDefinition): void {\n const configBundle = definition.manifest?.frontendBundles?.find(b => b.type === 'config');\n if (configBundle) {\n this.$configBundleUrl.set(`${definition.baseUrl}/${definition.version}${configBundle.path}`);\n }\n }\n\n /**\n * Carbon's progress indicator recomputes step completion only inside its `current` setter, so a\n * rebuilt steps array (language change, permissions step appearing) must carry the `complete`\n * flags itself — with an unchanged current step the rebuild would otherwise wipe the checkmarks.\n */\n private _buildProgressSteps(): void {\n const labels = [this._translateService.instant('pluginManagement.editSteps.step0')];\n\n if (this.$hasPermissionsStep()) {\n labels.push(this._translateService.instant('pluginManagement.editSteps.step1'));\n }\n\n this.progressSteps = labels.map((label, index) => ({\n label,\n complete: index < this.currentStepIndex,\n }));\n }\n\n private _resetForm(): void {\n this.currentStepIndex = 0;\n this._form.reset({title: '', properties: '{}'});\n this.$propertiesInvalid.set(false);\n this._$configurationSchema.set(null);\n this.$configBundleUrl.set(null);\n this.$prefillConfiguration.set(null);\n this._$iframeValid.set(false);\n this._iframeConfigTitle = '';\n this._iframeConfigData = null;\n this.$endpoints.set([]);\n this.$eventSubscriptions.set([]);\n this.$capabilities.set([]);\n this.$permissionsValid.set(false);\n this.$hasPermissionsStep.set(false);\n this._$definition.set(null);\n this.$definitionName.set('');\n this.$awaitingHost.set(false);\n this._buildProgressSteps();\n }\n}\n","<!--\n ~ Copyright 2015-2026 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (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 ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\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<cds-modal *ngIf=\"open\" [open]=\"open\" size=\"md\" valtimoCdsModal>\n <cds-modal-header (closeSelect)=\"onClose()\">\n {{ configuration?.title }} - {{ $definitionName() }}\n\n <cds-progress-indicator\n *ngIf=\"progressSteps.length > 1\"\n [steps]=\"progressSteps\"\n [current]=\"currentStepIndex\"\n spacing=\"equal\"\n class=\"plugin-external-edit-modal__progress\"\n ></cds-progress-indicator>\n </cds-modal-header>\n\n <section cdsModalContent>\n <cds-loading *ngIf=\"$loading()\" [isActive]=\"true\" size=\"sm\"></cds-loading>\n\n <div [hidden]=\"currentStepIndex !== 0 || $loading()\">\n <ng-container *ngIf=\"!$loading()\">\n <cds-inline-notification\n *ngIf=\"$awaitingHost(); else editableConfiguration\"\n [notificationObj]=\"{\n type: 'info',\n title: ('pluginManagement.awaitingHost.modalTitle' | translate),\n message: ('pluginManagement.awaitingHost.modalMessage' | translate),\n showClose: false,\n lowContrast: true,\n }\"\n class=\"plugin-external-edit-modal__awaiting-host\"\n ></cds-inline-notification>\n\n <ng-template #editableConfiguration>\n <ng-container *ngIf=\"$configBundleUrl() as bundleUrl; else jsonForm\">\n <valtimo-external-plugin-iframe\n [bundleUrl]=\"bundleUrl\"\n [prefillConfiguration]=\"$prefillConfiguration()\"\n (configurationChangedEvent)=\"onIframeConfigurationChanged($event)\"\n ></valtimo-external-plugin-iframe>\n </ng-container>\n\n <ng-template #jsonForm>\n <form [formGroup]=\"_form\">\n <div class=\"cds--form-item\">\n <label class=\"cds--label\">{{\n 'pluginManagement.labels.configurationName' | translate\n }}</label>\n <input class=\"cds--text-input\" formControlName=\"title\" />\n </div>\n\n <div class=\"cds--form-item\">\n <label class=\"cds--label\">{{\n 'pluginManagement.labels.properties' | translate\n }}</label>\n\n <textarea\n class=\"cds--text-area plugin-external-edit-modal__properties-textarea\"\n formControlName=\"properties\"\n rows=\"12\"\n ></textarea>\n\n <div *ngIf=\"$propertiesInvalid()\" class=\"cds--form-requirement\">\n {{ 'pluginManagement.invalidJson' | translate }}\n </div>\n </div>\n </form>\n </ng-template>\n </ng-template>\n </ng-container>\n </div>\n\n <div *ngIf=\"$hasPermissionsStep()\" [hidden]=\"currentStepIndex !== 1\">\n <valtimo-plugin-external-permissions\n [endpoints]=\"$endpoints()\"\n [eventSubscriptions]=\"$eventSubscriptions()\"\n [capabilities]=\"$capabilities()\"\n [egress]=\"$egress()\"\n [derivedEgress]=\"$derivedEgress()\"\n [readonlyMode]=\"true\"\n (validEvent)=\"onPermissionsValid($event)\"\n ></valtimo-plugin-external-permissions>\n </div>\n </section>\n\n <cds-modal-footer>\n <button cdsButton=\"danger\" [disabled]=\"$loading()\" (click)=\"onDelete()\">\n {{ 'pluginManagement.remove' | translate }}\n </button>\n\n <button\n *ngIf=\"currentStepIndex === 0 && $hasPermissionsStep() && !$awaitingHost()\"\n cdsButton=\"primary\"\n [disabled]=\"$loading()\"\n (click)=\"goToNextStep()\"\n >\n {{ 'pluginManagement.editSteps.step1' | translate }}\n </button>\n\n <button\n *ngIf=\"currentStepIndex === 0 && !$hasPermissionsStep() && !$awaitingHost()\"\n cdsButton=\"primary\"\n [disabled]=\"!configValid || $loading()\"\n (click)=\"onSave()\"\n >\n {{ 'pluginManagement.editSteps.save' | translate }}\n </button>\n\n <button\n *ngIf=\"currentStepIndex === 1 && $hasPermissionsStep()\"\n cdsButton=\"primary\"\n [disabled]=\"!$permissionsValid() || $loading()\"\n (click)=\"onSave()\"\n >\n {{ 'pluginManagement.editSteps.save' | translate }}\n </button>\n </cds-modal-footer>\n</cds-modal>\n","/*\n * Copyright 2015-2026 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (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 * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\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 {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n EventEmitter,\n inject,\n Input,\n OnChanges,\n Output,\n signal,\n SimpleChanges,\n} from '@angular/core';\nimport {CommonModule} from '@angular/common';\nimport {HttpErrorResponse} from '@angular/common/http';\nimport {TranslateModule, TranslateService} from '@ngx-translate/core';\nimport {takeUntilDestroyed} from '@angular/core/rxjs-interop';\nimport {FormBuilder, ReactiveFormsModule, Validators} from '@angular/forms';\nimport {\n ButtonModule,\n DropdownModule,\n FileUploaderModule,\n LayerModule,\n ListItem,\n LoadingModule,\n ModalModule,\n NotificationContent,\n NotificationModule,\n} from 'carbon-components-angular';\nimport {ConfirmationModalModule, ValtimoCdsModalDirective} from '@valtimo/components';\nimport {\n ExternalPluginEndpoint,\n ExternalPluginHost,\n ExternalPluginService,\n ExternalPluginUploadResult,\n} from '@valtimo/plugin';\nimport {BehaviorSubject} from 'rxjs';\nimport {buildExternalPluginCompatibilityMessage} from '../../utils';\nimport {PluginExternalPermissionsComponent} from '../plugin-external-permissions/plugin-external-permissions.component';\n\n/**\n * State of the overwrite-review dialog: what the already-existing version is, the permissions the\n * uploaded package requests (shown for re-review) and the pre-built warning notification.\n */\ninterface OverwriteReview {\n pluginId: string;\n version: string;\n endpoints: Array<ExternalPluginEndpoint>;\n eventSubscriptions: Array<string>;\n capabilities: Array<string>;\n egress: Array<string>;\n warning: NotificationContent;\n}\n\n/**\n * Mirrors `ExternalPluginManagementResource.MAX_PLUGIN_UPLOAD_BYTES`, so an oversized package is\n * refused on selection rather than after transferring it. The backend stays the authority: its 413\n * is handled too, and its `maxBytes` wins when the two disagree.\n */\nconst MAX_UPLOAD_BYTES = 100 * 1024 * 1024;\n\n@Component({\n standalone: true,\n selector: 'valtimo-plugin-upload-modal',\n templateUrl: './plugin-upload-modal.component.html',\n styleUrls: ['./plugin-upload-modal.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n CommonModule,\n TranslateModule,\n ReactiveFormsModule,\n ModalModule,\n ButtonModule,\n DropdownModule,\n FileUploaderModule,\n LayerModule,\n LoadingModule,\n NotificationModule,\n ValtimoCdsModalDirective,\n ConfirmationModalModule,\n PluginExternalPermissionsComponent,\n ],\n})\nexport class PluginUploadModalComponent implements OnChanges {\n @Input() public open = false;\n @Input() public hosts: Array<ExternalPluginHost> = [];\n\n @Output() public closeEvent = new EventEmitter<void>();\n /**\n * Emitted only on a successful upload, carrying the host's `{pluginId, version}` so the parent\n * can name the installed plugin in its success notification.\n */\n @Output() public uploadedEvent = new EventEmitter<ExternalPluginUploadResult>();\n\n public readonly $uploading = signal(false);\n public readonly $hostItems = signal<Array<ListItem>>([]);\n public readonly $selectedHostId = signal<string | null>(null);\n\n // Drives the \"upload anyway?\" confirmation shown when the backend rejects an incompatible plugin.\n public readonly _compatibilityModalOpen$ = new BehaviorSubject<boolean>(false);\n public readonly $compatibilityWarning = signal<string>('');\n\n // Inline notification for outcomes the modal handles itself: an identical package that is\n // already on the host (info) or any other host rejection (error). These 409s are deliberately\n // kept off the global error toast (X-Skip-Interceptor), so this notification is their only\n // surface.\n public readonly $uploadNotification = signal<NotificationContent | null>(null);\n\n // Drives the overwrite-review dialog shown when the uploaded pluginId@version already exists\n // with different content: the admin re-reviews the requested permissions and explicitly\n // confirms before the version is overwritten.\n public readonly $overwriteReview = signal<OverwriteReview | null>(null);\n public readonly $overwriteAcknowledged = signal<boolean>(false);\n\n public readonly _fileForm = this._formBuilder.group({\n file: this._formBuilder.control(new Set<any>(), [Validators.required]),\n });\n\n public readonly $fileSelected = signal(false);\n public readonly $fileTooLarge = signal(false);\n\n private readonly _destroyRef = inject(DestroyRef);\n\n constructor(\n private readonly _formBuilder: FormBuilder,\n private readonly _externalPluginService: ExternalPluginService,\n private readonly _translateService: TranslateService\n ) {\n this._fileForm\n .get('file')!\n .valueChanges.pipe(takeUntilDestroyed(this._destroyRef))\n .subscribe(value => {\n this.$fileSelected.set(value instanceof Set && value.size > 0);\n const file = this._selectedFile(value);\n const tooLarge = !!file && file.size > MAX_UPLOAD_BYTES;\n this.$fileTooLarge.set(tooLarge);\n this.$uploadNotification.set(\n tooLarge ? this._buildTooLargeNotification(file!.size, MAX_UPLOAD_BYTES) : null\n );\n });\n }\n\n public ngOnChanges(changes: SimpleChanges): void {\n if (changes['hosts']) {\n const selectedHostId = this.$selectedHostId();\n this.$hostItems.set(\n (this.hosts ?? []).map(host => ({\n content: `${host.name} (${host.baseUrl})`,\n selected: host.id === selectedHostId,\n hostId: host.id,\n }))\n );\n }\n }\n\n public onHostSelected(event: {item: ListItem & {hostId?: string}}): void {\n this.$selectedHostId.set(event?.item?.hostId ?? null);\n }\n\n public onUpload(force = false, overwrite = false): void {\n const hostId = this.$selectedHostId();\n const file = this._selectedFile(this._fileForm.value.file);\n\n if (!hostId || !file || this.$fileTooLarge()) return;\n\n this.$uploading.set(true);\n this.$uploadNotification.set(null);\n\n this._externalPluginService.uploadPlugin(hostId, file, force, overwrite).subscribe({\n next: (result: ExternalPluginUploadResult) => {\n this.$uploading.set(false);\n this.uploadedEvent.emit(result);\n this._resetAndClose();\n },\n error: (error: HttpErrorResponse) => {\n this.$uploading.set(false);\n if (error.status === 409 && error.error?.incompatible) {\n this.$compatibilityWarning.set(\n buildExternalPluginCompatibilityMessage(error.error, this._translateService)\n );\n this._compatibilityModalOpen$.next(true);\n } else if (error.status === 409 && error.error?.code === 'PLUGIN_VERSION_EXISTS') {\n this._handleVersionExists(error.error);\n } else if (error.status === 409) {\n this.$uploadNotification.set(this._buildUploadErrorNotification(error));\n } else if (error.status === 413) {\n this.$uploadNotification.set(\n this._buildTooLargeNotification(file.size, error.error?.maxBytes ?? MAX_UPLOAD_BYTES)\n );\n }\n },\n });\n }\n\n public onConfirmOverwrite(): void {\n this.$overwriteReview.set(null);\n // Compatibility was already checked (or explicitly forced) on the attempt that produced the\n // version-exists 409; force=true keeps the compatibility gate from prompting a second time.\n this.onUpload(true, true);\n }\n\n public onCancelOverwrite(): void {\n this.$overwriteReview.set(null);\n }\n\n public onOverwriteValidityChange(valid: boolean): void {\n this.$overwriteAcknowledged.set(valid);\n }\n\n public onConfirmIncompatibleUpload(): void {\n this._compatibilityModalOpen$.next(false);\n this.onUpload(true);\n }\n\n public onCancelIncompatibleUpload(): void {\n this._compatibilityModalOpen$.next(false);\n }\n\n public onClose(): void {\n if (this.$uploading()) return;\n this._resetAndClose();\n }\n\n private _resetAndClose(): void {\n this.closeEvent.emit();\n this.$selectedHostId.set(null);\n this.$fileSelected.set(false);\n this.$fileTooLarge.set(false);\n this.$uploadNotification.set(null);\n this.$overwriteReview.set(null);\n this.$overwriteAcknowledged.set(false);\n this._fileForm.reset({file: new Set()});\n }\n\n /**\n * The uploaded pluginId@version already exists on the host. Identical content means there is\n * nothing to overwrite — a friendly info suffices. Different (or undeterminable) content opens\n * the overwrite-review dialog: the requested permissions from the enriched 409 body are shown\n * for re-review and the admin must explicitly acknowledge them before the overwrite proceeds.\n */\n private _handleVersionExists(body: {\n pluginId?: string;\n version?: string;\n currentContentHash?: string;\n uploadedContentHash?: string;\n requestedEndpoints?: Array<ExternalPluginEndpoint>;\n requestedEventSubscriptions?: Array<string>;\n requestedCapabilities?: Array<string>;\n requestedEgress?: Array<string>;\n }): void {\n const identical =\n !!body.currentContentHash &&\n !!body.uploadedContentHash &&\n body.currentContentHash === body.uploadedContentHash;\n\n if (identical) {\n this.$uploadNotification.set({\n type: 'info',\n title: this._translateService.instant('pluginManagement.upload.identicalTitle'),\n message: this._translateService.instant('pluginManagement.upload.identicalMessage'),\n showClose: false,\n lowContrast: true,\n });\n return;\n }\n\n this.$overwriteAcknowledged.set(false);\n this.$overwriteReview.set({\n pluginId: body.pluginId ?? '',\n version: body.version ?? '',\n endpoints: body.requestedEndpoints ?? [],\n eventSubscriptions: body.requestedEventSubscriptions ?? [],\n capabilities: body.requestedCapabilities ?? [],\n egress: body.requestedEgress ?? [],\n warning: {\n type: 'warning',\n title: this._translateService.instant('pluginManagement.upload.overwriteWarningTitle'),\n message: this._translateService.instant('pluginManagement.upload.overwriteWarning', {\n pluginId: body.pluginId ?? '',\n version: body.version ?? '',\n }),\n showClose: false,\n lowContrast: true,\n },\n });\n }\n\n private _selectedFile(value: Set<any> | null | undefined): File | undefined {\n return value?.values()?.next()?.value?.file;\n }\n\n private _buildTooLargeNotification(sizeBytes: number, maxBytes: number): NotificationContent {\n // The size rounds UP and the limit rounds DOWN, so a package only just over the cap can never\n // render as \"is 100.0 MB, maximum is 100.0 MB\" — which reads as though nothing were wrong.\n const MB = 1024 * 1024;\n const toMb = (bytes: number, round: (n: number) => number): string =>\n (round((bytes / MB) * 10) / 10).toFixed(1);\n return {\n type: 'error',\n title: this._translateService.instant('pluginManagement.upload.tooLargeTitle'),\n message: this._translateService.instant('pluginManagement.upload.tooLarge', {\n sizeMb: toMb(sizeBytes, Math.ceil),\n maxMb: toMb(maxBytes, Math.floor),\n }),\n showClose: false,\n lowContrast: true,\n };\n }\n\n private _buildUploadErrorNotification(error: HttpErrorResponse): NotificationContent {\n const hostBody = this._parseRelayedHostBody(error);\n const message = [\n this._translateService.instant('pluginManagement.upload.rejected'),\n hostBody?.message ?? hostBody?.error ?? '',\n ]\n .filter(Boolean)\n .join(' ');\n\n return {\n type: 'error',\n title: this._translateService.instant('pluginManagement.upload.failedTitle'),\n message,\n showClose: false,\n lowContrast: true,\n };\n }\n\n // The backend relays a host rejection as `{error, detail}` where `detail` holds the host's raw\n // JSON body (e.g. `{code, error, message}`); non-JSON detail is shown as-is.\n private _parseRelayedHostBody(\n error: HttpErrorResponse\n ): {code?: string; error?: string; message?: string} | null {\n const detail = error.error?.detail;\n if (typeof detail !== 'string' || detail.length === 0) return null;\n\n try {\n return JSON.parse(detail);\n } catch {\n return {message: detail};\n }\n }\n}\n","<!--\n ~ Copyright 2015-2026 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (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 ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\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<cds-modal *ngIf=\"open\" [open]=\"open\" size=\"sm\" valtimoCdsModal>\n <cds-modal-header (closeSelect)=\"onClose()\">\n <h3 cdsModalHeaderHeading>{{ 'pluginManagement.uploadPlugin' | translate }}</h3>\n </cds-modal-header>\n\n <section cdsModalContent [cdsLayer]=\"1\" class=\"plugin-upload-modal__content\">\n <cds-dropdown\n [appendInline]=\"true\"\n [label]=\"'pluginManagement.labels.pluginHost' | translate\"\n [placeholder]=\"'pluginManagement.selectHost' | translate\"\n (selected)=\"onHostSelected($event)\"\n >\n <cds-dropdown-list [items]=\"$hostItems()\"></cds-dropdown-list>\n </cds-dropdown>\n\n <div [formGroup]=\"_fileForm\">\n <cds-file-uploader\n [accept]=\"['zip']\"\n [buttonText]=\"'pluginManagement.upload.buttonText' | translate\"\n [description]=\"'pluginManagement.upload.description' | translate\"\n [disabled]=\"$uploading()\"\n [multiple]=\"false\"\n [title]=\"'pluginManagement.upload.title' | translate\"\n buttonType=\"primary\"\n formControlName=\"file\"\n >\n </cds-file-uploader>\n </div>\n\n <cds-inline-notification\n *ngIf=\"$uploadNotification() as uploadNotification\"\n [notificationObj]=\"uploadNotification\"\n ></cds-inline-notification>\n </section>\n\n <cds-modal-footer>\n <button cdsButton=\"secondary\" [disabled]=\"$uploading()\" (click)=\"onClose()\">\n {{ 'interface.cancel' | translate }}\n </button>\n\n <button\n cdsButton=\"primary\"\n [disabled]=\"!$selectedHostId() || !$fileSelected() || $fileTooLarge() || $uploading()\"\n (click)=\"onUpload()\"\n >\n <cds-loading *ngIf=\"$uploading()\" [isActive]=\"true\" size=\"sm\"></cds-loading>\n {{ 'interface.upload' | translate }}\n </button>\n </cds-modal-footer>\n</cds-modal>\n\n<valtimo-confirmation-modal\n [showModalSubject$]=\"_compatibilityModalOpen$\"\n [titleTranslationKey]=\"'pluginManagement.compatibility.uploadWarningTitle'\"\n [content]=\"$compatibilityWarning()\"\n [confirmButtonTextTranslationKey]=\"'pluginManagement.compatibility.uploadAnyway'\"\n [cancelButtonTextTranslationKey]=\"'interface.cancel'\"\n (confirmEvent)=\"onConfirmIncompatibleUpload()\"\n (cancelEvent)=\"onCancelIncompatibleUpload()\"\n></valtimo-confirmation-modal>\n\n<cds-modal *ngIf=\"$overwriteReview() as overwriteReview\" [open]=\"true\" size=\"md\" valtimoCdsModal>\n <cds-modal-header (closeSelect)=\"onCancelOverwrite()\">\n <h3 cdsModalHeaderHeading>\n {{ 'pluginManagement.upload.overwriteTitle' | translate }}\n </h3>\n </cds-modal-header>\n\n <section cdsModalContent [cdsLayer]=\"1\" class=\"plugin-upload-modal__overwrite-content\">\n <cds-inline-notification [notificationObj]=\"overwriteReview.warning\"></cds-inline-notification>\n\n <valtimo-plugin-external-permissions\n [capabilities]=\"overwriteReview.capabilities\"\n [endpoints]=\"overwriteReview.endpoints\"\n [eventSubscriptions]=\"overwriteReview.eventSubscriptions\"\n [egress]=\"overwriteReview.egress\"\n (validEvent)=\"onOverwriteValidityChange($event)\"\n ></valtimo-plugin-external-permissions>\n </section>\n\n <cds-modal-footer>\n <button cdsButton=\"secondary\" [disabled]=\"$uploading()\" (click)=\"onCancelOverwrite()\">\n {{ 'interface.cancel' | translate }}\n </button>\n\n <button\n cdsButton=\"danger\"\n [disabled]=\"!$overwriteAcknowledged() || $uploading()\"\n (click)=\"onConfirmOverwrite()\"\n >\n {{ 'pluginManagement.upload.overwriteConfirm' | translate }}\n </button>\n </cds-modal-footer>\n</cds-modal>\n","/*\n * Copyright 2015-2026 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (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 * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\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 {ChangeDetectionStrategy, Component, EventEmitter, Input, Output} from '@angular/core';\nimport {CommonModule} from '@angular/common';\nimport {TranslateModule} from '@ngx-translate/core';\nimport {\n ButtonModule,\n ModalModule,\n StructuredListModule,\n TagModule,\n} from 'carbon-components-angular';\nimport {ValtimoCdsModalDirective} from '@valtimo/components';\nimport {ExternalPluginHostUsage, ExternalPluginHostUsageParentType} from '@valtimo/plugin';\n\n/**\n * Read-only modal shown when an admin tries to delete an external plugin entity (a host or a\n * configuration) that is still referenced by one or more BPMN process links, case tabs, case\n * widgets or building-block mappings. The list mirrors the `usages` payload the backend would\n * attach to a 409 from the corresponding `DELETE` endpoint; only \"Close\" is offered — there is no\n * force-delete.\n *\n * The parent supplies the heading + description translation keys so the same modal can be\n * reused for hosts and configurations (and any future entity with the same usage shape).\n */\n@Component({\n standalone: true,\n selector: 'valtimo-plugin-usage-modal',\n templateUrl: './plugin-usage-modal.component.html',\n styleUrls: ['./plugin-usage-modal.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n CommonModule,\n TranslateModule,\n ModalModule,\n ButtonModule,\n StructuredListModule,\n TagModule,\n ValtimoCdsModalDirective,\n ],\n})\nexport class PluginUsageModalComponent {\n @Input() public open = false;\n @Input() public titleTranslationKey = '';\n @Input() public descriptionTranslationKey = '';\n @Input() public entityName: string | null = null;\n @Input() public usages: Array<ExternalPluginHostUsage> = [];\n\n @Output() public closeEvent = new EventEmitter<void>();\n\n public onClose(): void {\n this.closeEvent.emit();\n }\n\n public trackByUsage(_index: number, usage: ExternalPluginHostUsage): string {\n if (usage.processLinkId) {\n return usage.processLinkId;\n }\n if (usage.widgetKey) {\n return `widget:${usage.parentKey}:${usage.tabKey}:${usage.widgetKey}`;\n }\n if (usage.tabKey) {\n return `tab:${usage.parentKey}:${usage.tabKey}`;\n }\n // Menu-page usage: a `plugin-page` node in the application menu (no process link, no tab, no\n // case — the configuration id plus the item's title is what distinguishes it).\n if (usage.menuItemTitle) {\n return `page:${usage.configurationId}:${usage.menuItemTitle}`;\n }\n // Building-block mapping usage on a case-definition ↔ BB link (no process link, no tab).\n return `bb:${usage.parentKey}:${usage.buildingBlockKey}:${usage.configurationId}`;\n }\n\n public parentTypeTagColor(parentType: ExternalPluginHostUsageParentType): string {\n switch (parentType) {\n case 'CASE':\n return 'blue';\n case 'BUILDING_BLOCK':\n return 'purple';\n case 'GLOBAL':\n default:\n return 'cool-gray';\n }\n }\n}\n","<!--\n ~ Copyright 2015-2026 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (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 ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\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<cds-modal *ngIf=\"open\" size=\"lg\" valtimoCdsModal [open]=\"open\" (close)=\"onClose()\">\n <cds-modal-header [showCloseButton]=\"true\" (closeSelect)=\"onClose()\">\n <h3 cdsModalHeaderHeading>\n {{ titleTranslationKey | translate }}\n </h3>\n </cds-modal-header>\n\n <section cdsModalContent>\n <p class=\"cds--type-body-01 plugin-usage-modal__intro\">\n {{ descriptionTranslationKey | translate: {entityName: entityName} }}\n </p>\n\n <cds-structured-list [condensed]=\"true\">\n <cds-list-header>\n <cds-list-column nowrap=\"true\">\n {{ 'pluginManagement.usageModal.headers.activity' | translate }}\n </cds-list-column>\n <cds-list-column nowrap=\"true\">\n {{ 'pluginManagement.usageModal.headers.configuration' | translate }}\n </cds-list-column>\n <cds-list-column nowrap=\"true\">\n {{ 'pluginManagement.usageModal.headers.type' | translate }}\n </cds-list-column>\n <cds-list-column nowrap=\"true\">\n {{ 'pluginManagement.usageModal.headers.linkedTo' | translate }}\n </cds-list-column>\n <cds-list-column nowrap=\"true\">\n {{ 'pluginManagement.usageModal.headers.processDefinition' | translate }}\n </cds-list-column>\n </cds-list-header>\n\n <cds-list-row\n *ngFor=\"let usage of usages; trackBy: trackByUsage\"\n [attr.data-test-id]=\"\n 'plugin-usage-' +\n (usage.processLinkId || usage.widgetKey || usage.tabKey || usage.menuItemTitle)\n \"\n >\n <cds-list-column nowrap=\"true\">\n <div class=\"plugin-usage-modal__cell-main\">\n {{\n usage.activityName ||\n usage.activityId ||\n usage.tabName ||\n usage.tabKey ||\n usage.buildingBlockKey ||\n usage.menuItemTitle\n }}\n </div>\n <div *ngIf=\"usage.activityName\" class=\"plugin-usage-modal__cell-sub\">\n <code class=\"cds--snippet--inline\">{{ usage.activityId }}</code>\n </div>\n <div *ngIf=\"usage.widgetKey && !usage.activityId\" class=\"plugin-usage-modal__cell-sub\">\n {{ 'pluginManagement.usageModal.caseWidget' | translate }}\n <code class=\"cds--snippet--inline\">{{ usage.widgetKey }}</code>\n </div>\n <div\n *ngIf=\"usage.tabKey && !usage.widgetKey && !usage.activityId\"\n class=\"plugin-usage-modal__cell-sub\"\n >\n {{ 'pluginManagement.usageModal.caseTab' | translate }}\n </div>\n <div\n *ngIf=\"usage.buildingBlockKey && !usage.activityId && !usage.tabKey\"\n class=\"plugin-usage-modal__cell-sub\"\n >\n {{ 'pluginManagement.usageModal.buildingBlockMapping' | translate }}\n </div>\n <div\n *ngIf=\"\n usage.menuItemTitle && !usage.activityId && !usage.tabKey && !usage.buildingBlockKey\n \"\n class=\"plugin-usage-modal__cell-sub\"\n >\n {{ 'pluginManagement.usageModal.menuPage' | translate }}\n </div>\n </cds-list-column>\n\n <cds-list-column nowrap=\"true\">\n {{ usage.configurationTitle }}\n </cds-list-column>\n\n <cds-list-column nowrap=\"true\">\n <cds-tag [type]=\"parentTypeTagColor(usage.parentType)\" size=\"sm\">\n {{ 'pluginManagement.usageModal.parentType.' + usage.parentType | translate }}\n </cds-tag>\n </cds-list-column>\n\n <cds-list-column nowrap=\"true\">\n <ng-container *ngIf=\"usage.parentKey; else dash\">\n {{ usage.parentKey }}\n <span *ngIf=\"usage.parentVersionTag\" class=\"plugin-usage-modal__cell-sub\">\n {{ usage.parentVersionTag }}\n </span>\n </ng-container>\n </cds-list-column>\n\n <cds-list-column nowrap=\"true\">\n <ng-container\n *ngIf=\"\n usage.processDefinitionName || usage.processDefinitionKey;\n else processIdFallback\n \"\n >\n <div class=\"plugin-usage-modal__cell-main\">\n {{ usage.processDefinitionName || usage.processDefinitionKey }}\n </div>\n <div\n *ngIf=\"usage.processDefinitionName && usage.processDefinitionKey\"\n class=\"plugin-usage-modal__cell-sub\"\n >\n <code class=\"cds--snippet--inline\">{{ usage.processDefinitionKey }}</code>\n </div>\n </ng-container>\n\n <ng-template #processIdFallback>\n <ng-container *ngIf=\"usage.processDefinitionId; else dash\">\n <code class=\"cds--snippet--inline\">{{ usage.processDefinitionId }}</code>\n </ng-container>\n </ng-template>\n </cds-list-column>\n\n <ng-template #dash>\n <span class=\"plugin-usage-modal__cell-sub\">—</span>\n </ng-template>\n </cds-list-row>\n </cds-structured-list>\n </section>\n\n <cds-modal-footer>\n <button cdsButton=\"ghost\" [attr.modal-primary-focus]=\"true\" (click)=\"onClose()\">\n {{ 'interface.close' | translate }}\n </button>\n </cds-modal-footer>\n</cds-modal>\n","/*\n * Copyright 2015-2026 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (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 * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\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 {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n EventEmitter,\n inject,\n Input,\n OnChanges,\n Output,\n signal,\n SimpleChanges,\n TemplateRef,\n ViewChild,\n} from '@angular/core';\nimport {CommonModule, DatePipe} from '@angular/common';\nimport {TranslateModule, TranslateService} from '@ngx-translate/core';\nimport {\n ButtonModule,\n DropdownModule,\n IconModule,\n IconService,\n LayerModule,\n ModalModule,\n TagModule,\n} from 'carbon-components-angular';\nimport {Close16} from '@carbon/icons';\nimport {\n CarbonListModule,\n CarbonPaginatorConfig,\n ColumnConfig,\n Pagination,\n ValtimoCdsModalDirective,\n ViewType,\n} from '@valtimo/components';\nimport {ExternalPluginService, PluginLogEntry} from '@valtimo/plugin';\nimport {ListItem} from 'carbon-components-angular';\n\nconst DEFAULT_PAGE_SIZE = 10;\n\n@Component({\n standalone: true,\n selector: 'valtimo-plugin-log-modal',\n templateUrl: './plugin-log-modal.component.html',\n styleUrls: ['./plugin-log-modal.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n CommonModule,\n TranslateModule,\n ModalModule,\n ButtonModule,\n DropdownModule,\n LayerModule,\n TagModule,\n CarbonListModule,\n IconModule,\n ValtimoCdsModalDirective,\n DatePipe,\n ],\n})\nexport class PluginLogModalComponent implements OnChanges {\n @Input() public open = false;\n @Input() public configurationId: string | null = null;\n @Input() public configurationTitle: string = '';\n\n @Output() public closeModal = new EventEmitter<void>();\n\n @ViewChild('timestampTpl', {static: true}) public timestampTpl!: TemplateRef<any>;\n @ViewChild('levelTpl', {static: true}) public levelTpl!: TemplateRef<any>;\n @ViewChild('sourceTpl', {static: true}) public sourceTpl!: TemplateRef<any>;\n\n public readonly $loading = signal(false);\n public readonly $rows = signal<PluginLogEntry[]>([]);\n public readonly $selectedRow = signal<PluginLogEntry | null>(null);\n private readonly _$totalElements = signal(0);\n\n public fields: ColumnConfig[] = [];\n public page = 1;\n public pageSize = DEFAULT_PAGE_SIZE;\n\n public readonly paginatorConfig: CarbonPaginatorConfig = {\n itemsPerPageOptions: [DEFAULT_PAGE_SIZE],\n showPageInput: false,\n };\n\n public levelItems: Partial<ListItem>[] = [];\n public sourceItems: Partial<ListItem>[] = [];\n\n private _levelFilter = '';\n private _sourceFilter = '';\n\n private readonly _externalPluginService = inject(ExternalPluginService);\n private readonly _iconService = inject(IconService);\n private readonly _cdr = inject(ChangeDetectorRef);\n private readonly _translateService = inject(TranslateService);\n\n constructor() {\n this._iconService.register(Close16);\n }\n\n public get pagination(): Pagination {\n return {\n page: this.page,\n size: this.pageSize,\n collectionSize: this._$totalElements(),\n };\n }\n\n public ngOnChanges(changes: SimpleChanges): void {\n if (changes['open'] && this.open && this.configurationId) {\n this._initFields();\n this._resetFilters();\n this.$selectedRow.set(null);\n this._loadLogs();\n }\n }\n\n public onClose(): void {\n this.closeModal.emit();\n }\n\n public onPaginationClicked(page: number): void {\n this.page = page;\n this._loadLogs();\n }\n\n public onRowClicked(row: PluginLogEntry): void {\n this.$selectedRow.set(row);\n this._cdr.markForCheck();\n }\n\n public onLevelSelected(event: {item: {value: string}}): void {\n this._levelFilter = event?.item?.value ?? '';\n this.page = 1;\n this._loadLogs();\n }\n\n public onSourceSelected(event: {item: {value: string}}): void {\n this._sourceFilter = event?.item?.value ?? '';\n this.page = 1;\n this._loadLogs();\n }\n\n public closeDetail(): void {\n this.$selectedRow.set(null);\n }\n\n public levelTagType(level: string): string {\n switch (level) {\n case 'info':\n return 'blue';\n case 'warn':\n return 'warm-gray';\n case 'error':\n return 'red';\n case 'debug':\n return 'cool-gray';\n default:\n return 'warm-gray';\n }\n }\n\n public sourceTagType(source: string): string {\n switch (source) {\n case 'plugin':\n return 'purple';\n case 'gzac_api':\n return 'teal';\n case 'http_request':\n return 'cyan';\n default:\n return 'warm-gray';\n }\n }\n\n public formatData(data: unknown): string {\n if (!data) return '';\n return JSON.stringify(data, null, 2);\n }\n\n private _resetFilters(): void {\n this._levelFilter = '';\n this._sourceFilter = '';\n this.page = 1;\n this.pageSize = DEFAULT_PAGE_SIZE;\n\n // Built with `instant` since the items are rebuilt on every modal open, mirroring how other\n // list items in this library are translated.\n this.levelItems = [\n {\n content: this._translateService.instant('pluginManagement.logs.filterAll'),\n selected: true,\n value: '',\n },\n {\n content: this._translateService.instant('pluginManagement.logs.levels.info'),\n selected: false,\n value: 'info',\n },\n {\n content: this._translateService.instant('pluginManagement.logs.levels.warn'),\n selected: false,\n value: 'warn',\n },\n {\n content: this._translateService.instant('pluginManagement.logs.levels.error'),\n selected: false,\n value: 'error',\n },\n {\n content: this._translateService.instant('pluginManagement.logs.levels.debug'),\n selected: false,\n value: 'debug',\n },\n ];\n\n this.sourceItems = [\n {\n content: this._translateService.instant('pluginManagement.logs.filterAll'),\n selected: true,\n value: '',\n },\n {\n content: this._translateService.instant('pluginManagement.logs.sources.plugin'),\n selected: false,\n value: 'plugin',\n },\n {\n content: this._translateService.instant('pluginManagement.logs.sources.gzacApi'),\n selected: false,\n value: 'gzac_api',\n },\n {\n content: this._translateService.instant('pluginManagement.logs.sources.httpRequest'),\n selected: false,\n value: 'http_request',\n },\n ];\n }\n\n private _initFields(): void {\n this.fields = [\n {\n key: 'createdAt',\n label: 'pluginManagement.logs.columns.timestamp',\n viewType: ViewType.TEMPLATE,\n template: this.timestampTpl,\n },\n {\n key: 'level',\n label: 'pluginManagement.logs.columns.level',\n viewType: ViewType.TEMPLATE,\n template: this.levelTpl,\n },\n {\n key: 'source',\n label: 'pluginManagement.logs.columns.source',\n viewType: ViewType.TEMPLATE,\n template: this.sourceTpl,\n },\n {key: 'message', label: 'pluginManagement.logs.columns.message', viewType: ViewType.TEXT},\n ];\n }\n\n private _loadLogs(): void {\n if (!this.configurationId) return;\n this.$loading.set(true);\n this._externalPluginService\n .getConfigurationLogs(this.configurationId, {\n page: this.page - 1,\n size: this.pageSize,\n level: this._levelFilter || undefined,\n source: this._sourceFilter || undefined,\n })\n .subscribe({\n next: result => {\n this.$rows.set(result.content);\n this._$totalElements.set(result.totalElements);\n this.$loading.set(false);\n },\n error: () => {\n this.$rows.set([]);\n this._$totalElements.set(0);\n this.$loading.set(false);\n },\n });\n }\n}\n","<!--\n ~ Copyright 2015-2026 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (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 ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\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<cds-modal *ngIf=\"open\" [open]=\"open\" size=\"lg\" valtimoCdsModal>\n <cds-modal-header (closeSelect)=\"onClose()\">\n {{ 'pluginManagement.logs.title' | translate }} — {{ configurationTitle }}\n </cds-modal-header>\n\n <section cdsModalContent>\n <div class=\"plugin-log-modal__filters\" cdsLayer=\"1\">\n <cds-dropdown\n class=\"plugin-log-modal__filter\"\n [label]=\"'pluginManagement.logs.columns.level' | translate\"\n [placeholder]=\"'pluginManagement.logs.filterAll' | translate\"\n [appendInline]=\"true\"\n (selected)=\"onLevelSelected($event)\"\n >\n <cds-dropdown-list [items]=\"levelItems\"></cds-dropdown-list>\n </cds-dropdown>\n\n <cds-dropdown\n class=\"plugin-log-modal__filter\"\n [label]=\"'pluginManagement.logs.columns.source' | translate\"\n [placeholder]=\"'pluginManagement.logs.filterAll' | translate\"\n [appendInline]=\"true\"\n (selected)=\"onSourceSelected($event)\"\n >\n <cds-dropdown-list [items]=\"sourceItems\"></cds-dropdown-list>\n </cds-dropdown>\n </div>\n\n <div class=\"plugin-log-modal__layout\">\n <div\n class=\"plugin-log-modal__list\"\n [class.plugin-log-modal__list--with-detail]=\"$selectedRow()\"\n >\n <valtimo-carbon-list\n [items]=\"$rows()\"\n [fields]=\"fields\"\n [loading]=\"$loading()\"\n [pagination]=\"pagination\"\n [header]=\"false\"\n [hideToolbar]=\"true\"\n [cdsLayer]=\"1\"\n [paginatorConfig]=\"paginatorConfig\"\n paginationIdentifier=\"pluginLogs\"\n (paginationClicked)=\"onPaginationClicked($event)\"\n (rowClicked)=\"onRowClicked($event)\"\n >\n <valtimo-no-results\n [title]=\"'pluginManagement.logs.empty' | translate\"\n ></valtimo-no-results>\n </valtimo-carbon-list>\n </div>\n\n @if ($selectedRow(); as row) {\n <aside class=\"plugin-log-modal__detail\" cdsLayer=\"2\">\n <div class=\"plugin-log-modal__detail-header\">\n <cds-tag size=\"sm\" [type]=\"levelTagType(row.level)\">{{ row.level }}</cds-tag>\n <cds-tag size=\"sm\" [type]=\"sourceTagType(row.source)\">{{ row.source }}</cds-tag>\n <span class=\"plugin-log-modal__detail-timestamp\">\n {{ row.createdAt | date: 'dd-MM-yyyy HH:mm:ss' }}\n </span>\n <button\n class=\"plugin-log-modal__close-btn\"\n cdsButton=\"ghost\"\n iconOnly=\"true\"\n size=\"sm\"\n (click)=\"closeDetail()\"\n >\n <svg cdsIcon=\"close\" size=\"16\"></svg>\n </button>\n </div>\n\n <h6 class=\"cds--type-label-01 plugin-log-modal__detail-label\">\n {{ 'pluginManagement.logs.columns.message' | translate }}\n </h6>\n <pre class=\"plugin-log-modal__detail-message\">{{ row.message }}</pre>\n\n @if (row.data) {\n <h6 class=\"cds--type-label-01 plugin-log-modal__detail-label\">\n {{ 'pluginManagement.logs.data' | translate }}\n </h6>\n <pre class=\"plugin-log-modal__detail-json\">{{ formatData(row.data) }}</pre>\n }\n </aside>\n }\n </div>\n </section>\n\n <cds-modal-footer>\n <button cdsButton=\"ghost\" [attr.modal-primary-focus]=\"true\" (click)=\"onClose()\">\n {{ 'pluginManagement.logs.close' | translate }}\n </button>\n </cds-modal-footer>\n</cds-modal>\n\n<ng-template #timestampTpl let-data=\"data\">\n {{ data.item.createdAt | date: 'dd-MM HH:mm:ss' }}\n</ng-template>\n\n<ng-template #levelTpl let-data=\"data\">\n <cds-tag size=\"sm\" [type]=\"levelTagType(data.item.level)\">{{ data.item.level }}</cds-tag>\n</ng-template>\n\n<ng-template #sourceTpl let-data=\"data\">\n <cds-tag size=\"sm\" [type]=\"sourceTagType(data.item.source)\">{{ data.item.source }}</cds-tag>\n</ng-template>\n","/*\n * Copyright 2015-2026 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (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 * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\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 {\n ChangeDetectionStrategy,\n Component,\n EventEmitter,\n Input,\n OnDestroy,\n OnInit,\n Output,\n signal,\n} from '@angular/core';\nimport {CommonModule} from '@angular/common';\nimport {FormControl, FormGroup, ReactiveFormsModule, Validators} from '@angular/forms';\nimport {TranslateModule} from '@ngx-translate/core';\nimport {LoadingModule} from 'carbon-components-angular';\nimport {Subscription} from 'rxjs';\nimport {map, switchMap} from 'rxjs/operators';\nimport {\n ExternalPluginDefinition,\n ExternalPluginGrantedEndpointEntry,\n ExternalPluginGrantedEventEntry,\n ExternalPluginIframeComponent,\n ExternalPluginEndpoint,\n ExternalPluginService,\n extractExternalDefinitionId,\n isExternalPluginKey,\n} from '@valtimo/plugin';\nimport {PluginManagementStateService} from '../../services';\nimport {deriveExternalPluginEgressOrigins} from '../../utils';\n\ninterface ExternalPluginSaveEvent {\n definitionId: string;\n title: string;\n properties: Record<string, unknown>;\n grantedEndpoints: Array<ExternalPluginGrantedEndpointEntry>;\n grantedEvents: Array<ExternalPluginGrantedEventEntry>;\n grantedCapabilities: Array<string>;\n grantedEgress: Array<string>;\n}\n\n/**\n * The \"enter data\" step for an external plugin configuration: the plugin's own config bundle in an\n * iframe when it ships one, a title + JSON properties fallback otherwise.\n *\n * Works in two modes:\n * - Bound to {@link PluginManagementStateService} (the plugins page add modal): the definition\n * follows the selected plugin and saving is triggered through the state service's `save$`.\n * - Standalone via the `definitionId` input (the app add stepper): the definition is loaded\n * directly and saving is triggered imperatively through {@link triggerSave}.\n */\n@Component({\n standalone: true,\n selector: 'valtimo-plugin-external-configure',\n templateUrl: './plugin-external-configure.component.html',\n styleUrls: ['./plugin-external-configure.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n CommonModule,\n ReactiveFormsModule,\n TranslateModule,\n LoadingModule,\n ExternalPluginIframeComponent,\n ],\n})\nexport class PluginExternalConfigureComponent implements OnInit, OnDestroy {\n /** When set, configures this definition directly instead of the state service's selection. */\n @Input() public definitionId: string | null = null;\n\n @Output() public validEvent = new EventEmitter<boolean>();\n @Output() public saveEvent = new EventEmitter<ExternalPluginSaveEvent>();\n @Output() public endpointsResolved = new EventEmitter<Array<ExternalPluginEndpoint>>();\n @Output() public eventSubscriptionsResolved = new EventEmitter<Array<string>>();\n @Output() public capabilitiesResolved = new EventEmitter<Array<string>>();\n @Output() public egressResolved = new EventEmitter<Array<string>>();\n /**\n * The origins GZAC will derive from the configuration values entered on this step, recomputed as\n * they change. Not a grant — the admin supplying the URL is the grant — but the permissions step\n * shows them so the full destination set is visible before activation.\n */\n @Output() public derivedEgressResolved = new EventEmitter<Array<string>>();\n\n public readonly $configBundleUrl = signal<string | null>(null);\n public readonly $loading = signal(true);\n\n public readonly _form = new FormGroup({\n title: new FormControl('', Validators.required),\n properties: new FormControl('{}'),\n });\n\n private _definitionId: string | null = null;\n private _iframeConfigTitle: string = '';\n private _iframeConfigData: Record<string, unknown> | null = null;\n private _grantedEndpoints: Array<ExternalPluginGrantedEndpointEntry> = [];\n private _grantedEvents: Array<ExternalPluginGrantedEventEntry> = [];\n private _grantedCapabilities: Array<string> = [];\n private _grantedEgress: Array<string> = [];\n private _configurationSchema: unknown = null;\n private readonly _subscriptions = new Subscription();\n\n constructor(\n private readonly _stateService: PluginManagementStateService,\n private readonly _externalPluginService: ExternalPluginService\n ) {}\n\n public ngOnInit(): void {\n if (this.definitionId) {\n this._definitionId = this.definitionId;\n this.$loading.set(true);\n this._externalPluginService\n .getDefinition(this.definitionId)\n .subscribe(definition => this._applyDefinition(definition));\n } else {\n this._subscriptions.add(\n this._stateService.selectedPluginDefinition$\n .pipe(\n switchMap(def => {\n if (!def?.key || !isExternalPluginKey(def.key)) {\n this._definitionId = null;\n this.$configBundleUrl.set(null);\n this.$loading.set(false);\n this.endpointsResolved.emit([]);\n this.eventSubscriptionsResolved.emit([]);\n this.capabilitiesResolved.emit([]);\n this.egressResolved.emit([]);\n this.derivedEgressResolved.emit([]);\n this._configurationSchema = null;\n return [];\n }\n\n this._definitionId = extractExternalDefinitionId(def.key);\n this.$loading.set(true);\n\n return this._externalPluginService\n .getDefinition(this._definitionId)\n .pipe(map(definition => this._applyDefinition(definition)));\n })\n )\n .subscribe()\n );\n\n // Only the state-service-driven mode saves through `save$` — an instance embedded via\n // `definitionId` must not react to the plugins page's save trigger.\n this._subscriptions.add(this._stateService.save$.subscribe(() => this._onSaveTriggered()));\n }\n\n this._subscriptions.add(this._form.valueChanges.subscribe(() => this._validateForm()));\n }\n\n public ngOnDestroy(): void {\n this._subscriptions.unsubscribe();\n }\n\n /** Imperative save trigger for the `definitionId` mode (mirrors the state service's `save$`). */\n public triggerSave(): void {\n this._onSaveTriggered();\n }\n\n public onIframeConfigurationChanged(event: {\n valid: boolean;\n title: string;\n data: Record<string, unknown>;\n }): void {\n this._iframeConfigTitle = event.title;\n this._iframeConfigData = event.data;\n this._emitDerivedEgress(event.data);\n this.validEvent.emit(event.valid);\n }\n\n public setGrantedEndpoints(endpoints: Array<ExternalPluginGrantedEndpointEntry>): void {\n this._grantedEndpoints = endpoints;\n }\n\n public setGrantedEvents(events: Array<ExternalPluginGrantedEventEntry>): void {\n this._grantedEvents = events;\n }\n\n public setGrantedCapabilities(caps: Array<string>): void {\n this._grantedCapabilities = caps;\n }\n\n public setGrantedEgress(targets: Array<string>): void {\n this._grantedEgress = targets;\n }\n\n private _applyDefinition(definition: ExternalPluginDefinition): void {\n const configBundle = definition.manifest?.frontendBundles?.find(b => b.type === 'config');\n\n if (configBundle) {\n this.$configBundleUrl.set(`${definition.baseUrl}/${definition.version}${configBundle.path}`);\n } else {\n this.$configBundleUrl.set(null);\n }\n\n const endpoints = definition.manifest?.permissions?.endpoints ?? [];\n this.endpointsResolved.emit(endpoints);\n const eventSubscriptions = definition.manifest?.eventSubscriptions ?? [];\n this.eventSubscriptionsResolved.emit(eventSubscriptions);\n const capabilities = definition.manifest?.permissions?.capabilities ?? [];\n this.capabilitiesResolved.emit(capabilities);\n const egress = definition.manifest?.permissions?.egress ?? [];\n this._grantedEgress = [...egress];\n this.egressResolved.emit(egress);\n // Kept so the derived destinations can be recomputed whenever the configuration values\n // change, without re-fetching the definition.\n this._configurationSchema = definition.configurationSchema;\n this._emitDerivedEgress(null);\n\n this.$loading.set(false);\n }\n\n private _emitDerivedEgress(properties: Record<string, unknown> | null): void {\n this.derivedEgressResolved.emit(\n deriveExternalPluginEgressOrigins(this._configurationSchema, properties)\n );\n }\n\n private _validateForm(): void {\n if (this.$configBundleUrl()) return;\n\n const titleValid = !!this._form.value.title?.trim();\n let jsonValid = true;\n let parsed: Record<string, unknown> | null = null;\n const props = this._form.value.properties?.trim();\n if (props) {\n try {\n parsed = JSON.parse(props) as Record<string, unknown>;\n } catch {\n jsonValid = false;\n }\n }\n // The raw-JSON fallback (no config bundle) feeds the same derivation as the iframe path.\n if (jsonValid) this._emitDerivedEgress(parsed);\n this.validEvent.emit(titleValid && jsonValid);\n }\n\n private _onSaveTriggered(): void {\n if (!this._definitionId) return;\n\n if (this._iframeConfigData) {\n this.saveEvent.emit({\n definitionId: this._definitionId,\n title: this._iframeConfigTitle,\n properties: this._iframeConfigData,\n grantedEndpoints: this._grantedEndpoints,\n grantedEvents: this._grantedEvents,\n grantedCapabilities: this._grantedCapabilities,\n grantedEgress: this._grantedEgress,\n });\n return;\n }\n\n const title = this._form.value.title?.trim() ?? '';\n let properties: Record<string, unknown> = {};\n const propsStr = this._form.value.properties?.trim();\n if (propsStr) {\n try {\n properties = JSON.parse(propsStr);\n } catch {\n return;\n }\n }\n\n this.saveEvent.emit({\n definitionId: this._definitionId,\n title,\n properties,\n grantedEndpoints: this._grantedEndpoints,\n grantedEvents: this._grantedEvents,\n grantedCapabilities: this._grantedCapabilities,\n grantedEgress: this._grantedEgress,\n });\n }\n}\n","<!--\n ~ Copyright 2015-2026 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (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 ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\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<cds-loading *ngIf=\"$loading()\" [isActive]=\"true\" size=\"sm\"></cds-loading>\n\n<ng-container *ngIf=\"!$loading()\">\n <ng-container *ngIf=\"$configBundleUrl() as bundleUrl; else jsonFallback\">\n <valtimo-external-plugin-iframe\n [bundleUrl]=\"bundleUrl\"\n [autoHeight]=\"true\"\n (configurationChangedEvent)=\"onIframeConfigurationChanged($event)\"\n ></valtimo-external-plugin-iframe>\n </ng-container>\n\n <ng-template #jsonFallback>\n <form [formGroup]=\"_form\">\n <div class=\"cds--form-item\">\n <label class=\"cds--label\">{{\n 'pluginManagement.labels.configurationName' | translate\n }}</label>\n <input class=\"cds--text-input\" formControlName=\"title\" />\n </div>\n\n <div class=\"cds--form-item\">\n <label class=\"cds--label\">{{ 'pluginManagement.labels.properties' | translate }}</label>\n <textarea class=\"cds--text-area\" formControlName=\"properties\" rows=\"10\"></textarea>\n </div>\n </form>\n </ng-template>\n</ng-container>\n","/*\n * Copyright 2015-2026 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (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 * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\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 {Component, Input, OnDestroy, OnInit} from '@angular/core';\nimport {TranslateService} from '@ngx-translate/core';\nimport {BehaviorSubject, combineLatest, distinctUntilChanged, Observable, Subscription} from 'rxjs';\nimport {map} from 'rxjs/operators';\nimport {PluginManagementStateService} from '../../services';\nimport {UnifiedPluginDefinition} from '../../models';\nimport {\n ExternalPluginDefinition,\n getExternalPluginDescription,\n getExternalPluginDisplayName,\n PluginDefinition,\n PluginManagementService,\n toExternalPluginKey,\n PLUGIN_CATALOG_TEST_IDS,\n} from '@valtimo/plugin';\nimport {isEqual} from 'lodash';\n\n@Component({\n standalone: false,\n selector: 'valtimo-plugin-add-select',\n templateUrl: './plugin-add-select.component.html',\n styleUrls: ['./plugin-add-select.component.scss'],\n})\nexport class PluginAddSelectComponent implements OnInit, OnDestroy {\n @Input() set externalDefinitions(value: ExternalPluginDefinition[] | null) {\n this._externalDefs$.next(value ?? []);\n }\n\n public readonly selectedPluginDefinition$ = this._stateService.selectedPluginDefinition$;\n public readonly disabled$ = this._stateService.inputDisabled$;\n public readonly testIds = PLUGIN_CATALOG_TEST_IDS;\n\n private readonly _externalDefs$ = new BehaviorSubject<ExternalPluginDefinition[]>([]);\n\n public readonly allDefinitions$: Observable<UnifiedPluginDefinition[] | undefined> =\n combineLatest([\n this._stateService.pluginDefinitionsWithLogos$,\n this._externalDefs$,\n this._translateService.stream('key'),\n ]).pipe(\n map(([embedded, external]) => {\n if (!embedded) return undefined;\n\n const lang = this._translateService.currentLang;\n const externalDefs: UnifiedPluginDefinition[] = external.map(def => ({\n key: toExternalPluginKey(def.id),\n title: getExternalPluginDisplayName(def, lang),\n description: getExternalPluginDescription(def, lang),\n source: 'external',\n externalDefinitionId: def.id,\n externalName: getExternalPluginDisplayName(def, lang),\n externalDescription: getExternalPluginDescription(def, lang),\n externalLogoUrl: def.logoUrl,\n }));\n\n return [\n ...embedded.map(d => ({...d, source: 'embedded'} as UnifiedPluginDefinition)),\n ...externalDefs,\n ];\n }),\n distinctUntilChanged((prev, curr) => isEqual(prev, curr))\n );\n\n private readonly _subscriptions = new Subscription();\n\n constructor(\n private readonly _pluginManagementService: PluginManagementService,\n private readonly _stateService: PluginManagementStateService,\n private readonly _translateService: TranslateService\n ) {}\n\n public ngOnInit(): void {\n this._openRefreshSubscription();\n this._getPluginDefinitions();\n }\n\n public ngOnDestroy(): void {\n this._subscriptions.unsubscribe();\n }\n\n public selectPluginDefinition(event: {value: PluginDefinition}): void {\n this._stateService.selectPluginDefinition(event.value);\n }\n\n public deselectPluginDefinition(): void {\n this._stateService.clearSelectedPluginDefinition();\n }\n\n private _getPluginDefinitions(): void {\n this._pluginManagementService.getPluginDefinitions().subscribe(pluginDefinitions => {\n this._stateService.setPluginDefinitions(pluginDefinitions);\n });\n }\n\n private _openRefreshSubscription(): void {\n this._subscriptions.add(\n combineLatest([\n this._stateService.showModal$,\n this._stateService.refresh$,\n ]).subscribe(() => {\n this._stateService.clearSelectedPluginDefinition();\n })\n );\n }\n}\n","<!--\n ~ Copyright 2015-2026 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (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 ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\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=\"allDefinitions$ | async as pluginDefinitions; else loading\">\n <div class=\"plugin-definition__grid\" [attr.data-test-id]=\"testIds.tileGrid\">\n <ng-container\n *ngTemplateOutlet=\"pluginDefinitionsTemplate; context: {pluginDefinitions: pluginDefinitions}\"\n ></ng-container>\n <ng-container\n *ngTemplateOutlet=\"\n noPluginDefinitionsTemplate;\n context: {pluginDefinitions: pluginDefinitions}\n \"\n ></ng-container>\n </div>\n</ng-container>\n\n<ng-template #noPluginDefinitionsTemplate let-pluginDefinitions=\"pluginDefinitions\">\n <div *ngIf=\"pluginDefinitions?.length === 0\" class=\"plugin-definition__no-results\">\n <v-paragraph [center]=\"true\" [fullWidth]=\"true\">{{\n 'pluginManagement.noDefinitions' | translate\n }}</v-paragraph>\n </div>\n</ng-template>\n\n<ng-template #pluginDefinitionsTemplate let-pluginDefinitions=\"pluginDefinitions\">\n <cds-tile-group [multiple]=\"false\" (selected)=\"selectPluginDefinition($event)\" [cdsLayer]=\"1\">\n <cds-selection-tile\n *ngFor=\"let pluginDefinition of pluginDefinitions\"\n [value]=\"pluginDefinition\"\n [selected]=\"(selectedPluginDefinition$ | async)?.key === pluginDefinition.key\"\n >\n <ng-container *ngIf=\"pluginDefinition.source !== 'external'; else externalTile\">\n <img\n class=\"plugin-definition-logo\"\n [title]=\"'title' | pluginTranslate: pluginDefinition.key | async\"\n [src]=\"pluginDefinition.pluginLogoBase64\"\n [attr.data-test-id]=\"testIds.tileLogo\"\n />\n\n <h5 [attr.data-test-id]=\"testIds.tileTitle\">\n {{ 'title' | pluginTranslate: pluginDefinition.key | async }}\n </h5>\n\n <p [attr.data-test-id]=\"testIds.tileDescription\">\n {{ 'description' | pluginTranslate: pluginDefinition.key | async }}\n </p>\n </ng-container>\n\n <ng-template #externalTile>\n <img\n *ngIf=\"pluginDefinition.externalLogoUrl; else externalPlaceholderLogo\"\n class=\"plugin-definition-logo\"\n [src]=\"pluginDefinition.externalLogoUrl\"\n [title]=\"pluginDefinition.externalName ?? ''\"\n [attr.data-test-id]=\"testIds.tileLogo\"\n alt=\"\"\n />\n\n <ng-template #externalPlaceholderLogo>\n <div class=\"plugin-definition-logo plugin-definition-logo--external\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"32\" height=\"32\" viewBox=\"0 0 32 32\" fill=\"currentColor\">\n <path d=\"M25.7 9.3l-2.8-2.8c-.4-.4-1-.4-1.4 0L17 11l-3-3-1.4 1.4 3 3-5.6 5.6-3-3L5.6 16.4l3 3L6 22l-.7.7c-.4.4-.4 1 0 1.4l2.8 2.8c.2.2.5.3.7.3s.5-.1.7-.3L10 26l2.6-2.6 3 3 1.4-1.4-3-3 5.6-5.6 3 3 1.4-1.4-3-3L25.5 11l.7-.7c.4-.4.4-1-.1-1.4zM9.4 25l-1.8-1.8L9 21.8l1.8 1.8L9.4 25zm3.2-3.2L10.8 20 16.4 14.4l1.8 1.8-5.6 5.6zm11-11l-1.8 1.8-1.8-1.8 1.8-1.8 1.8 1.8z\"/>\n </svg>\n </div>\n </ng-template>\n\n <h5 [attr.data-test-id]=\"testIds.tileTitle\">\n {{ pluginDefinition.externalName }}\n </h5>\n\n <p [attr.data-test-id]=\"testIds.tileDescription\">\n {{ pluginDefinition.externalDescription }}\n </p>\n </ng-template>\n </cds-selection-tile>\n </cds-tile-group>\n</ng-template>\n\n<ng-template #loading>\n <div class=\"plugin-definition__grid\">\n <ng-container *ngTemplateOutlet=\"loadingCard\"></ng-container>\n <ng-container *ngTemplateOutlet=\"loadingCard\"></ng-container>\n <ng-container *ngTemplateOutlet=\"loadingCard\"></ng-container>\n </div>\n</ng-template>\n\n<ng-template #loadingCard>\n <div class=\"plugin-definition__item\">\n <cds-loading size=\"sm\"></cds-loading>\n </div>\n</ng-template>\n","/*\n * Copyright 2015-2025 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (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 * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\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 {Component, EventEmitter, Input, Output} from '@angular/core';\nimport {map, switchMap} from 'rxjs/operators';\nimport {PluginManagementStateService} from '../../services';\nimport {PluginConfigurationData} from '@valtimo/plugin';\nimport {of} from 'rxjs';\n\n@Component({\n standalone: false,\n selector: 'valtimo-plugin-configure',\n templateUrl: './plugin-configure.component.html',\n styleUrls: ['./plugin-configure.component.scss'],\n})\nexport class PluginConfigureComponent {\n @Output() valid: EventEmitter<boolean> = new EventEmitter<boolean>();\n @Output() configuration: EventEmitter<PluginConfigurationData> =\n new EventEmitter<PluginConfigurationData>();\n\n public readonly save$ = this.stateService.save$;\n\n public readonly pluginDefinitionKey$ = this.stateService.selectedPluginDefinition$.pipe(\n map(definition => definition?.key)\n );\n\n public readonly prefillConfiguration$ = of(undefined);\n\n public readonly disabled$ = this.stateService.inputDisabled$;\n\n constructor(private readonly stateService: PluginManagementStateService) {}\n\n public onValid(valid: boolean): void {\n this.valid.emit(valid);\n }\n\n public onFunctionConfiguration(configuration: PluginConfigurationData): void{\n this.configuration.emit(configuration);\n }\n}\n","<!--\n ~ Copyright 2015-2025 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (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 ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\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<valtimo-plugin-configuration-container\n *ngIf=\"pluginDefinitionKey$ | async as pluginDefinitionKey\"\n [cdsLayer]=\"1\"\n [pluginDefinitionKey]=\"pluginDefinitionKey\"\n [prefillConfiguration$]=\"prefillConfiguration$\"\n [save$]=\"save$\"\n [disabled$]=\"disabled$\"\n (valid)=\"onValid($event)\"\n (configuration)=\"onFunctionConfiguration($event)\"\n type=\"configuration\"\n></valtimo-plugin-configuration-container>\n","/*\n * Copyright 2015-2026 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (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 * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\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 {Component, EventEmitter, Input, OnDestroy, Output, ViewChild} from '@angular/core';\nimport {PluginManagementStateService} from '../../services';\nimport {map, take} from 'rxjs/operators';\nimport {BehaviorSubject, combineLatest, Observable, Subscription} from 'rxjs';\nimport {\n ExternalPluginDefinition,\n ExternalPluginGrantedEndpointEntry,\n ExternalPluginGrantedEventEntry,\n ExternalPluginEndpoint,\n ExternalPluginService,\n extractExternalDefinitionId,\n isExternalPluginDefinitionIncompatible,\n isExternalPluginKey,\n PluginConfigurationData,\n PluginManagementService,\n} from '@valtimo/plugin';\nimport {PluginExternalConfigureComponent} from '../plugin-external-configure/plugin-external-configure.component';\nimport {NGXLogger} from 'ngx-logger';\nimport {CARBON_CONSTANTS} from '@valtimo/components';\nimport {TranslateService} from '@ngx-translate/core';\nimport {buildExternalPluginCompatibilityMessage} from '../../utils';\n\n@Component({\n standalone: false,\n selector: 'valtimo-plugin-add-modal',\n templateUrl: './plugin-add-modal.component.html',\n styleUrls: ['./plugin-add-modal.component.scss'],\n})\nexport class PluginAddModalComponent implements OnDestroy {\n /**\n * Opening with a plugin already selected — the \"Configure plugin\" action on the upload\n * notification does exactly that — skips the choose-a-plugin step and lands on the configuration\n * form, which is the whole point of that shortcut.\n */\n @Input() public set open(value: boolean) {\n const wasOpen = this._open;\n this._open = value;\n if (value && !wasOpen) this._skipSelectStepWhenPreselected();\n }\n public get open(): boolean {\n return this._open;\n }\n\n @Input() public set externalDefinitions(value: ExternalPluginDefinition[] | null) {\n this._externalDefinitions = value;\n this._externalDefinitions$.next(value ?? []);\n }\n public get externalDefinitions(): ExternalPluginDefinition[] | null {\n return this._externalDefinitions;\n }\n\n @Output() public closeModal = new EventEmitter<boolean>();\n\n public readonly inputDisabled$ = this._stateService.inputDisabled$;\n public readonly selectedPluginDefinition$ = this._stateService.selectedPluginDefinition$;\n public readonly configurationValid$ = new BehaviorSubject<boolean>(false);\n\n private _open = false;\n private _externalDefinitions: ExternalPluginDefinition[] | null = null;\n private readonly _externalDefinitions$ = new BehaviorSubject<ExternalPluginDefinition[]>([]);\n\n public readonly isExternalPlugin$: Observable<boolean> = this.selectedPluginDefinition$.pipe(\n map(def => isExternalPluginKey(def?.key))\n );\n\n /**\n * The localized compatibility warning to show on the configure step, or null when the selected\n * plugin is embedded, compatible, or not yet chosen. Recomputed on language change so the message\n * stays localized.\n */\n public readonly incompatibleWarning$: Observable<string | null> = combineLatest([\n this.selectedPluginDefinition$,\n this._externalDefinitions$,\n this._translateService.stream('key'),\n ]).pipe(\n map(([selected, definitions]) => {\n if (!selected || !isExternalPluginKey(selected.key)) return null;\n const definition = definitions.find(d => d.id === extractExternalDefinitionId(selected.key));\n if (!isExternalPluginDefinitionIncompatible(definition)) return null;\n return buildExternalPluginCompatibilityMessage(definition!, this._translateService);\n })\n );\n\n public readonly endpoints$ = new BehaviorSubject<\n Array<ExternalPluginEndpoint>\n >([]);\n public readonly eventSubscriptions$ = new BehaviorSubject<Array<string>>([]);\n public readonly capabilities$ = new BehaviorSubject<Array<string>>([]);\n public readonly egress$ = new BehaviorSubject<Array<string>>([]);\n public readonly derivedEgress$ = new BehaviorSubject<Array<string>>([]);\n public readonly permissionsValid$ = new BehaviorSubject<boolean>(false);\n\n public currentStepIndex = 0;\n public isExternal = false;\n public progressSteps: Array<{label: string; complete: boolean}> = [];\n\n @ViewChild(PluginExternalConfigureComponent)\n private _externalConfigureComponent: PluginExternalConfigureComponent | undefined;\n\n private readonly _subscriptions = new Subscription();\n\n constructor(\n private readonly _stateService: PluginManagementStateService,\n private readonly _pluginManagementService: PluginManagementService,\n private readonly _externalPluginService: ExternalPluginService,\n private readonly _logger: NGXLogger,\n private readonly _translateService: TranslateService\n ) {\n this._buildProgressSteps();\n this._subscriptions.add(\n this._translateService.onLangChange.subscribe(() => this._buildProgressSteps())\n );\n this._subscriptions.add(\n this.isExternalPlugin$.subscribe(isExternal => {\n this.isExternal = isExternal;\n this._buildProgressSteps();\n })\n );\n }\n\n ngOnDestroy(): void {\n this._subscriptions.unsubscribe();\n }\n\n /**\n * Lands on the configuration step when the modal is opened while a plugin is already selected.\n * The step count itself is already right by now: `isExternal` is kept in sync from the\n * constructor's `isExternalPlugin$` subscription, which fires synchronously off the selection.\n */\n private _skipSelectStepWhenPreselected(): void {\n this.selectedPluginDefinition$\n .pipe(take(1))\n .subscribe(definition => {\n if (definition) this.currentStepIndex = 1;\n });\n }\n\n public goToNextStep(): void {\n if (this.currentStepIndex < this.progressSteps.length - 1) {\n this.currentStepIndex++;\n }\n }\n\n public complete(): void {\n this._stateService.save();\n }\n\n public hide(): void {\n this.closeModal.emit();\n\n setTimeout(() => {\n this.currentStepIndex = 0;\n this.isExternal = false;\n this._stateService.enableInput();\n this._stateService.clear();\n this.configurationValid$.next(false);\n this.endpoints$.next([]);\n this.eventSubscriptions$.next([]);\n this.capabilities$.next([]);\n this.permissionsValid$.next(false);\n this._buildProgressSteps();\n }, CARBON_CONSTANTS.modalAnimationMs);\n }\n\n public onValid(valid: boolean): void {\n this.configurationValid$.next(valid);\n }\n\n public onConfiguration(configuration: PluginConfigurationData): void {\n const pluginConfiguration = {...configuration};\n delete pluginConfiguration['configurationId'];\n delete pluginConfiguration['configurationTitle'];\n\n this._stateService.disableInput();\n\n this._stateService.selectedPluginDefinition$.pipe(take(1)).subscribe(selectedDefinition => {\n this._pluginManagementService\n .savePluginConfiguration({\n id: configuration.configurationId,\n definitionKey: selectedDefinition.key,\n title: configuration.configurationTitle,\n properties: pluginConfiguration,\n })\n .subscribe({\n next: () => {\n this._stateService.refresh();\n this.hide();\n },\n error: () => {\n this._logger.error('Something went wrong with saving the plugin configuration.');\n this._stateService.enableInput();\n },\n });\n });\n }\n\n public onEndpointsResolved(\n endpoints: Array<ExternalPluginEndpoint>\n ): void {\n this.endpoints$.next(endpoints);\n this._recomputePermissionsValid();\n }\n\n public onEventSubscriptionsResolved(eventTypes: Array<string>): void {\n this.eventSubscriptions$.next(eventTypes);\n this._recomputePermissionsValid();\n }\n\n public onPermissionsValid(valid: boolean): void {\n this.permissionsValid$.next(valid);\n }\n\n public onGrantedEndpointsChange(endpoints: Array<ExternalPluginGrantedEndpointEntry>): void {\n this._externalConfigureComponent?.setGrantedEndpoints(endpoints);\n }\n\n public onGrantedEventsChange(events: Array<ExternalPluginGrantedEventEntry>): void {\n this._externalConfigureComponent?.setGrantedEvents(events);\n }\n\n public onCapabilitiesResolved(caps: Array<string>): void {\n this.capabilities$.next(caps);\n this._recomputePermissionsValid();\n }\n\n public onGrantedCapabilitiesChange(caps: Array<string>): void {\n this._externalConfigureComponent?.setGrantedCapabilities(caps);\n }\n\n public onEgressResolved(targets: Array<string>): void {\n this.egress$.next(targets);\n this._recomputePermissionsValid();\n }\n\n /**\n * Derived destinations don't gate the step — the admin already supplied them by typing the value —\n * so this only refreshes the display.\n */\n public onDerivedEgressResolved(targets: Array<string>): void {\n this.derivedEgress$.next(targets);\n }\n\n public onGrantedEgressChange(targets: Array<string>): void {\n this._externalConfigureComponent?.setGrantedEgress(targets);\n }\n\n public onExternalSave(event: {\n definitionId: string;\n title: string;\n properties: Record<string, unknown>;\n grantedEndpoints: Array<ExternalPluginGrantedEndpointEntry>;\n grantedEvents: Array<ExternalPluginGrantedEventEntry>;\n grantedCapabilities: Array<string>;\n grantedEgress: Array<string>;\n }): void {\n this._stateService.disableInput();\n\n this._externalPluginService\n .createConfiguration({\n definitionId: event.definitionId,\n title: event.title,\n properties: event.properties,\n grantedEndpoints: event.grantedEndpoints,\n grantedEvents: event.grantedEvents,\n grantedCapabilities: event.grantedCapabilities,\n grantedEgress: event.grantedEgress,\n })\n .subscribe({\n next: () => {\n this._stateService.refresh();\n this.hide();\n },\n error: () => {\n this._logger.error(\n 'Something went wrong with saving the external plugin configuration.'\n );\n this._stateService.enableInput();\n },\n });\n }\n\n /**\n * Permissions step starts valid (no acknowledgement required) only when the plugin declared nothing\n * to acknowledge — no endpoints, events, capabilities or manifest egress targets. The\n * acknowledgement otherwise gates the step.\n */\n private _recomputePermissionsValid(): void {\n const hasNothing = this.endpoints$.value.length === 0\n && this.eventSubscriptions$.value.length === 0\n && this.capabilities$.value.length === 0\n && this.egress$.value.length === 0;\n if (hasNothing) {\n this.permissionsValid$.next(true);\n }\n }\n\n /**\n * Carbon's progress indicator recomputes step completion only inside its `current` setter, so a\n * rebuilt steps array (language change, plugin-kind change) must carry the `complete` flags\n * itself — with an unchanged current step the rebuild would otherwise wipe the checkmarks.\n */\n private _buildProgressSteps(): void {\n const labels = [\n this._translateService.instant('pluginManagement.addSteps.step0'),\n this._translateService.instant('pluginManagement.addSteps.step1'),\n ];\n\n if (this.isExternal) {\n labels.push(this._translateService.instant('pluginManagement.addSteps.step2'));\n }\n\n this.progressSteps = labels.map((label, index) => ({\n label,\n complete: index < this.currentStepIndex,\n }));\n }\n}\n","<!--\n ~ Copyright 2015-2026 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (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 ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\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<cds-modal valtimoCdsModal [open]=\"open\" size=\"lg\" (close)=\"hide()\">\n <cds-modal-header [showCloseButton]=\"true\" (closeSelect)=\"hide()\">\n <h3 cdsModalHeaderHeading class=\"add-plugin-modal-header\">\n {{ 'pluginManagement.add' | translate }}\n </h3>\n\n <cds-progress-indicator\n [steps]=\"progressSteps\"\n [current]=\"currentStepIndex\"\n spacing=\"equal\"\n class=\"plugin-add-modal__progress\"\n ></cds-progress-indicator>\n </cds-modal-header>\n <section cdsModalContent [cdsLayer]=\"1\">\n <div [hidden]=\"currentStepIndex !== 0\">\n <valtimo-plugin-add-select [externalDefinitions]=\"externalDefinitions\"></valtimo-plugin-add-select>\n </div>\n\n <div [hidden]=\"currentStepIndex !== 1\">\n <cds-inline-notification\n *ngIf=\"incompatibleWarning$ | async as warning\"\n [notificationObj]=\"{\n type: 'warning',\n title: ('pluginManagement.compatibility.warningTitle' | translate),\n message: warning,\n showClose: false,\n lowContrast: true,\n }\"\n class=\"plugin-add-modal__compatibility-warning\"\n ></cds-inline-notification>\n\n <ng-container *ngIf=\"isExternalPlugin$ | async; else embeddedConfigure\">\n <valtimo-plugin-external-configure\n (endpointsResolved)=\"onEndpointsResolved($event)\"\n (eventSubscriptionsResolved)=\"onEventSubscriptionsResolved($event)\"\n (capabilitiesResolved)=\"onCapabilitiesResolved($event)\"\n (egressResolved)=\"onEgressResolved($event)\"\n (derivedEgressResolved)=\"onDerivedEgressResolved($event)\"\n (validEvent)=\"onValid($event)\"\n (saveEvent)=\"onExternalSave($event)\"\n ></valtimo-plugin-external-configure>\n </ng-container>\n\n <ng-template #embeddedConfigure>\n <valtimo-plugin-configure\n (valid)=\"onValid($event)\"\n (configuration)=\"onConfiguration($event)\"\n ></valtimo-plugin-configure>\n </ng-template>\n </div>\n\n <div *ngIf=\"isExternal\" [hidden]=\"currentStepIndex !== 2\">\n <valtimo-plugin-external-permissions\n [endpoints]=\"endpoints$ | async\"\n [eventSubscriptions]=\"eventSubscriptions$ | async\"\n [capabilities]=\"capabilities$ | async\"\n [egress]=\"egress$ | async\"\n [derivedEgress]=\"derivedEgress$ | async\"\n (validEvent)=\"onPermissionsValid($event)\"\n (grantedEndpointsChange)=\"onGrantedEndpointsChange($event)\"\n (grantedEventsChange)=\"onGrantedEventsChange($event)\"\n (grantedCapabilitiesChange)=\"onGrantedCapabilitiesChange($event)\"\n (grantedEgressChange)=\"onGrantedEgressChange($event)\"\n ></valtimo-plugin-external-permissions>\n </div>\n </section>\n <cds-modal-footer>\n <button cdsButton=\"ghost\" (click)=\"hide()\" [disabled]=\"inputDisabled$ | async\">\n {{ 'stepper.cancelButtonText' | translate }}\n </button>\n\n <button\n *ngIf=\"currentStepIndex === 0\"\n cdsButton=\"primary\"\n [disabled]=\"!(selectedPluginDefinition$ | async) || (inputDisabled$ | async)\"\n (click)=\"goToNextStep()\"\n >\n {{ 'pluginManagement.addSteps.step1' | translate }}\n </button>\n\n <button\n *ngIf=\"currentStepIndex === 1 && isExternal\"\n cdsButton=\"primary\"\n [disabled]=\"!(configurationValid$ | async) || (inputDisabled$ | async)\"\n (click)=\"goToNextStep()\"\n >\n {{ 'pluginManagement.addSteps.step2' | translate }}\n </button>\n\n <button\n *ngIf=\"currentStepIndex === 1 && !isExternal\"\n cdsButton=\"primary\"\n [disabled]=\"!(configurationValid$ | async) || (inputDisabled$ | async)\"\n (click)=\"complete()\"\n >\n {{ 'pluginManagement.addSteps.complete' | translate }}\n </button>\n\n <button\n *ngIf=\"currentStepIndex === 2 && isExternal\"\n cdsButton=\"primary\"\n [disabled]=\"!(permissionsValid$ | async) || (inputDisabled$ | async)\"\n (click)=\"complete()\"\n >\n {{ 'pluginManagement.addSteps.complete' | translate }}\n </button>\n </cds-modal-footer>\n</cds-modal>\n","/*\n * Copyright 2015-2025 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (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 * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\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 {Component, EventEmitter, Input, Output} from '@angular/core';\nimport {map, switchMap} from 'rxjs/operators';\nimport {PluginManagementStateService} from '../../services';\nimport {PluginConfigurationData} from '@valtimo/plugin';\n\n@Component({\n standalone: false,\n selector: 'valtimo-plugin-edit',\n templateUrl: './plugin-edit.component.html',\n styleUrls: ['./plugin-edit.component.scss'],\n})\nexport class PluginEditComponent {\n @Output() valid: EventEmitter<boolean> = new EventEmitter<boolean>();\n @Output() configuration: EventEmitter<PluginConfigurationData> =\n new EventEmitter<PluginConfigurationData>();\n\n public readonly saveEdit$ = this.stateService.saveEdit$;\n\n public readonly pluginDefinitionKey$ = this.stateService.selectedPluginConfiguration$.pipe(\n map(configuration => configuration?.pluginDefinition?.key)\n );\n\n public readonly prefillConfiguration$ = this.stateService.selectedPluginConfiguration$.pipe(\n map(configuration =>\n configuration\n ? {\n ...configuration.properties,\n configurationId: configuration.id,\n configurationTitle: configuration.title,\n }\n : undefined\n )\n );\n\n public readonly disabled$ = this.stateService.inputDisabled$;\n\n constructor(private readonly stateService: PluginManagementStateService) {}\n\n public onValid(valid: boolean): void {\n this.valid.emit(valid);\n }\n\n public onFunctionConfiguration(configuration: PluginConfigurationData): void {\n this.configuration.emit(configuration);\n }\n}\n","<!--\n ~ Copyright 2015-2025 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (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 ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\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<valtimo-plugin-configuration-container\n *ngIf=\"pluginDefinitionKey$ | async as pluginDefinitionKey\"\n [cdsLayer]=\"1\"\n [pluginDefinitionKey]=\"pluginDefinitionKey\"\n [prefillConfiguration$]=\"prefillConfiguration$\"\n [save$]=\"saveEdit$\"\n [disabled$]=\"disabled$\"\n (valid)=\"onValid($event)\"\n (configuration)=\"onFunctionConfiguration($event)\"\n type=\"configuration\"\n></valtimo-plugin-configuration-container>\n","/*\n * Copyright 2015-2025 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (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 * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\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 {Component, EventEmitter, Input, Output} from '@angular/core';\nimport {PluginManagementStateService} from '../../services';\nimport {take} from 'rxjs/operators';\nimport {BehaviorSubject, Observable} from 'rxjs';\nimport {\n PLUGIN_EDIT_MODAL_TEST_IDS,\n PluginConfiguration,\n PluginConfigurationData,\n PluginManagementService,\n} from '@valtimo/plugin';\nimport {NGXLogger} from 'ngx-logger';\n\n@Component({\n standalone: false,\n selector: 'valtimo-plugin-edit-modal',\n templateUrl: './plugin-edit-modal.component.html',\n styleUrls: ['./plugin-edit-modal.component.scss'],\n})\nexport class PluginEditModalComponent {\n @Input() public readonly open = false;\n @Input() public readonly saveNewConfiguration = false;\n\n @Output() closeModal: EventEmitter<boolean> = new EventEmitter();\n @Output() deleteEvent: EventEmitter<{configurationId: string; configurationTitle: string}> =\n new EventEmitter();\n\n public readonly inputDisabled$ = this.stateService.inputDisabled$;\n public readonly selectedPluginConfiguration$: Observable<PluginConfiguration> =\n this.stateService.selectedPluginConfiguration$;\n public readonly configurationValid$ = new BehaviorSubject<boolean>(false);\n public readonly testIds = PLUGIN_EDIT_MODAL_TEST_IDS;\n\n constructor(\n private readonly stateService: PluginManagementStateService,\n private readonly pluginManagementService: PluginManagementService,\n private readonly logger: NGXLogger\n ) {}\n\n public save(): void {\n this.stateService.saveEdit();\n }\n\n /**\n * Bubble the delete request up to the parent so the shared usage pre-check +\n * destructive-confirmation flow runs in one place (mirrors how the external edit modal works).\n * The parent closes this modal as part of that flow.\n */\n public delete(): void {\n this.stateService.selectedPluginConfiguration$\n .pipe(take(1))\n .subscribe(selectedPluginConfiguration => {\n this.deleteEvent.emit({\n configurationId: selectedPluginConfiguration.id,\n configurationTitle: selectedPluginConfiguration.title ?? '',\n });\n });\n }\n\n public hide(): void {\n this.closeModal.emit();\n this.stateService.enableInput();\n }\n\n public onPluginValid(valid: boolean): void {\n this.configurationValid$.next(valid);\n }\n\n public onPluginConfiguration(configuration: PluginConfigurationData): void {\n this.stateService.disableInput();\n\n if (this.saveNewConfiguration) {\n this.saveNewPluginConfiguration(configuration);\n return;\n }\n\n this.stateService.selectedPluginConfiguration$\n .pipe(take(1))\n .subscribe(selectedPluginConfiguration => {\n const configurationId = configuration.configurationId;\n const configurationTitle = configuration.configurationTitle;\n const configurationData = {...configuration};\n delete configurationData['configurationTitle'];\n\n this.pluginManagementService\n .updatePluginConfiguration(\n selectedPluginConfiguration.id,\n configurationId,\n configurationTitle,\n configurationData\n )\n .subscribe({\n next: () => {\n this.stateService.refresh();\n this.hide();\n },\n error: () => {\n this.logger.error('Something went wrong with updating the plugin configuration.');\n this.stateService.enableInput();\n },\n });\n });\n }\n\n private saveNewPluginConfiguration(configuration: PluginConfigurationData): void {\n this.stateService.selectedPluginConfiguration$\n .pipe(take(1))\n .subscribe(selectedPluginConfiguration => {\n const duplicatedConfiguration = {...selectedPluginConfiguration, properties: configuration};\n\n duplicatedConfiguration.title = duplicatedConfiguration.properties.configurationTitle;\n\n delete duplicatedConfiguration.properties.configurationTitle;\n delete duplicatedConfiguration.properties.configurationId;\n\n this.pluginManagementService.savePluginConfiguration(duplicatedConfiguration).subscribe({\n next: () => {\n this.stateService.refresh();\n this.hide();\n },\n error: () => {\n this.logger.error(\n 'Something went wrong with saving the duplicated plugin configuration.'\n );\n this.stateService.enableInput();\n },\n });\n });\n }\n}\n","<!--\n ~ Copyright 2015-2025 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (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 ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\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<cds-modal\n #pluginEditModal\n valtimoCdsModal\n [open]=\"open\"\n (close)=\"hide()\"\n *ngIf=\"{selectedConfiguration: selectedPluginConfiguration$ | async} as obs\"\n>\n <cds-modal-header [showCloseButton]=\"true\" (closeSelect)=\"hide()\">\n {{\n obs.selectedConfiguration?.title +\n ' - ' +\n ('title' | pluginTranslate: obs.selectedConfiguration?.pluginDefinition?.key | async)\n }}\n </cds-modal-header>\n <section cdsModalContent>\n <valtimo-plugin-edit\n (valid)=\"onPluginValid($event)\"\n (configuration)=\"onPluginConfiguration($event)\"\n ></valtimo-plugin-edit>\n </section>\n <cds-modal-footer>\n <button\n cdsButton=\"danger\"\n [attr.data-test-id]=\"testIds.deleteButton\"\n (click)=\"delete()\"\n [disabled]=\"inputDisabled$ | async\"\n >\n {{ 'pluginManagement.remove' | translate }}\n </button>\n <button\n cdsButton=\"primary\"\n [attr.data-test-id]=\"testIds.saveButton\"\n [disabled]=\"(configurationValid$ | async) === false || (inputDisabled$ | async)\"\n (click)=\"save()\"\n >\n {{ 'pluginManagement.save' | translate }}\n </button>\n </cds-modal-footer>\n</cds-modal>\n","/*\n * Copyright 2015-2026 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (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 * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\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 {AfterViewInit, Component, OnDestroy, TemplateRef, ViewChild} from '@angular/core';\nimport {HttpErrorResponse} from '@angular/common/http';\nimport {TranslateService} from '@ngx-translate/core';\nimport {ActionItem, ColumnConfig, ViewType} from '@valtimo/components';\nimport {GlobalNotificationService} from '@valtimo/shared';\nimport {\n ExternalPluginConfiguration,\n ExternalPluginDefinition,\n ExternalPluginHost,\n ExternalPluginHostUsage,\n ExternalPluginService,\n ExternalPluginUploadResult,\n getExternalPluginDescription,\n getExternalPluginDisplayName,\n isExternalPluginDefinitionIncompatible,\n PluginConfiguration,\n PluginManagementService,\n PluginTranslationService,\n toExternalPluginKey,\n} from '@valtimo/plugin';\nimport {IconService} from 'carbon-components-angular';\nimport {Information16, Upload16} from '@carbon/icons';\nimport {buildExternalPluginCompatibilityMessage} from '../../utils';\nimport {NGXLogger} from 'ngx-logger';\nimport {\n BehaviorSubject,\n combineLatest,\n EMPTY,\n fromEvent,\n merge,\n Observable,\n of,\n Subject,\n timer,\n} from 'rxjs';\nimport {\n catchError,\n distinctUntilChanged,\n map,\n shareReplay,\n startWith,\n switchMap,\n take,\n takeUntil,\n tap,\n} from 'rxjs/operators';\nimport {PluginManagementStateService} from '../../services';\nimport {UnifiedPluginConfigurationRow} from '../../models';\nimport {cloneDeep, isEqual} from 'lodash';\nimport {v4 as uuidv4} from 'uuid';\n\n/**\n * How long the post-upload notification stays up. Longer than the 4 s notification default because\n * it carries an action the admin has to read and click, not just an outcome to notice.\n */\nconst UPLOAD_NOTIFICATION_DURATION_MS = 15000;\n\n@Component({\n standalone: false,\n selector: 'valtimo-plugin-management',\n templateUrl: './plugin-management.component.html',\n styleUrls: ['./plugin-management.component.scss'],\n})\nexport class PluginManagementComponent implements AfterViewInit, OnDestroy {\n private readonly _destroy$ = new Subject<void>();\n\n @ViewChild('pluginNameColumnTemplate') private _pluginNameColumnTemplate!: TemplateRef<any>;\n\n // --- Configurations ---\n public readonly fields$ = new BehaviorSubject<ColumnConfig[]>([]);\n\n public readonly actionItems: ActionItem[] = [\n {\n callback: this.editConfiguration.bind(this),\n label: 'interface.edit',\n },\n {\n label: 'interface.duplicate',\n callback: this.duplicateConfiguration.bind(this),\n disabledCallback: (row: UnifiedPluginConfigurationRow) => row.source === 'external',\n },\n {\n callback: this.viewLogs.bind(this),\n label: 'pluginManagement.logs.menuItem',\n disabledCallback: (row: UnifiedPluginConfigurationRow) => row.source !== 'external',\n },\n {\n callback: this.deleteConfiguration.bind(this),\n label: 'interface.delete',\n type: 'danger',\n },\n ];\n\n public showLogModal = false;\n public logConfigurationId: string | null = null;\n public logConfigurationTitle = '';\n\n public readonly loading$ = new BehaviorSubject<boolean>(true);\n public readonly showEditModal$ = new BehaviorSubject<boolean>(false);\n public readonly showAddModal$ = new BehaviorSubject<boolean>(false);\n public readonly pluginConfigurations$: Observable<Array<UnifiedPluginConfigurationRow>> =\n this._stateService.refresh$.pipe(\n switchMap(() =>\n combineLatest([\n this._pluginManagementService.getAllPluginConfigurations(),\n this._externalPluginService\n .getConfigurations()\n .pipe(catchError(() => of([] as ExternalPluginConfiguration[]))),\n this._allDefinitions$,\n this._allHosts$,\n this._translateService.stream('key'),\n ]).pipe(\n map(([pluginConfigurations, externalConfigurations, externalDefinitions, hosts]) => {\n const embedded: UnifiedPluginConfigurationRow[] = pluginConfigurations.map(\n configuration => ({\n id: configuration.id,\n title: configuration.title,\n pluginName: this._pluginTranslationService.instant(\n 'title',\n configuration.pluginDefinition?.key ?? ''\n ),\n definitionKey: configuration.pluginDefinition?.key ?? '',\n source: 'embedded',\n sourceLabel: this._translateService.instant('pluginManagement.source.embedded'),\n pluginDefinition: configuration.pluginDefinition,\n properties: configuration.properties,\n })\n );\n\n const lang = this._translateService.currentLang;\n const appHostIds = new Set(hosts.filter(h => h.kind === 'APP').map(h => h.id));\n const external: UnifiedPluginConfigurationRow[] = externalConfigurations\n // App configurations are managed on the apps page; a configuration whose definition\n // is unknown cannot be classified and stays visible here rather than nowhere.\n .filter(config => {\n const definition = externalDefinitions.find(d => d.id === config.definitionId);\n return !definition || !appHostIds.has(definition.hostId);\n })\n .map(config => {\n const definition = externalDefinitions.find(d => d.id === config.definitionId);\n const incompatible = isExternalPluginDefinitionIncompatible(definition);\n const host = definition ? hosts.find(h => h.id === definition.hostId) : undefined;\n return {\n id: config.id,\n title: config.title,\n pluginName: definition ? getExternalPluginDisplayName(definition, lang) : '',\n definitionKey: definition?.pluginId ?? '',\n source: 'external' as const,\n sourceLabel: this._translateService.instant('pluginManagement.source.external'),\n externalDefinitionId: config.definitionId,\n awaitingHost: definition?.awaitingDiscovery ?? false,\n reviewRequired: definition?.requiresReacceptance ?? false,\n reviewMessage: definition?.requiresReacceptance\n ? this._translateService.instant(\n definition.pendingPermissionsChanged\n ? 'pluginManagement.reviewRequired.permissionsChanged'\n : 'pluginManagement.reviewRequired.codeChanged'\n )\n : undefined,\n incompatible,\n compatibilityMessage:\n incompatible && definition\n ? buildExternalPluginCompatibilityMessage(definition, this._translateService)\n : undefined,\n hostName: host?.name,\n };\n });\n\n return [...embedded, ...external];\n }),\n tap(() => {\n this.loading$.next(false);\n }),\n distinctUntilChanged((prev, curr) => isEqual(prev, curr))\n )\n )\n );\n\n public readonly saveNewConfiguration$ = new BehaviorSubject<boolean>(false);\n\n // --- External plugin edit modal ---\n public readonly showExternalEditModal$ = new BehaviorSubject<boolean>(false);\n public readonly selectedExternalConfiguration$ =\n new BehaviorSubject<UnifiedPluginConfigurationRow | null>(null);\n\n // --- Delete configuration ---\n public readonly deleteConfigurationModalOpen$ = new BehaviorSubject<boolean>(false);\n public configurationToDelete: {\n id: string;\n title: string;\n source: 'external' | 'embedded';\n } | null = null;\n\n public readonly usageModalOpen$ = new BehaviorSubject<boolean>(false);\n public readonly usageModalUsages$ = new BehaviorSubject<Array<ExternalPluginHostUsage>>([]);\n public usageModalEntityName: string | null = null;\n public usageModalTitleKey = '';\n public usageModalDescriptionKey = '';\n\n // --- External plugin definitions refresh ---\n public readonly externalDefsRefreshing$ = new BehaviorSubject<boolean>(false);\n private _externalDefsInitialLoad = true;\n\n private readonly _tabVisible$: Observable<boolean> = fromEvent(document, 'visibilitychange').pipe(\n startWith(null),\n map(() => document.visibilityState === 'visible')\n );\n\n private readonly _pollTick$: Observable<number> = this._tabVisible$.pipe(\n switchMap(visible => (visible ? timer(0, 5000) : EMPTY))\n );\n\n /**\n * Single shared definitions poll: no matter how many consumers subscribe, only one\n * `getDefinitions()` request is made per tick/refresh. Deduped so consumers only re-render when\n * the data actually changed. The toolbar refresh spinner is only driven by explicit refreshes\n * (upload/save/delete), never by the background poll, so it does not blink every 5 seconds when\n * the data is unchanged.\n */\n private readonly _allDefinitions$: Observable<ExternalPluginDefinition[]> = merge(\n this._pollTick$,\n this._stateService.refresh$.pipe(\n tap(() => {\n if (!this._externalDefsInitialLoad) {\n this.externalDefsRefreshing$.next(true);\n }\n })\n )\n ).pipe(\n takeUntil(this._destroy$),\n switchMap(() =>\n this._externalPluginService\n .getDefinitions()\n .pipe(catchError(() => of([] as ExternalPluginDefinition[])))\n ),\n // The spinner must be reset before the dedupe: a refresh that yields unchanged data would\n // otherwise never emit past `distinctUntilChanged`, leaving the spinner on forever.\n tap(() => {\n this._externalDefsInitialLoad = false;\n this.externalDefsRefreshing$.next(false);\n }),\n distinctUntilChanged((prev, curr) => isEqual(prev, curr)),\n shareReplay({bufferSize: 1, refCount: true})\n );\n\n // --- Plugin upload ---\n public readonly uploadModalOpen$ = new BehaviorSubject<boolean>(false);\n\n /**\n * Single shared hosts poll: one `getHosts()` request per tick, shared by every consumer\n * (configurations list, connected hosts, upload button state). Deduped so consumers only\n * re-render when the data actually changed.\n */\n private readonly _allHosts$: Observable<ExternalPluginHost[]> = this._pollTick$.pipe(\n takeUntil(this._destroy$),\n switchMap(() =>\n this._externalPluginService.getHosts().pipe(catchError(() => of([] as ExternalPluginHost[])))\n ),\n distinctUntilChanged((prev, curr) => isEqual(prev, curr)),\n shareReplay({bufferSize: 1, refCount: true})\n );\n\n public readonly connectedHosts$: Observable<Array<ExternalPluginHost>> = this._allHosts$.pipe(\n map(hosts => hosts.filter(h => h.status === 'CONNECTED' && h.kind === 'PLUGIN_HOST'))\n );\n public readonly hasConnectedHosts$: Observable<boolean> = this.connectedHosts$.pipe(\n map(hosts => hosts.length > 0)\n );\n\n /**\n * Definitions offered in the add flow. Apps are connected *and* configured on the apps page, so\n * definitions served by an APP-kind host are excluded here.\n */\n public readonly externalDefinitions$: Observable<ExternalPluginDefinition[]> = combineLatest([\n this._allDefinitions$,\n this._allHosts$,\n ]).pipe(\n map(([definitions, hosts]) => {\n const appHostIds = new Set(hosts.filter(h => h.kind === 'APP').map(h => h.id));\n return definitions.filter(\n definition =>\n !appHostIds.has(definition.hostId) &&\n // No manifest, so no permissions to accept and no schema to fill in; the backend refuses\n // a configuration for one. It appears here by itself once its host serves it.\n !definition.awaitingDiscovery\n );\n }),\n distinctUntilChanged((prev, curr) => isEqual(prev, curr))\n );\n\n constructor(\n private readonly _logger: NGXLogger,\n private readonly _pluginManagementService: PluginManagementService,\n private readonly _pluginTranslationService: PluginTranslationService,\n private readonly _stateService: PluginManagementStateService,\n private readonly _translateService: TranslateService,\n private readonly _externalPluginService: ExternalPluginService,\n private readonly _iconService: IconService,\n private readonly _globalNotificationService: GlobalNotificationService\n ) {\n this._iconService.registerAll([Information16, Upload16]);\n }\n\n public ngAfterViewInit(): void {\n this.fields$.next([\n {\n key: 'title',\n label: 'pluginManagement.labels.configurationName',\n viewType: ViewType.TEXT,\n },\n {\n key: 'pluginName',\n label: 'pluginManagement.labels.pluginName',\n viewType: ViewType.TEMPLATE,\n template: this._pluginNameColumnTemplate,\n },\n {\n key: 'definitionKey',\n label: 'pluginManagement.labels.identifier',\n viewType: ViewType.TEXT,\n },\n {\n key: 'sourceLabel',\n label: 'pluginManagement.labels.source',\n viewType: ViewType.TAGS,\n },\n {\n key: 'hostName',\n label: 'pluginManagement.labels.host',\n viewType: ViewType.TEXT,\n },\n ]);\n }\n\n public ngOnDestroy(): void {\n this._destroy$.next();\n this._destroy$.complete();\n }\n\n // --- Configurations methods ---\n\n public showAddModal(): void {\n this.showAddModal$.next(true);\n }\n\n public editConfiguration(configuration: UnifiedPluginConfigurationRow): void {\n if (configuration.source === 'external') {\n this.selectedExternalConfiguration$.next(configuration);\n this.showExternalEditModal$.next(true);\n return;\n }\n\n this.showEditModal$.next(true);\n this.saveNewConfiguration$.next(false);\n this._stateService.selectPluginConfiguration(configuration as unknown as PluginConfiguration);\n }\n\n public viewLogs(configuration: UnifiedPluginConfigurationRow): void {\n if (configuration.source !== 'external' || !configuration.id) return;\n this.logConfigurationId = configuration.id;\n this.logConfigurationTitle = configuration.title ?? '';\n this.showLogModal = true;\n }\n\n public closeLogModal(): void {\n this.showLogModal = false;\n this.logConfigurationId = null;\n this.logConfigurationTitle = '';\n }\n\n public deleteConfiguration(configuration: UnifiedPluginConfigurationRow): void {\n if (!configuration.id) return;\n this._requestDeleteConfiguration(configuration.source, configuration.id, configuration.title);\n }\n\n public confirmDeleteConfiguration(): void {\n const target = this.configurationToDelete;\n if (!target) return;\n this.configurationToDelete = null;\n if (target.source === 'external') {\n this._performDeleteExternalConfiguration(target.id, target.title);\n } else {\n this._performDeleteEmbeddedConfiguration(target.id, target.title);\n }\n }\n\n public cancelDeleteConfiguration(): void {\n this.configurationToDelete = null;\n }\n\n private _requestDeleteConfiguration(\n source: 'external' | 'embedded',\n id: string,\n title: string\n ): void {\n const usages$ =\n source === 'external'\n ? this._externalPluginService.getConfigurationUsages(id)\n : this._pluginManagementService.getConfigurationUsages(id);\n\n usages$.pipe(take(1)).subscribe({\n next: usages => {\n if (usages.length > 0) {\n this._showConfigurationInUseModal(title, usages);\n return;\n }\n this.configurationToDelete = {id, title, source};\n this.deleteConfigurationModalOpen$.next(true);\n },\n error: () => {\n this.configurationToDelete = {id, title, source};\n this.deleteConfigurationModalOpen$.next(true);\n },\n });\n }\n\n private _performDeleteExternalConfiguration(\n configurationId: string,\n configurationTitle: string\n ): void {\n this._externalPluginService\n .deleteConfiguration(configurationId)\n .pipe(take(1))\n .subscribe({\n next: () => {\n this._stateService.refresh();\n },\n error: (response: HttpErrorResponse) => {\n if (response.status === 409 && response.error?.usages) {\n this._showConfigurationInUseModal(\n configurationTitle,\n response.error.usages as Array<ExternalPluginHostUsage>\n );\n return;\n }\n this._logger.error(\n 'Something went wrong with deleting the external plugin configuration.'\n );\n },\n });\n }\n\n private _performDeleteEmbeddedConfiguration(\n configurationId: string,\n configurationTitle: string\n ): void {\n this._pluginManagementService\n .deletePluginConfiguration(configurationId)\n .pipe(take(1))\n .subscribe({\n next: () => {\n this._stateService.refresh();\n },\n error: (response: HttpErrorResponse) => {\n if (response.status === 409 && response.error?.usages) {\n this._showConfigurationInUseModal(\n configurationTitle,\n response.error.usages as Array<ExternalPluginHostUsage>\n );\n return;\n }\n this._logger.error('Something went wrong with deleting the plugin configuration.');\n },\n });\n }\n\n public closeEditModal(): void {\n this.showEditModal$.next(false);\n }\n\n public closeAddModal(): void {\n this.showAddModal$.next(false);\n }\n\n public duplicateConfiguration(configuration: UnifiedPluginConfigurationRow): void {\n if (configuration.source === 'external') return;\n\n const configurationClone = cloneDeep(configuration);\n configurationClone.id = uuidv4();\n this.showEditModal$.next(true);\n this.saveNewConfiguration$.next(true);\n this._stateService.selectPluginConfiguration(\n configurationClone as unknown as PluginConfiguration\n );\n }\n\n // --- External plugin edit modal methods ---\n\n public closeExternalEditModal(): void {\n this.showExternalEditModal$.next(false);\n this.selectedExternalConfiguration$.next(null);\n }\n\n public onExternalConfigSaved(): void {\n this.showExternalEditModal$.next(false);\n this.selectedExternalConfiguration$.next(null);\n this._stateService.refresh();\n }\n\n public onExternalConfigDeleted(configurationId: string): void {\n const configurationTitle = this.selectedExternalConfiguration$.value?.title ?? '';\n this.showExternalEditModal$.next(false);\n this.selectedExternalConfiguration$.next(null);\n this._requestDeleteConfiguration('external', configurationId, configurationTitle);\n }\n\n public onEmbeddedConfigDeleted(payload: {\n configurationId: string;\n configurationTitle: string;\n }): void {\n this.showEditModal$.next(false);\n this._requestDeleteConfiguration(\n 'embedded',\n payload.configurationId,\n payload.configurationTitle\n );\n }\n\n // --- Plugin upload modal ---\n\n public openUploadModal(): void {\n this.uploadModalOpen$.next(true);\n }\n\n public closeUploadModal(): void {\n this.uploadModalOpen$.next(false);\n }\n\n /**\n * The backend runs discovery before answering the upload, so the definition already exists by the\n * time this fires — the refresh below shows it, and the notification names what was installed and\n * offers the obvious next step. The fields degrade gracefully: an older host that answers without\n * them still yields a valid message, just without the name.\n *\n * An actionable notification rather than a plain toast, because a toast renders no action; and a\n * longer duration than the 4 s default, since an action the admin never gets to click is worse\n * than no action at all.\n */\n public onPluginUploaded(result: ExternalPluginUploadResult): void {\n this.uploadModalOpen$.next(false);\n this._stateService.refresh();\n this._globalNotificationService.showActionable({\n type: 'success',\n lowContrast: true,\n duration: UPLOAD_NOTIFICATION_DURATION_MS,\n title: this._translateService.instant('pluginManagement.upload.successTitle'),\n message: this._translateService.instant('pluginManagement.upload.successMessage', {\n pluginId: result?.pluginId ?? '',\n version: result?.version ?? '',\n }),\n actions: [\n {\n text: this._translateService.instant('pluginManagement.upload.configureAction'),\n click: () => this.configureUploadedPlugin(result),\n },\n ],\n });\n }\n\n /**\n * Opens the add-configuration flow straight on the configuration step for the plugin that was\n * just uploaded. The definition is matched on `pluginId@version` against the freshly refreshed\n * list; if discovery has not surfaced it yet the flow still opens, just on the plugin picker —\n * a slower path, never a dead end.\n */\n public configureUploadedPlugin(result: ExternalPluginUploadResult): void {\n this.externalDefinitions$.pipe(take(1)).subscribe(definitions => {\n const definition = definitions.find(\n candidate =>\n candidate.pluginId === result?.pluginId && candidate.version === result?.version\n );\n\n if (definition) {\n const lang = this._translateService.currentLang;\n this._stateService.selectPluginDefinition({\n key: toExternalPluginKey(definition.id),\n title: getExternalPluginDisplayName(definition, lang),\n description: getExternalPluginDescription(definition, lang) ?? undefined,\n });\n } else {\n this._logger.debug(\n `Uploaded plugin ${result?.pluginId}@${result?.version} is not discovered yet; opening the plugin picker instead.`\n );\n this._stateService.clearSelectedPluginDefinition();\n }\n\n this.showAddModal$.next(true);\n });\n }\n\n // --- Usage modal ---\n\n public closeUsageModal(): void {\n this.usageModalOpen$.next(false);\n this.usageModalUsages$.next([]);\n this.usageModalEntityName = null;\n }\n\n private _showConfigurationInUseModal(\n title: string,\n usages: Array<ExternalPluginHostUsage>\n ): void {\n this.usageModalEntityName =\n title ||\n this._translateService.instant('pluginManagement.configurationInUseModal.thisConfiguration');\n this.usageModalTitleKey = 'pluginManagement.configurationInUseModal.title';\n this.usageModalDescriptionKey = 'pluginManagement.configurationInUseModal.description';\n this.usageModalUsages$.next(usages);\n this.usageModalOpen$.next(true);\n }\n}\n","<!--\n ~ Copyright 2015-2026 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (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 ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\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\n *ngIf=\"{\n pluginConfigurations: pluginConfigurations$ | async,\n loading: loading$ | async,\n hasConnectedHosts: hasConnectedHosts$ | async,\n externalDefsRefreshing: externalDefsRefreshing$ | async,\n } as obs\"\n>\n <valtimo-carbon-list\n [actionItems]=\"actionItems\"\n [loading]=\"obs.loading\"\n [items]=\"obs.pluginConfigurations\"\n [fields]=\"fields$ | async\"\n [header]=\"false\"\n (rowClicked)=\"editConfiguration($event)\"\n >\n <ng-container carbonToolbarContent>\n <cds-loading\n *ngIf=\"obs.externalDefsRefreshing\"\n size=\"sm\"\n [isActive]=\"true\"\n class=\"plugin-management__hosts-spinner\"\n ></cds-loading>\n\n <button\n cdsButton=\"ghost\"\n [disabled]=\"obs.loading || !obs.hasConnectedHosts\"\n [vTooltip]=\"\n !obs.hasConnectedHosts ? ('pluginManagement.uploadDisabledTooltip' | translate) : ''\n \"\n [tooltipDisabled]=\"obs.hasConnectedHosts\"\n (click)=\"openUploadModal()\"\n >\n {{ 'pluginManagement.uploadPlugin' | translate }}\n\n <svg cdsIcon=\"upload\" size=\"16\" class=\"cds--btn__icon\"></svg>\n </button>\n\n <button cdsButton=\"primary\" [disabled]=\"obs.loading\" (click)=\"showAddModal()\">\n {{ 'pluginManagement.add' | translate }}\n\n <svg cdsIcon=\"add\" size=\"16\" class=\"cds--btn__icon\"></svg>\n </button>\n </ng-container>\n\n <valtimo-no-results\n [action]=\"toolbarButtons\"\n [title]=\"'pages.plugins.noResults' | translate\"\n ></valtimo-no-results>\n </valtimo-carbon-list>\n\n <ng-template #toolbarButtons>\n <button\n cdsButton=\"ghost\"\n [disabled]=\"obs.loading || !obs.hasConnectedHosts\"\n [vTooltip]=\"\n !obs.hasConnectedHosts ? ('pluginManagement.uploadDisabledTooltip' | translate) : ''\n \"\n [tooltipDisabled]=\"obs.hasConnectedHosts\"\n (click)=\"openUploadModal()\"\n >\n {{ 'pluginManagement.uploadPlugin' | translate }}\n\n <svg cdsIcon=\"upload\" size=\"16\" class=\"cds--btn__icon\"></svg>\n </button>\n\n <button cdsButton=\"primary\" [disabled]=\"obs.loading\" (click)=\"showAddModal()\">\n {{ 'pluginManagement.add' | translate }}\n\n <svg cdsIcon=\"add\" size=\"16\" class=\"cds--btn__icon\"></svg>\n </button>\n </ng-template>\n</ng-container>\n\n<valtimo-plugin-add-modal\n [open]=\"showAddModal$ | async\"\n [externalDefinitions]=\"externalDefinitions$ | async\"\n (closeModal)=\"closeAddModal()\"\n></valtimo-plugin-add-modal>\n\n<valtimo-plugin-edit-modal\n [open]=\"showEditModal$ | async\"\n [saveNewConfiguration]=\"saveNewConfiguration$ | async\"\n (closeModal)=\"closeEditModal()\"\n (deleteEvent)=\"onEmbeddedConfigDeleted($event)\"\n></valtimo-plugin-edit-modal>\n\n<valtimo-plugin-external-edit-modal\n [open]=\"showExternalEditModal$ | async\"\n [configuration]=\"selectedExternalConfiguration$ | async\"\n (closeEvent)=\"closeExternalEditModal()\"\n (savedEvent)=\"onExternalConfigSaved()\"\n (deleteEvent)=\"onExternalConfigDeleted($event)\"\n></valtimo-plugin-external-edit-modal>\n\n<valtimo-plugin-upload-modal\n [hosts]=\"connectedHosts$ | async\"\n [open]=\"uploadModalOpen$ | async\"\n (closeEvent)=\"closeUploadModal()\"\n (uploadedEvent)=\"onPluginUploaded($event)\"\n></valtimo-plugin-upload-modal>\n\n<valtimo-confirmation-modal\n [showModalSubject$]=\"deleteConfigurationModalOpen$\"\n [titleTranslationKey]=\"'pluginManagement.deleteConfigurationModal.title'\"\n [contentTranslationKey]=\"'pluginManagement.deleteConfigurationModal.description'\"\n [confirmButtonTextTranslationKey]=\"'interface.delete'\"\n [confirmButtonType]=\"'danger'\"\n [cancelButtonTextTranslationKey]=\"'interface.cancel'\"\n (confirmEvent)=\"confirmDeleteConfiguration()\"\n (cancelEvent)=\"cancelDeleteConfiguration()\"\n></valtimo-confirmation-modal>\n\n<valtimo-plugin-log-modal\n [open]=\"showLogModal\"\n [configurationId]=\"logConfigurationId\"\n [configurationTitle]=\"logConfigurationTitle\"\n (closeModal)=\"closeLogModal()\"\n></valtimo-plugin-log-modal>\n\n<valtimo-plugin-usage-modal\n [descriptionTranslationKey]=\"usageModalDescriptionKey\"\n [entityName]=\"usageModalEntityName\"\n [open]=\"usageModalOpen$ | async\"\n [titleTranslationKey]=\"usageModalTitleKey\"\n [usages]=\"usageModalUsages$ | async\"\n (closeEvent)=\"closeUsageModal()\"\n></valtimo-plugin-usage-modal>\n\n<ng-template #pluginNameColumnTemplate let-data=\"data\">\n <div class=\"plugin-management__plugin-name\">\n <span>{{ data?.item?.pluginName }}</span>\n\n @if (data?.item?.awaitingHost) {\n <cds-tag\n type=\"cool-gray\"\n size=\"sm\"\n [title]=\"'pluginManagement.awaitingHost.tooltip' | translate\"\n (click)=\"$event.stopPropagation()\"\n >\n {{ 'pluginManagement.awaitingHost.tag' | translate }}\n </cds-tag>\n }\n\n @if (data?.item?.reviewRequired) {\n <cds-tag\n type=\"magenta\"\n size=\"sm\"\n [title]=\"data.item.reviewMessage\"\n (click)=\"$event.stopPropagation()\"\n >\n {{ 'pluginManagement.reviewRequired.tag' | translate }}\n </cds-tag>\n }\n\n @if (data?.item?.incompatible) {\n <cds-tag type=\"red\" size=\"sm\" (click)=\"$event.stopPropagation()\">\n {{ 'pluginManagement.compatibility.incompatibleTag' | translate }}\n </cds-tag>\n\n <!--\n vTooltip, not cds-tooltip: Carbon's popover is absolutely positioned inside the trigger, so\n `valtimo-carbon-list`'s `overflow-y: hidden` on cds-table clips it — on the first row there is\n only the 48px header above the icon. vTooltip renders through a body-level CDK overlay, which\n no ancestor can clip, and is already the tooltip this toolbar uses for its upload button.\n -->\n <span\n class=\"plugin-management__incompatible-tooltip\"\n [vTooltip]=\"data.item.compatibilityMessage\"\n [attr.aria-label]=\"data.item.compatibilityMessage\"\n (click)=\"$event.stopPropagation()\"\n >\n <svg cdsIcon=\"information\" size=\"16\"></svg>\n </span>\n }\n </div>\n</ng-template>\n","/*\n * Copyright 2015-2026 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (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 * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\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 {\n ChangeDetectionStrategy,\n Component,\n EventEmitter,\n Input,\n OnChanges,\n OnDestroy,\n OnInit,\n Output,\n SimpleChanges,\n} from '@angular/core';\nimport {CommonModule} from '@angular/common';\nimport {TranslateModule} from '@ngx-translate/core';\nimport {FormArray, FormControl, FormGroup, ReactiveFormsModule, Validators} from '@angular/forms';\nimport {ButtonModule, InputModule, LayerModule} from 'carbon-components-angular';\nimport {SelectItem, SelectModule} from '@valtimo/components';\nimport {\n ExternalPluginEventQueueMode,\n ExternalPluginHost,\n ExternalPluginHostConnectionUpdateRequest,\n ExternalPluginHostCreateRequest,\n ExternalPluginHostKind,\n ExternalPluginService,\n} from '@valtimo/plugin';\nimport {Subscription} from 'rxjs';\n\n/** A browser origin: `scheme://host[:port]`, no path — the shape the backend stores. */\nconst ORIGIN_PATTERN = /^https?:\\/\\/[^/\\s]+$/;\n\n/**\n * The connection details form shared by host registration (plugin-host modal) and app\n * registration (the app add stepper). Owns the form controls, the backend-provided defaults and\n * the queue-mode/TTL validation rules; the embedding component decides when to submit and builds\n * the create request via {@link buildRequest}.\n */\n@Component({\n standalone: true,\n selector: 'valtimo-plugin-host-connection-form',\n templateUrl: './plugin-host-connection-form.component.html',\n styleUrls: ['./plugin-host-connection-form.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n CommonModule,\n TranslateModule,\n ReactiveFormsModule,\n ButtonModule,\n InputModule,\n LayerModule,\n SelectModule,\n ],\n})\nexport class PluginHostConnectionFormComponent implements OnInit, OnChanges, OnDestroy {\n /** Fetches fresh defaults every time this turns true (i.e. every time the embedding modal opens). */\n @Input() public active = false;\n /** Freezes the form, e.g. while connecting or after the host has been created. */\n @Input() public disabled = false;\n /**\n * Edit mode (#618): prefill from this host instead of the environment defaults, make the secret\n * optional (blank = unchanged), and hide the event-queue and frontend-origins sections — those\n * keep their dedicated modals. The embedder builds the update via {@link buildConnectionPatch},\n * which sends dirty fields only, so the write-only secret and the credential-redacted broker URL\n * never round-trip unless the admin actually retyped them.\n */\n @Input() public editHost: ExternalPluginHost | null = null;\n /** Chooses the placeholder examples: 'host' in the plugin-host modal, 'app' in the app add stepper. */\n @Input() public variant: 'host' | 'app' = 'host';\n\n @Output() public validChange = new EventEmitter<boolean>();\n\n /**\n * Matches `ExternalPluginHostService.MIN_SECRET_LENGTH` and the host's `MIN_ADMIN_TOKEN_LENGTH`.\n * Checked here so the form names the problem instead of saving an unusable secret.\n */\n public readonly MIN_SECRET_LENGTH = 16;\n\n public readonly form = new FormGroup({\n name: new FormControl('', Validators.required),\n baseUrl: new FormControl('', [Validators.required, Validators.pattern(/^https?:\\/\\/.+/)]),\n // Edit mode drops only `required`: minLength passes an empty value, so blank stays \"unchanged\".\n secret: new FormControl('', [\n Validators.required,\n Validators.minLength(this.MIN_SECRET_LENGTH),\n ]),\n gzacCallbackBaseUrl: new FormControl('', [\n Validators.required,\n Validators.pattern(/^https?:\\/\\/.+/),\n ]),\n eventBrokerAmqpUrl: new FormControl(''),\n eventBrokerExchange: new FormControl(''),\n eventQueueMode: new FormControl<ExternalPluginEventQueueMode>('LIVE', {nonNullable: true}),\n eventQueueTtlMs: new FormControl<number | null>(null),\n frontendOrigins: new FormArray<FormControl<string>>([]),\n });\n\n public minTtlMs = 60 * 60 * 1000;\n public maxTtlMs = 30 * 24 * 60 * 60 * 1000;\n public defaultTtlMs = 72 * 60 * 60 * 1000;\n\n public queueModeItems: SelectItem[] = [];\n\n private readonly _subscriptions = new Subscription();\n /** Prefill snapshot in edit mode; [isEdited] and [buildConnectionPatch] compare against it. */\n private _editBaseline: Record<\n 'name' | 'baseUrl' | 'gzacCallbackBaseUrl' | 'eventBrokerAmqpUrl' | 'eventBrokerExchange',\n string\n > | null = null;\n\n public get namePlaceholder(): string {\n return this.variant === 'app' ? 'my-app' : 'my-plugin-host';\n }\n\n public get baseUrlPlaceholder(): string {\n return this.variant === 'app'\n ? 'https://my-app.internal:8090'\n : 'https://plugin-host.internal:8090';\n }\n\n public get secretPlaceholder(): string {\n return this.editHost ? '••••••••' : 'admin-token';\n }\n\n public get ttlHintKey(): string {\n return this.variant === 'app'\n ? 'pluginManagement.hints.eventQueueTtlMsApp'\n : 'pluginManagement.hints.eventQueueTtlMs';\n }\n\n public get frontendOriginControls(): Array<FormControl<string>> {\n return this.form.controls.frontendOrigins.controls;\n }\n\n constructor(private readonly _externalPluginService: ExternalPluginService) {}\n\n public ngOnInit(): void {\n this.queueModeItems =\n this.variant === 'app'\n ? [\n {id: 'LIVE', translationKey: 'pluginManagement.eventQueueMode.liveApp'},\n {id: 'DURABLE', translationKey: 'pluginManagement.eventQueueMode.durableApp'},\n ]\n : [\n {id: 'LIVE', translationKey: 'pluginManagement.eventQueueMode.live'},\n {id: 'DURABLE', translationKey: 'pluginManagement.eventQueueMode.durable'},\n ];\n\n this._subscriptions.add(\n this.form.controls.eventQueueMode.valueChanges.subscribe(mode => {\n const ttl = this.form.controls.eventQueueTtlMs;\n if (mode === 'DURABLE') {\n ttl.setValidators([\n Validators.required,\n Validators.min(this.minTtlMs),\n Validators.max(this.maxTtlMs),\n ]);\n if (ttl.value == null) ttl.setValue(this.defaultTtlMs);\n } else {\n ttl.clearValidators();\n ttl.setValue(null);\n }\n ttl.updateValueAndValidity();\n })\n );\n\n this._subscriptions.add(\n this.form.statusChanges.subscribe(() => this.validChange.emit(this.form.valid))\n );\n }\n\n public ngOnChanges(changes: SimpleChanges): void {\n if (changes['active']?.currentValue === true) {\n if (this.editHost) {\n this._enterEditMode(this.editHost);\n } else {\n this._fetchDefaults();\n }\n }\n\n if (changes['disabled']) {\n // emitEvent: false — toggling enabled state must not fire the queue-mode value listener.\n if (this.disabled) {\n this.form.disable({emitEvent: false});\n } else {\n this.form.enable({emitEvent: false});\n }\n }\n }\n\n public ngOnDestroy(): void {\n this._subscriptions.unsubscribe();\n }\n\n public addFrontendOrigin(): void {\n this.form.controls.frontendOrigins.push(this._originControl(''));\n }\n\n public removeFrontendOrigin(index: number): void {\n this.form.controls.frontendOrigins.removeAt(index);\n }\n\n public buildRequest(kind: ExternalPluginHostKind): ExternalPluginHostCreateRequest | null {\n if (this.form.invalid) return null;\n const value = this.form.getRawValue();\n const mode = value.eventQueueMode ?? 'LIVE';\n return {\n name: value.name!,\n baseUrl: value.baseUrl!,\n secret: value.secret!,\n kind,\n gzacCallbackBaseUrl: value.gzacCallbackBaseUrl!,\n eventBrokerAmqpUrl: value.eventBrokerAmqpUrl?.trim() || null,\n eventBrokerExchange: value.eventBrokerExchange?.trim() || null,\n eventQueueMode: mode,\n eventQueueTtlMs: mode === 'DURABLE' ? (value.eventQueueTtlMs ?? null) : null,\n frontendOrigins: (value.frontendOrigins ?? [])\n .map(origin => origin?.trim() ?? '')\n .filter(origin => origin.length > 0),\n };\n }\n\n /**\n * Whether a connection field currently differs from the value it was prefilled with. Deliberately\n * a value comparison, not `dirty`: a field the admin edited and then reverted counts as unchanged\n * again — the warning below it disappears and the field never travels. That also means a broker\n * URL reverted to its redacted prefill (`amqp://***@…`) is simply not sent, instead of tripping\n * the backend's redaction-marker guard.\n */\n public isEdited(\n field: 'name' | 'baseUrl' | 'gzacCallbackBaseUrl' | 'eventBrokerAmqpUrl' | 'eventBrokerExchange'\n ): boolean {\n if (!this._editBaseline) return false;\n return (this.form.controls[field].value ?? '').trim() !== this._editBaseline[field];\n }\n\n /**\n * The connection PATCH body: fields that differ from the prefill baseline only, so an untouched\n * secret (empty) and an untouched or reverted redacted broker URL never travel. `null` while the\n * form is invalid; an empty object when nothing was edited — the embedder can skip the call then.\n */\n public buildConnectionPatch(): ExternalPluginHostConnectionUpdateRequest | null {\n if (this.form.invalid) return null;\n const controls = this.form.controls;\n const patch: ExternalPluginHostConnectionUpdateRequest = {};\n if (this.isEdited('name')) patch.name = controls.name.value?.trim() ?? '';\n // Trimmed to match isEdited. A stray space passes the pattern validator and would be stored.\n if (this.isEdited('baseUrl')) patch.baseUrl = controls.baseUrl.value?.trim() ?? '';\n // A blank secret is \"unchanged\" server-side too, but not sending it at all is clearer.\n if (controls.secret.value?.trim()) {\n patch.secret = controls.secret.value;\n }\n if (this.isEdited('gzacCallbackBaseUrl')) {\n patch.gzacCallbackBaseUrl = controls.gzacCallbackBaseUrl.value?.trim() ?? '';\n }\n // Blank means clear for the broker fields; the trim keeps a whitespace-only edit a clear too.\n if (this.isEdited('eventBrokerAmqpUrl')) {\n patch.eventBrokerAmqpUrl = controls.eventBrokerAmqpUrl.value?.trim() ?? '';\n }\n if (this.isEdited('eventBrokerExchange')) {\n patch.eventBrokerExchange = controls.eventBrokerExchange.value?.trim() ?? '';\n }\n return patch;\n }\n\n public reset(): void {\n this.form.controls.frontendOrigins.clear();\n this.form.reset({\n name: '',\n baseUrl: '',\n secret: '',\n gzacCallbackBaseUrl: '',\n eventBrokerAmqpUrl: '',\n eventBrokerExchange: '',\n eventQueueMode: 'LIVE',\n eventQueueTtlMs: null,\n });\n }\n\n private _enterEditMode(host: ExternalPluginHost): void {\n // The secret is write-only: it prefills empty and empty means unchanged.\n this.form.controls.secret.removeValidators(Validators.required);\n this.form.controls.secret.updateValueAndValidity({emitEvent: false});\n this._editBaseline = {\n name: host.name,\n baseUrl: host.baseUrl,\n gzacCallbackBaseUrl: host.gzacCallbackBaseUrl ?? '',\n eventBrokerAmqpUrl: host.eventBrokerAmqpUrl ?? '',\n eventBrokerExchange: host.eventBrokerExchange ?? '',\n };\n this.form.patchValue({\n secret: '',\n // The redacted value (amqp://***@…) is shown as-is; buildConnectionPatch only sends a field\n // whose value differs from this baseline, and the backend refuses the marker outright.\n ...this._editBaseline,\n });\n this.form.markAsPristine();\n // ngOnChanges runs before ngOnInit's statusChanges subscription exists, so the validity of the\n // prefilled form must be announced explicitly or the embedder's save stays disabled. As a\n // microtask: emitting synchronously from ngOnChanges risks NG0100.\n queueMicrotask(() => this.validChange.emit(this.form.valid));\n }\n\n private _fetchDefaults(): void {\n this._externalPluginService.getHostDefaults().subscribe(defaults => {\n this.minTtlMs = defaults.minEventQueueTtlMs;\n this.maxTtlMs = defaults.maxEventQueueTtlMs;\n this.defaultTtlMs = defaults.defaultEventQueueTtlMs;\n this.form.patchValue({\n gzacCallbackBaseUrl: defaults.gzacCallbackBaseUrl,\n eventBrokerAmqpUrl: defaults.eventBrokerAmqpUrl,\n eventBrokerExchange: defaults.eventBrokerExchange,\n });\n this._setFrontendOrigins(\n // The server-side default is the configured CORS allowed-origins. With none configured, the\n // admin's own origin is the best available guess: it is literally the page that will frame\n // the plugin, unlike gzacCallbackBaseUrl, which is a server-to-server address.\n defaults.frontendOrigins?.length ? defaults.frontendOrigins : [window.location.origin]\n );\n });\n }\n\n private _setFrontendOrigins(origins: Array<string>): void {\n const array = this.form.controls.frontendOrigins;\n array.clear();\n origins.forEach(origin => array.push(this._originControl(origin)));\n }\n\n private _originControl(value: string): FormControl<string> {\n // Deliberately not `required`: a row the admin added and left blank is dropped on submit\n // rather than blocking the save. `Validators.pattern` passes an empty value, so only a\n // *filled-in* row has to be a well-formed origin.\n return new FormControl<string>(value, {\n nonNullable: true,\n validators: [Validators.pattern(ORIGIN_PATTERN)],\n });\n }\n}\n","<!--\n ~ Copyright 2015-2026 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (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 ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\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<form [formGroup]=\"form\" [cdsLayer]=\"1\" class=\"plugin-host-connection-form\">\n <cds-label>\n {{ 'pluginManagement.labels.name' | translate }}\n <input cdsText formControlName=\"name\" [placeholder]=\"namePlaceholder\" />\n </cds-label>\n\n <cds-label>\n {{ 'pluginManagement.labels.baseUrl' | translate }}\n <input cdsText formControlName=\"baseUrl\" [placeholder]=\"baseUrlPlaceholder\" />\n </cds-label>\n\n <cds-label>\n {{ 'pluginManagement.labels.secret' | translate }}\n <input cdsText formControlName=\"secret\" type=\"password\" [placeholder]=\"secretPlaceholder\" />\n\n <small\n *ngIf=\"form.controls.secret.touched && form.controls.secret.hasError('minlength')\"\n class=\"plugin-host-connection-form__error\"\n >\n {{\n 'pluginManagement.hints.secretMinLength' | translate: {min: MIN_SECRET_LENGTH}\n }}\n </small>\n\n <small *ngIf=\"editHost\">{{ 'pluginManagement.hints.secretUnchanged' | translate }}</small>\n </cds-label>\n\n <cds-label>\n {{ 'pluginManagement.labels.gzacCallbackBaseUrl' | translate }}\n <input cdsText formControlName=\"gzacCallbackBaseUrl\" placeholder=\"http://localhost:8080\" />\n </cds-label>\n\n <cds-label>\n {{ 'pluginManagement.labels.eventBrokerAmqpUrl' | translate }}\n <input\n cdsText\n formControlName=\"eventBrokerAmqpUrl\"\n placeholder=\"amqp://guest:guest@localhost:5672\"\n />\n </cds-label>\n\n <cds-label>\n {{ 'pluginManagement.labels.eventBrokerExchange' | translate }}\n <input cdsText formControlName=\"eventBrokerExchange\" placeholder=\"valtimo-events\" />\n </cds-label>\n\n <div\n *ngIf=\"!editHost\"\n class=\"plugin-host-connection-form__origins\"\n formArrayName=\"frontendOrigins\"\n >\n <span class=\"cds--label\">{{ 'pluginManagement.labels.frontendOrigins' | translate }}</span>\n\n <div\n *ngFor=\"let originControl of frontendOriginControls; let i = index\"\n class=\"plugin-host-connection-form__origin-row\"\n >\n <input cdsText [formControlName]=\"i\" placeholder=\"https://valtimo.example.com\" />\n\n <button\n cdsButton=\"ghost\"\n type=\"button\"\n [title]=\"'interface.delete' | translate\"\n (click)=\"removeFrontendOrigin(i)\"\n >\n {{ 'interface.delete' | translate }}\n </button>\n </div>\n\n <button cdsButton=\"ghost\" type=\"button\" (click)=\"addFrontendOrigin()\">\n {{ 'pluginManagement.addFrontendOrigin' | translate }}\n </button>\n\n <small>{{ 'pluginManagement.hints.frontendOrigins' | translate }}</small>\n </div>\n\n <v-select\n *ngIf=\"!editHost\"\n [appendInline]=\"false\"\n [dropUp]=\"false\"\n [items]=\"queueModeItems\"\n [title]=\"'pluginManagement.labels.eventQueueMode' | translate\"\n formControlName=\"eventQueueMode\"\n ></v-select>\n\n <cds-label *ngIf=\"!editHost && form.controls.eventQueueMode.value === 'DURABLE'\">\n {{ 'pluginManagement.labels.eventQueueTtlMs' | translate }}\n <input\n cdsText\n formControlName=\"eventQueueTtlMs\"\n [max]=\"maxTtlMs\"\n [min]=\"minTtlMs\"\n [placeholder]=\"defaultTtlMs\"\n type=\"number\"\n />\n <small>{{ ttlHintKey | translate }}</small>\n </cds-label>\n</form>\n","/*\n * Copyright 2015-2026 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (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 * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\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 {\n ChangeDetectionStrategy,\n Component,\n EventEmitter,\n Input,\n OnDestroy,\n Output,\n ViewChild,\n} from '@angular/core';\nimport {CommonModule} from '@angular/common';\nimport {TranslateModule, TranslateService} from '@ngx-translate/core';\nimport {\n ButtonModule,\n LoadingModule,\n ModalModule,\n NotificationContent,\n NotificationModule,\n} from 'carbon-components-angular';\nimport {ValtimoCdsModalDirective} from '@valtimo/components';\nimport {ExternalPluginHostCreateRequest, ExternalPluginHostKind} from '@valtimo/plugin';\nimport {BehaviorSubject, Observable, Subscription} from 'rxjs';\nimport {map} from 'rxjs/operators';\nimport {PluginHostConnectionFormComponent} from '../plugin-host-connection-form/plugin-host-connection-form.component';\n\n@Component({\n standalone: true,\n selector: 'valtimo-plugin-host-modal',\n templateUrl: './plugin-host-modal.component.html',\n styleUrls: ['./plugin-host-modal.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n CommonModule,\n TranslateModule,\n ModalModule,\n ButtonModule,\n LoadingModule,\n NotificationModule,\n ValtimoCdsModalDirective,\n PluginHostConnectionFormComponent,\n ],\n})\nexport class PluginHostModalComponent implements OnDestroy {\n /**\n * The embedded connection form, resolved via a setter because the modal body only exists while\n * the modal is open (`*ngIf`). Editing anything dismisses the previous failure: the admin is\n * already acting on it, and a message that outlives the value it complained about is worse than\n * none.\n */\n @ViewChild(PluginHostConnectionFormComponent)\n public set connectionForm(form: PluginHostConnectionFormComponent | undefined) {\n this._connectionForm = form;\n this._formEditSubscription?.unsubscribe();\n this._formEditSubscription =\n form?.form.valueChanges.subscribe(() => {\n if (this._errorMessage$.value !== null) this._errorMessage$.next(null);\n }) ?? null;\n }\n\n @Input() public open = false;\n @Input() public kind: ExternalPluginHostKind = 'PLUGIN_HOST';\n /** Disables both footer buttons and shows the inline loader while the create call is in flight. */\n @Input() public submitting = false;\n\n /**\n * Why the last create attempt failed, rendered above the fields. Owned by the parent (it is the\n * one that makes the call) but cleared here as soon as the admin edits anything, so a stale\n * message never sits above a form they have already corrected.\n */\n @Input()\n public set errorMessage(value: string | null) {\n this._errorMessage$.next(value);\n }\n\n @Output() public closeEvent = new EventEmitter<void>();\n @Output() public submitEvent = new EventEmitter<ExternalPluginHostCreateRequest>();\n\n public formValid = false;\n\n public get isApp(): boolean {\n return this.kind === 'APP';\n }\n\n private readonly _errorMessage$ = new BehaviorSubject<string | null>(null);\n private _connectionForm: PluginHostConnectionFormComponent | undefined;\n private _formEditSubscription: Subscription | null = null;\n\n /**\n * The inline notification, built here rather than as a template object literal: a literal would\n * be a new object on every change-detection pass, which keeps the notification component churning.\n */\n public readonly errorNotification$: Observable<NotificationContent | null> =\n this._errorMessage$.pipe(\n map(message =>\n message === null\n ? null\n : {\n type: 'error',\n title: this._translateService.instant('pluginManagement.host.createFailedTitle'),\n message,\n showClose: false,\n lowContrast: true,\n }\n )\n );\n\n constructor(private readonly _translateService: TranslateService) {}\n\n public ngOnDestroy(): void {\n this._formEditSubscription?.unsubscribe();\n }\n\n public onFormValidChange(valid: boolean): void {\n this.formValid = valid;\n }\n\n public onSubmit(): void {\n if (this.submitting) return;\n const request = this._connectionForm?.buildRequest(this.kind);\n if (!request) return;\n // Deliberately no reset here: a failed create keeps every value the admin typed, with the\n // backend's reason rendered above the fields. The parent closes the modal on success.\n this._errorMessage$.next(null);\n this.submitEvent.emit(request);\n }\n\n public onClose(): void {\n this.closeEvent.emit();\n this._errorMessage$.next(null);\n this._connectionForm?.reset();\n }\n}\n","<!--\n ~ Copyright 2015-2026 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (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 ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\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<cds-modal *ngIf=\"open\" [open]=\"open\" size=\"sm\" valtimoCdsModal>\n <cds-modal-header (closeSelect)=\"onClose()\">\n <h3 cdsModalHeaderHeading>\n {{ (isApp ? 'pluginManagement.addApp' : 'pluginManagement.addHost') | translate }}\n </h3>\n </cds-modal-header>\n\n <div cdsModalContent class=\"plugin-host-modal__content\">\n <cds-inline-notification\n *ngIf=\"errorNotification$ | async as errorNotification\"\n [notificationObj]=\"errorNotification\"\n ></cds-inline-notification>\n\n <valtimo-plugin-host-connection-form\n [active]=\"open\"\n (validChange)=\"onFormValidChange($event)\"\n ></valtimo-plugin-host-connection-form>\n </div>\n\n <cds-modal-footer>\n <cds-loading\n *ngIf=\"submitting\"\n size=\"sm\"\n [isActive]=\"true\"\n class=\"plugin-host-modal__spinner\"\n ></cds-loading>\n\n <button cdsButton=\"secondary\" [disabled]=\"submitting\" (click)=\"onClose()\">\n {{ 'interface.cancel' | translate }}\n </button>\n\n <button cdsButton=\"primary\" [disabled]=\"!formValid || submitting\" (click)=\"onSubmit()\">\n {{ 'interface.save' | translate }}\n </button>\n </cds-modal-footer>\n</cds-modal>\n","/*\n * Copyright 2015-2026 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (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 * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\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 {\n ChangeDetectionStrategy,\n Component,\n EventEmitter,\n Input,\n OnDestroy,\n Output,\n ViewChild,\n signal,\n} from '@angular/core';\nimport {CommonModule} from '@angular/common';\nimport {TranslateModule, TranslateService} from '@ngx-translate/core';\nimport {\n ButtonModule,\n LoadingModule,\n ModalModule,\n NotificationContent,\n NotificationModule,\n} from 'carbon-components-angular';\nimport {ValtimoCdsModalDirective} from '@valtimo/components';\nimport {ExternalPluginHost, ExternalPluginHostConnectionUpdateRequest} from '@valtimo/plugin';\nimport {BehaviorSubject, Observable, Subscription} from 'rxjs';\nimport {map} from 'rxjs/operators';\nimport {PluginHostConnectionFormComponent} from '../plugin-host-connection-form/plugin-host-connection-form.component';\n\n/**\n * Edit-connection modal for a registered host or app (#618): repoint a moved host or broker, or\n * rotate the admin secret, without recreating the row. Wraps the shared connection form in edit\n * mode and emits the dirty-fields-only patch; the embedding page makes the call, renders its\n * failure inline here, and handles the CSP reload when the base URL changed.\n */\n@Component({\n standalone: true,\n selector: 'valtimo-plugin-host-edit-modal',\n templateUrl: './plugin-host-edit-modal.component.html',\n styleUrls: ['./plugin-host-edit-modal.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n CommonModule,\n TranslateModule,\n ModalModule,\n ButtonModule,\n LoadingModule,\n NotificationModule,\n ValtimoCdsModalDirective,\n PluginHostConnectionFormComponent,\n ],\n})\nexport class PluginHostEditModalComponent implements OnDestroy {\n /** Same resolve-via-setter pattern as the add modal: the body only exists while open. */\n @ViewChild(PluginHostConnectionFormComponent)\n public set connectionForm(form: PluginHostConnectionFormComponent | undefined) {\n this._connectionForm = form;\n this._formEditSubscription?.unsubscribe();\n this._formEditSubscription =\n form?.form.valueChanges.subscribe(() => {\n if (this._errorMessage$.value !== null) this._errorMessage$.next(null);\n // Value comparisons, not dirty flags: an edit reverted to the stored value withdraws the\n // warning, matching what buildConnectionPatch will (not) send.\n this.$secretChanged.set(!!form.form.controls.secret.value?.trim());\n this.$brokerChanged.set(\n form.isEdited('eventBrokerAmqpUrl') || form.isEdited('eventBrokerExchange')\n );\n }) ?? null;\n }\n\n /**\n * A successful save closes via the parent, bypassing [onClose] — so the changed-flags are reset\n * here too. Else the secret warning carries over to the next host opened.\n */\n @Input()\n public set open(value: boolean) {\n if (this._open && !value) {\n this.$secretChanged.set(false);\n this.$brokerChanged.set(false);\n }\n this._open = value;\n }\n\n public get open(): boolean {\n return this._open;\n }\n\n @Input() public host: ExternalPluginHost | null = null;\n /** Wording only: 'host' on the hosts page, 'app' on the apps page. */\n @Input() public variant: 'host' | 'app' = 'host';\n /** Disables both footer buttons and shows the inline loader while the update call is in flight. */\n @Input() public submitting = false;\n\n /** Why the last update failed; owned by the parent, cleared here on any edit (add-modal pattern). */\n @Input()\n public set errorMessage(value: string | null) {\n this._errorMessage$.next(value);\n }\n\n @Output() public closeEvent = new EventEmitter<void>();\n @Output() public submitEvent = new EventEmitter<ExternalPluginHostConnectionUpdateRequest>();\n\n public formValid = false;\n\n /** Drives the rotation warning: the host must be restarted with the matching ADMIN_TOKEN. */\n public readonly $secretChanged = signal<boolean>(false);\n /** Drives the consumer-reconnect note for broker edits. */\n public readonly $brokerChanged = signal<boolean>(false);\n\n private readonly _errorMessage$ = new BehaviorSubject<string | null>(null);\n private _open = false;\n private _connectionForm: PluginHostConnectionFormComponent | undefined;\n private _formEditSubscription: Subscription | null = null;\n\n public readonly errorNotification$: Observable<NotificationContent | null> =\n this._errorMessage$.pipe(\n map(message =>\n message === null\n ? null\n : {\n type: 'error',\n title: this._translateService.instant('pluginManagement.editHost.updateFailedTitle'),\n message,\n showClose: false,\n lowContrast: true,\n }\n )\n );\n\n /**\n * Built from `stream` rather than once in the constructor: at construction time the translation\n * file may not be loaded yet and `instant` would bake the raw keys in. Re-emits on (re)load, and\n * stays one stable object per emission so change detection is not fed a fresh literal every pass.\n */\n public readonly secretWarning$: Observable<NotificationContent> = this._notification(\n 'warning',\n 'pluginManagement.editHost.secretWarningTitle',\n 'pluginManagement.editHost.secretWarningMessage'\n );\n public readonly brokerNote$: Observable<NotificationContent> = this._notification(\n 'info',\n 'pluginManagement.editHost.brokerNoteTitle',\n 'pluginManagement.editHost.brokerNoteMessage'\n );\n\n constructor(private readonly _translateService: TranslateService) {}\n\n public ngOnDestroy(): void {\n this._formEditSubscription?.unsubscribe();\n }\n\n public onFormValidChange(valid: boolean): void {\n this.formValid = valid;\n }\n\n public onSubmit(): void {\n if (this.submitting) return;\n const patch = this._connectionForm?.buildConnectionPatch();\n if (!patch) return;\n if (Object.keys(patch).length === 0) {\n // Nothing edited — closing is the honest no-op.\n this.onClose();\n return;\n }\n this._errorMessage$.next(null);\n this.submitEvent.emit(patch);\n }\n\n public onClose(): void {\n this.closeEvent.emit();\n this._errorMessage$.next(null);\n this.$secretChanged.set(false);\n this.$brokerChanged.set(false);\n this._connectionForm?.reset();\n }\n\n private _notification(\n type: 'warning' | 'info',\n titleKey: string,\n messageKey: string\n ): Observable<NotificationContent> {\n return this._translateService.stream([titleKey, messageKey]).pipe(\n map(translations => ({\n type,\n title: translations[titleKey],\n message: translations[messageKey],\n showClose: false,\n lowContrast: true,\n }))\n );\n }\n}\n","<!--\n ~ Copyright 2015-2026 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (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 ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\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<cds-modal *ngIf=\"open\" [open]=\"open\" size=\"sm\" valtimoCdsModal>\n <cds-modal-header (closeSelect)=\"onClose()\">\n <h3 cdsModalHeaderHeading>\n {{\n (variant === 'app'\n ? 'pluginManagement.editHost.modalTitleApp'\n : 'pluginManagement.editHost.modalTitle'\n ) | translate\n }}\n </h3>\n </cds-modal-header>\n\n <div cdsModalContent class=\"plugin-host-edit-modal__content\">\n <cds-inline-notification\n *ngIf=\"errorNotification$ | async as errorNotification\"\n [notificationObj]=\"errorNotification\"\n ></cds-inline-notification>\n\n <valtimo-plugin-host-connection-form\n [active]=\"open\"\n [editHost]=\"host\"\n [variant]=\"variant\"\n (validChange)=\"onFormValidChange($event)\"\n ></valtimo-plugin-host-connection-form>\n\n <cds-inline-notification\n *ngIf=\"$secretChanged() && (secretWarning$ | async) as secretWarning\"\n [notificationObj]=\"secretWarning\"\n ></cds-inline-notification>\n\n <cds-inline-notification\n *ngIf=\"$brokerChanged() && (brokerNote$ | async) as brokerNote\"\n [notificationObj]=\"brokerNote\"\n ></cds-inline-notification>\n </div>\n\n <cds-modal-footer>\n <cds-loading\n *ngIf=\"submitting\"\n size=\"sm\"\n [isActive]=\"true\"\n class=\"plugin-host-edit-modal__spinner\"\n ></cds-loading>\n\n <button cdsButton=\"secondary\" [disabled]=\"submitting\" (click)=\"onClose()\">\n {{ 'interface.cancel' | translate }}\n </button>\n\n <button cdsButton=\"primary\" [disabled]=\"!formValid || submitting\" (click)=\"onSubmit()\">\n {{ 'interface.save' | translate }}\n </button>\n </cds-modal-footer>\n</cds-modal>\n","/*\n * Copyright 2015-2026 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (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 * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\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 {ChangeDetectionStrategy, Component, EventEmitter, Input, OnChanges, OnDestroy, OnInit, Output, SimpleChanges} from '@angular/core';\nimport {CommonModule} from '@angular/common';\nimport {TranslateModule} from '@ngx-translate/core';\nimport {FormControl, FormGroup, ReactiveFormsModule, Validators} from '@angular/forms';\nimport {ButtonModule, InputModule, LayerModule, ModalModule} from 'carbon-components-angular';\nimport {SelectItem, SelectModule, ValtimoCdsModalDirective} from '@valtimo/components';\nimport {\n ExternalPluginEventQueueMode,\n ExternalPluginHost,\n ExternalPluginHostEventQueueUpdateRequest,\n ExternalPluginService,\n} from '@valtimo/plugin';\nimport {Subscription} from 'rxjs';\n\n@Component({\n standalone: true,\n selector: 'valtimo-plugin-host-event-queue-modal',\n templateUrl: './plugin-host-event-queue-modal.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n CommonModule,\n TranslateModule,\n ReactiveFormsModule,\n ModalModule,\n ButtonModule,\n InputModule,\n LayerModule,\n SelectModule,\n ValtimoCdsModalDirective,\n ],\n})\nexport class PluginHostEventQueueModalComponent implements OnChanges, OnInit, OnDestroy {\n @Input() public open = false;\n @Input() public host: ExternalPluginHost | null = null;\n /** Chooses the wording: 'host' on the plugin-hosts page, 'app' on the apps page. */\n @Input() public variant: 'host' | 'app' = 'host';\n\n @Output() public closeEvent = new EventEmitter<void>();\n @Output() public submitEvent = new EventEmitter<ExternalPluginHostEventQueueUpdateRequest>();\n\n public readonly form = new FormGroup({\n eventQueueMode: new FormControl<ExternalPluginEventQueueMode>('LIVE', {nonNullable: true}),\n eventQueueTtlMs: new FormControl<number | null>(null),\n });\n\n public minTtlMs = 60 * 60 * 1000;\n public maxTtlMs = 30 * 24 * 60 * 60 * 1000;\n public defaultTtlMs = 72 * 60 * 60 * 1000;\n\n public queueModeItems: SelectItem[] = [];\n\n private readonly _subscriptions = new Subscription();\n\n public get ttlHintKey(): string {\n return this.variant === 'app'\n ? 'pluginManagement.hints.eventQueueTtlMsApp'\n : 'pluginManagement.hints.eventQueueTtlMs';\n }\n\n constructor(private readonly _externalPluginService: ExternalPluginService) {}\n\n public ngOnInit(): void {\n this.queueModeItems =\n this.variant === 'app'\n ? [\n {id: 'LIVE', translationKey: 'pluginManagement.eventQueueMode.liveApp'},\n {id: 'DURABLE', translationKey: 'pluginManagement.eventQueueMode.durableApp'},\n ]\n : [\n {id: 'LIVE', translationKey: 'pluginManagement.eventQueueMode.live'},\n {id: 'DURABLE', translationKey: 'pluginManagement.eventQueueMode.durable'},\n ];\n\n this._subscriptions.add(\n this.form.controls.eventQueueMode.valueChanges.subscribe(mode => {\n const ttl = this.form.controls.eventQueueTtlMs;\n if (mode === 'DURABLE') {\n ttl.setValidators([\n Validators.required,\n Validators.min(this.minTtlMs),\n Validators.max(this.maxTtlMs),\n ]);\n if (ttl.value == null) ttl.setValue(this.defaultTtlMs);\n } else {\n ttl.clearValidators();\n ttl.setValue(null);\n }\n ttl.updateValueAndValidity();\n })\n );\n }\n\n public ngOnChanges(changes: SimpleChanges): void {\n if (changes['open']?.currentValue === true) {\n this._fetchDefaults();\n this._loadHost();\n }\n }\n\n public ngOnDestroy(): void {\n this._subscriptions.unsubscribe();\n }\n\n public onSubmit(): void {\n if (this.form.invalid) return;\n const value = this.form.value;\n const mode = value.eventQueueMode ?? 'LIVE';\n this.submitEvent.emit({\n eventQueueMode: mode,\n eventQueueTtlMs: mode === 'DURABLE' ? value.eventQueueTtlMs ?? null : null,\n });\n }\n\n public onClose(): void {\n this.closeEvent.emit();\n }\n\n private _fetchDefaults(): void {\n this._externalPluginService.getHostDefaults().subscribe(defaults => {\n this.minTtlMs = defaults.minEventQueueTtlMs;\n this.maxTtlMs = defaults.maxEventQueueTtlMs;\n this.defaultTtlMs = defaults.defaultEventQueueTtlMs;\n });\n }\n\n private _loadHost(): void {\n if (!this.host) return;\n this.form.reset(\n {\n eventQueueMode: this.host.eventQueueMode,\n eventQueueTtlMs: this.host.eventQueueTtlMs,\n },\n {emitEvent: false}\n );\n // Trigger validator wiring for the current mode without losing the pre-loaded TTL.\n const mode = this.host.eventQueueMode;\n const ttl = this.form.controls.eventQueueTtlMs;\n if (mode === 'DURABLE') {\n ttl.setValidators([\n Validators.required,\n Validators.min(this.minTtlMs),\n Validators.max(this.maxTtlMs),\n ]);\n } else {\n ttl.clearValidators();\n }\n ttl.updateValueAndValidity();\n }\n}\n","<!--\n ~ Copyright 2015-2026 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (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 ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\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<cds-modal\n *ngIf=\"open && host\"\n [open]=\"open\"\n size=\"sm\"\n valtimoCdsModal\n>\n <cds-modal-header (closeSelect)=\"onClose()\">\n <h3 cdsModalHeaderHeading>\n {{ 'pluginManagement.editHostEventQueueModalTitle' | translate: {name: host.name} }}\n </h3>\n </cds-modal-header>\n\n <form\n [formGroup]=\"form\"\n cdsModalContent\n [cdsLayer]=\"1\"\n >\n <v-select\n [appendInline]=\"false\"\n [dropUp]=\"false\"\n [items]=\"queueModeItems\"\n [title]=\"'pluginManagement.labels.eventQueueMode' | translate\"\n formControlName=\"eventQueueMode\"\n ></v-select>\n\n <cds-label *ngIf=\"form.controls.eventQueueMode.value === 'DURABLE'\">\n {{ 'pluginManagement.labels.eventQueueTtlMs' | translate }}\n <input\n cdsText\n formControlName=\"eventQueueTtlMs\"\n [max]=\"maxTtlMs\"\n [min]=\"minTtlMs\"\n [placeholder]=\"defaultTtlMs\"\n type=\"number\"\n />\n <small>{{ ttlHintKey | translate }}</small>\n </cds-label>\n </form>\n\n <cds-modal-footer>\n <button cdsButton=\"secondary\" (click)=\"onClose()\">\n {{ 'interface.cancel' | translate }}\n </button>\n\n <button cdsButton=\"primary\" [disabled]=\"form.invalid\" (click)=\"onSubmit()\">\n {{ 'pluginManagement.saveEventQueue' | translate }}\n </button>\n </cds-modal-footer>\n</cds-modal>\n","/*\n * Copyright 2015-2026 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (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 * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\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 {\n ChangeDetectionStrategy,\n Component,\n EventEmitter,\n Input,\n OnChanges,\n Output,\n SimpleChanges,\n} from '@angular/core';\nimport {CommonModule} from '@angular/common';\nimport {TranslateModule} from '@ngx-translate/core';\nimport {FormArray, FormControl, FormGroup, ReactiveFormsModule, Validators} from '@angular/forms';\nimport {ButtonModule, InputModule, LayerModule, ModalModule} from 'carbon-components-angular';\nimport {ValtimoCdsModalDirective} from '@valtimo/components';\nimport {ExternalPluginHost} from '@valtimo/plugin';\n\n/** A browser origin: `scheme://host[:port]`, no path — the shape the backend stores. */\nconst ORIGIN_PATTERN = /^https?:\\/\\/[^/\\s]+$/;\n\n/**\n * Runtime edit path for the browser origins allowed to embed a host's plugin screens — the same\n * narrowly-scoped shape as the event-queue modal. The connection fields (base URL, secret, broker)\n * have their own edit modal (#618).\n *\n * Saving an empty list is meaningful, not a mistake: it means no page may frame this host's plugins.\n */\n@Component({\n standalone: true,\n selector: 'valtimo-plugin-host-frontend-origins-modal',\n templateUrl: './plugin-host-frontend-origins-modal.component.html',\n styleUrls: ['./plugin-host-frontend-origins-modal.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n CommonModule,\n TranslateModule,\n ReactiveFormsModule,\n ModalModule,\n ButtonModule,\n InputModule,\n LayerModule,\n ValtimoCdsModalDirective,\n ],\n})\nexport class PluginHostFrontendOriginsModalComponent implements OnChanges {\n @Input() public open = false;\n @Input() public host: ExternalPluginHost | null = null;\n\n @Output() public closeEvent = new EventEmitter<void>();\n @Output() public submitEvent = new EventEmitter<Array<string>>();\n\n public readonly form = new FormGroup({\n frontendOrigins: new FormArray<FormControl<string>>([]),\n });\n\n public get originControls(): Array<FormControl<string>> {\n return this.form.controls.frontendOrigins.controls;\n }\n\n public ngOnChanges(changes: SimpleChanges): void {\n if (changes['open']?.currentValue === true) {\n this._loadHost();\n }\n }\n\n public addOrigin(): void {\n this.form.controls.frontendOrigins.push(this._originControl(''));\n }\n\n public removeOrigin(index: number): void {\n this.form.controls.frontendOrigins.removeAt(index);\n }\n\n public onSubmit(): void {\n if (this.form.invalid) return;\n this.submitEvent.emit(\n this.form.controls.frontendOrigins.controls\n .map(control => control.value.trim())\n .filter(origin => origin.length > 0)\n );\n }\n\n public onClose(): void {\n this.closeEvent.emit();\n }\n\n private _loadHost(): void {\n const array = this.form.controls.frontendOrigins;\n array.clear();\n (this.host?.frontendOrigins ?? []).forEach(origin => array.push(this._originControl(origin)));\n }\n\n private _originControl(value: string): FormControl<string> {\n // Deliberately not `required`: a row the admin added and left blank is dropped on submit\n // rather than blocking the save. `Validators.pattern` passes an empty value, so only a\n // *filled-in* row has to be a well-formed origin.\n return new FormControl<string>(value, {\n nonNullable: true,\n validators: [Validators.pattern(ORIGIN_PATTERN)],\n });\n }\n}\n","<!--\n ~ Copyright 2015-2026 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (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 ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\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<cds-modal *ngIf=\"open && host\" [open]=\"open\" size=\"sm\" valtimoCdsModal>\n <cds-modal-header (closeSelect)=\"onClose()\">\n <h3 cdsModalHeaderHeading>\n {{ 'pluginManagement.editHostFrontendOriginsModalTitle' | translate: {name: host.name} }}\n </h3>\n </cds-modal-header>\n\n <form\n [formGroup]=\"form\"\n cdsModalContent\n [cdsLayer]=\"1\"\n class=\"plugin-host-frontend-origins-modal__content\"\n >\n <div formArrayName=\"frontendOrigins\">\n <div\n *ngFor=\"let originControl of originControls; let i = index\"\n class=\"plugin-host-frontend-origins-modal__row\"\n >\n <input cdsText [formControlName]=\"i\" placeholder=\"https://valtimo.example.com\" />\n\n <button cdsButton=\"ghost\" type=\"button\" (click)=\"removeOrigin(i)\">\n {{ 'interface.delete' | translate }}\n </button>\n </div>\n </div>\n\n <button cdsButton=\"ghost\" type=\"button\" (click)=\"addOrigin()\">\n {{ 'pluginManagement.addFrontendOrigin' | translate }}\n </button>\n\n <small>{{ 'pluginManagement.hints.frontendOrigins' | translate }}</small>\n\n <small *ngIf=\"originControls.length === 0\">\n {{ 'pluginManagement.hints.noFrontendOrigins' | translate }}\n </small>\n </form>\n\n <cds-modal-footer>\n <button cdsButton=\"secondary\" (click)=\"onClose()\">\n {{ 'interface.cancel' | translate }}\n </button>\n\n <button cdsButton=\"primary\" [disabled]=\"form.invalid\" (click)=\"onSubmit()\">\n {{ 'pluginManagement.saveFrontendOrigins' | translate }}\n </button>\n </cds-modal-footer>\n</cds-modal>\n","/*\n * Copyright 2015-2026 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (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 * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\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 {ChangeDetectionStrategy, Component, OnDestroy} from '@angular/core';\nimport {CommonModule} from '@angular/common';\nimport {TranslateModule, TranslateService} from '@ngx-translate/core';\nimport {HttpErrorResponse} from '@angular/common/http';\nimport {\n ActionItem,\n CarbonListModule,\n CarbonTag,\n ColumnConfig,\n ConfirmationModalModule,\n ViewType,\n} from '@valtimo/components';\nimport {\n ExternalPluginHost,\n ExternalPluginHostConnectionUpdateRequest,\n ExternalPluginHostCreateRequest,\n ExternalPluginHostEventQueueUpdateRequest,\n ExternalPluginHostUsage,\n ExternalPluginService,\n} from '@valtimo/plugin';\nimport {ButtonModule, LoadingModule} from 'carbon-components-angular';\nimport {BehaviorSubject, EMPTY, fromEvent, merge, Observable, of, Subject, timer} from 'rxjs';\nimport {\n catchError,\n distinctUntilChanged,\n map,\n startWith,\n switchMap,\n take,\n takeUntil,\n tap,\n} from 'rxjs/operators';\nimport {isEqual} from 'lodash';\nimport {NGXLogger} from 'ngx-logger';\nimport {PluginHostModalComponent} from '../plugin-host-modal/plugin-host-modal.component';\nimport {PluginHostEditModalComponent} from '../plugin-host-edit-modal/plugin-host-edit-modal.component';\nimport {PluginHostEventQueueModalComponent} from '../plugin-host-event-queue-modal/plugin-host-event-queue-modal.component';\nimport {PluginHostFrontendOriginsModalComponent} from '../plugin-host-frontend-origins-modal/plugin-host-frontend-origins-modal.component';\nimport {PluginUsageModalComponent} from '../plugin-usage-modal/plugin-usage-modal.component';\n\n@Component({\n standalone: true,\n templateUrl: './plugin-hosts-page.component.html',\n styleUrls: ['./plugin-hosts-page.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n CommonModule,\n TranslateModule,\n ButtonModule,\n LoadingModule,\n CarbonListModule,\n ConfirmationModalModule,\n PluginHostModalComponent,\n PluginHostEditModalComponent,\n PluginHostEventQueueModalComponent,\n PluginHostFrontendOriginsModalComponent,\n PluginUsageModalComponent,\n ],\n})\nexport class PluginHostsPageComponent implements OnDestroy {\n private readonly _destroy$ = new Subject<void>();\n private readonly _refreshHosts$ = new Subject<void>();\n private _hostsInitialLoad = true;\n\n private readonly _tabVisible$: Observable<boolean> = fromEvent(document, 'visibilitychange').pipe(\n startWith(null),\n map(() => document.visibilityState === 'visible')\n );\n\n public readonly hostsLoading$ = new BehaviorSubject<boolean>(true);\n public readonly hostsRefreshing$ = new BehaviorSubject<boolean>(false);\n public readonly hostModalOpen$ = new BehaviorSubject<boolean>(false);\n public readonly hostSubmitting$ = new BehaviorSubject<boolean>(false);\n public readonly hostErrorMessage$ = new BehaviorSubject<string | null>(null);\n public readonly reloadModalOpen$ = new BehaviorSubject<boolean>(false);\n public readonly deleteHostModalOpen$ = new BehaviorSubject<boolean>(false);\n public hostToDelete: ExternalPluginHost | null = null;\n\n public readonly editConnectionModalOpen$ = new BehaviorSubject<boolean>(false);\n public readonly hostToEditConnection$ = new BehaviorSubject<ExternalPluginHost | null>(null);\n public readonly editConnectionSubmitting$ = new BehaviorSubject<boolean>(false);\n public readonly editConnectionErrorMessage$ = new BehaviorSubject<string | null>(null);\n\n public readonly eventQueueModalOpen$ = new BehaviorSubject<boolean>(false);\n public readonly hostToEditEventQueue$ = new BehaviorSubject<ExternalPluginHost | null>(null);\n\n public readonly frontendOriginsModalOpen$ = new BehaviorSubject<boolean>(false);\n public readonly hostToEditFrontendOrigins$ = new BehaviorSubject<ExternalPluginHost | null>(null);\n\n public readonly usageModalOpen$ = new BehaviorSubject<boolean>(false);\n public readonly usageModalUsages$ = new BehaviorSubject<Array<ExternalPluginHostUsage>>([]);\n public usageModalEntityName: string | null = null;\n public usageModalTitleKey = '';\n public usageModalDescriptionKey = '';\n\n public readonly hostFields: ColumnConfig[] = [\n {\n key: 'name',\n label: 'pluginManagement.labels.name',\n viewType: ViewType.TEXT,\n },\n {\n key: 'baseUrl',\n label: 'pluginManagement.labels.baseUrl',\n viewType: ViewType.TEXT,\n },\n {\n key: 'statusTag',\n label: 'pluginManagement.labels.status',\n viewType: ViewType.TAGS,\n },\n {\n key: 'lastHealthCheckFormatted',\n label: 'pluginManagement.labels.lastHealthCheck',\n viewType: ViewType.TEXT,\n },\n ];\n\n public readonly hostActionItems: ActionItem[] = [\n {\n callback: this.editHostConnection.bind(this),\n label: 'pluginManagement.editConnection',\n },\n {\n callback: this.editHostEventQueue.bind(this),\n label: 'pluginManagement.editEventQueue',\n },\n {\n callback: this.editHostFrontendOrigins.bind(this),\n label: 'pluginManagement.editFrontendOrigins',\n },\n {\n callback: this.deleteHost.bind(this),\n label: 'interface.delete',\n type: 'danger',\n },\n ];\n\n public readonly hosts$: Observable<\n Array<ExternalPluginHost & {statusTag: CarbonTag; lastHealthCheckFormatted: string}>\n > = merge(\n this._tabVisible$.pipe(switchMap(visible => (visible ? timer(0, 5000) : EMPTY))),\n this._refreshHosts$\n ).pipe(\n takeUntil(this._destroy$),\n tap(() => {\n if (!this._hostsInitialLoad) {\n this.hostsRefreshing$.next(true);\n }\n }),\n switchMap(() =>\n this._externalPluginService.getHosts().pipe(catchError(() => of([] as ExternalPluginHost[])))\n ),\n map(hosts => hosts.filter(h => h.kind === 'PLUGIN_HOST')),\n switchMap(hosts =>\n this._translateService.stream('key').pipe(\n map(() =>\n hosts.map(host => ({\n ...host,\n statusTag: this._getStatusTag(host.status),\n lastHealthCheckFormatted: this._formatLastHealthCheck(host.lastHealthCheck),\n }))\n )\n )\n ),\n tap(() => {\n this._hostsInitialLoad = false;\n this.hostsLoading$.next(false);\n this.hostsRefreshing$.next(false);\n }),\n distinctUntilChanged((prev, curr) => isEqual(prev, curr))\n );\n\n constructor(\n private readonly _logger: NGXLogger,\n private readonly _translateService: TranslateService,\n private readonly _externalPluginService: ExternalPluginService\n ) {}\n\n public ngOnDestroy(): void {\n this._destroy$.next();\n this._destroy$.complete();\n }\n\n public openHostModal(): void {\n this.hostModalOpen$.next(true);\n }\n\n public closeHostModal(): void {\n this.hostModalOpen$.next(false);\n }\n\n /**\n * Keeps the modal open and populated when registration fails, showing the reason inline. The\n * backend answers a fixable mistake with a 400 carrying `detail`; the service marks that status\n * `InterceptorSkip`, so this is the only place the admin ever sees it.\n */\n public submitHost(request: ExternalPluginHostCreateRequest): void {\n this.hostSubmitting$.next(true);\n this.hostErrorMessage$.next(null);\n this._externalPluginService.createHost(request).subscribe({\n next: () => {\n this.hostSubmitting$.next(false);\n // Closing resets the modal, so a subsequent \"add host\" starts from a clean form.\n this.hostModalOpen$.next(false);\n this.reloadModalOpen$.next(true);\n },\n error: (response: HttpErrorResponse) => {\n this.hostSubmitting$.next(false);\n this.hostErrorMessage$.next(this._extractHostError(response));\n this._logger.error('Something went wrong with creating the plugin host.', response);\n },\n });\n }\n\n public editHostFrontendOrigins(host: ExternalPluginHost): void {\n this.hostToEditFrontendOrigins$.next(host);\n this.frontendOriginsModalOpen$.next(true);\n }\n\n public closeFrontendOriginsModal(): void {\n this.frontendOriginsModalOpen$.next(false);\n this.hostToEditFrontendOrigins$.next(null);\n }\n\n public submitFrontendOriginsUpdate(origins: Array<string>): void {\n const host = this.hostToEditFrontendOrigins$.value;\n if (!host) return;\n this._externalPluginService.updateHostFrontendOrigins(host.id, origins).subscribe({\n next: () => {\n this.frontendOriginsModalOpen$.next(false);\n this.hostToEditFrontendOrigins$.next(null);\n this._refreshHosts$.next();\n },\n error: () => {\n this._logger.error('Something went wrong with updating the plugin host frontend origins.');\n },\n });\n }\n\n /**\n * The most specific message the response carries. `detail` is what the backend's validation\n * mapper fills with the operator-facing reason; `message`/`title` cover the other problem shapes;\n * the translated fallback covers a response with none of them (a gateway error, say).\n */\n private _extractHostError(response: HttpErrorResponse): string {\n const body = response?.error;\n const candidate =\n (typeof body?.detail === 'string' && body.detail) ||\n (typeof body?.message === 'string' && body.message) ||\n (typeof body?.title === 'string' && body.title) ||\n '';\n return (\n candidate.trim() ||\n this._translateService.instant('pluginManagement.host.createFailedFallback')\n );\n }\n\n public deleteHost(host: ExternalPluginHost): void {\n this._externalPluginService\n .getHostUsages(host.id)\n .pipe(take(1))\n .subscribe({\n next: usages => {\n if (usages.length > 0) {\n this._showHostInUseModal(host, usages);\n return;\n }\n this.hostToDelete = host;\n this.deleteHostModalOpen$.next(true);\n },\n error: () => {\n this.hostToDelete = host;\n this.deleteHostModalOpen$.next(true);\n },\n });\n }\n\n public confirmDeleteHost(): void {\n if (!this.hostToDelete) return;\n const host = this.hostToDelete;\n this._externalPluginService\n .deleteHost(host.id)\n .pipe(take(1))\n .subscribe({\n next: () => {\n this.hostToDelete = null;\n this.hostsLoading$.next(true);\n this._refreshHosts$.next();\n },\n error: (response: HttpErrorResponse) => {\n if (response.status === 409 && response.error?.usages) {\n this.hostToDelete = null;\n this._showHostInUseModal(host, response.error.usages as Array<ExternalPluginHostUsage>);\n return;\n }\n this._logger.error('Something went wrong with deleting the plugin host.');\n },\n });\n }\n\n public cancelDeleteHost(): void {\n this.hostToDelete = null;\n }\n\n public editHostConnection(host: ExternalPluginHost): void {\n this.hostToEditConnection$.next(host);\n this.editConnectionErrorMessage$.next(null);\n this.editConnectionModalOpen$.next(true);\n }\n\n public closeEditConnectionModal(): void {\n this.editConnectionModalOpen$.next(false);\n this.hostToEditConnection$.next(null);\n this.editConnectionErrorMessage$.next(null);\n }\n\n /**\n * Applies the dirty-fields-only connection patch (#618). A changed base URL also changes the\n * origin the frontend CSP must allow, and that CSP is fixed at bootstrap — so a repoint gets the\n * same reload-required modal as registering a new host.\n */\n public submitConnectionUpdate(patch: ExternalPluginHostConnectionUpdateRequest): void {\n const host = this.hostToEditConnection$.value;\n if (!host) return;\n // Cleared first, like submitHost. The modal drops its copy on every keystroke, so an\n // identical message twice would not change the binding and would never re-render.\n this.editConnectionErrorMessage$.next(null);\n this.editConnectionSubmitting$.next(true);\n this._externalPluginService.updateHostConnection(host.id, patch).subscribe({\n next: () => {\n this.editConnectionSubmitting$.next(false);\n this.closeEditConnectionModal();\n this._refreshHosts$.next();\n if (patch.baseUrl !== undefined) this.reloadModalOpen$.next(true);\n },\n error: (response: HttpErrorResponse) => {\n this.editConnectionSubmitting$.next(false);\n this.editConnectionErrorMessage$.next(this._extractHostError(response));\n this._logger.error(\n 'Something went wrong with updating the plugin host connection.',\n response\n );\n },\n });\n }\n\n public editHostEventQueue(host: ExternalPluginHost): void {\n this.hostToEditEventQueue$.next(host);\n this.eventQueueModalOpen$.next(true);\n }\n\n public closeEventQueueModal(): void {\n this.eventQueueModalOpen$.next(false);\n this.hostToEditEventQueue$.next(null);\n }\n\n public submitEventQueueUpdate(request: ExternalPluginHostEventQueueUpdateRequest): void {\n const host = this.hostToEditEventQueue$.value;\n if (!host) return;\n this._externalPluginService.updateHostEventQueue(host.id, request).subscribe({\n next: () => {\n this.eventQueueModalOpen$.next(false);\n this.hostToEditEventQueue$.next(null);\n this._refreshHosts$.next();\n },\n error: () => {\n this._logger.error('Something went wrong with updating the plugin host event queue.');\n },\n });\n }\n\n public closeUsageModal(): void {\n this.usageModalOpen$.next(false);\n this.usageModalUsages$.next([]);\n this.usageModalEntityName = null;\n }\n\n public confirmReload(): void {\n window.location.reload();\n }\n\n public cancelReload(): void {\n this.hostsLoading$.next(true);\n this._refreshHosts$.next();\n }\n\n private _showHostInUseModal(\n host: ExternalPluginHost,\n usages: Array<ExternalPluginHostUsage>\n ): void {\n this.usageModalEntityName =\n host.name || this._translateService.instant('pluginManagement.hostInUseModal.thisHost');\n this.usageModalTitleKey = 'pluginManagement.hostInUseModal.title';\n this.usageModalDescriptionKey = 'pluginManagement.hostInUseModal.description';\n this.usageModalUsages$.next(usages);\n this.usageModalOpen$.next(true);\n }\n\n private _getStatusTag(status: 'CONNECTED' | 'UNREACHABLE'): CarbonTag {\n return {\n content: this._translateService.instant(`pluginManagement.hostStatus.${status}`),\n type: status === 'CONNECTED' ? 'green' : 'red',\n };\n }\n\n private _formatLastHealthCheck(lastHealthCheck: string | null): string {\n if (!lastHealthCheck) {\n return '-';\n }\n const date = new Date(lastHealthCheck);\n return date.toLocaleString(this._translateService.currentLang || 'en', {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n });\n }\n}\n","<!--\n ~ Copyright 2015-2026 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (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 ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\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\n *ngIf=\"{\n hosts: hosts$ | async,\n refreshing: hostsRefreshing$ | async,\n } as hostObs\"\n>\n <valtimo-carbon-list\n [loading]=\"hostsLoading$ | async\"\n [items]=\"hostObs.hosts\"\n [fields]=\"hostFields\"\n [actionItems]=\"hostActionItems\"\n [header]=\"false\"\n >\n <ng-container carbonToolbarContent>\n <cds-loading\n *ngIf=\"hostObs.refreshing\"\n size=\"sm\"\n [isActive]=\"true\"\n class=\"plugin-hosts-page__spinner\"\n ></cds-loading>\n\n <button cdsButton=\"primary\" [disabled]=\"hostsLoading$ | async\" (click)=\"openHostModal()\">\n {{ 'pluginManagement.addHost' | translate }}\n\n <svg cdsIcon=\"add\" size=\"16\" class=\"cds--btn__icon\"></svg>\n </button>\n </ng-container>\n\n <valtimo-no-results\n [action]=\"addHostButton\"\n [title]=\"'pluginManagement.noHosts' | translate\"\n ></valtimo-no-results>\n </valtimo-carbon-list>\n\n <ng-template #addHostButton>\n <button cdsButton=\"primary\" [disabled]=\"hostsLoading$ | async\" (click)=\"openHostModal()\">\n {{ 'pluginManagement.addHost' | translate }}\n\n <svg cdsIcon=\"add\" size=\"16\" class=\"cds--btn__icon\"></svg>\n </button>\n </ng-template>\n</ng-container>\n\n<valtimo-plugin-host-modal\n [errorMessage]=\"hostErrorMessage$ | async\"\n [kind]=\"'PLUGIN_HOST'\"\n [open]=\"hostModalOpen$ | async\"\n [submitting]=\"hostSubmitting$ | async\"\n (closeEvent)=\"closeHostModal()\"\n (submitEvent)=\"submitHost($event)\"\n></valtimo-plugin-host-modal>\n\n<valtimo-plugin-host-edit-modal\n [errorMessage]=\"editConnectionErrorMessage$ | async\"\n [host]=\"hostToEditConnection$ | async\"\n [open]=\"editConnectionModalOpen$ | async\"\n [submitting]=\"editConnectionSubmitting$ | async\"\n [variant]=\"'host'\"\n (closeEvent)=\"closeEditConnectionModal()\"\n (submitEvent)=\"submitConnectionUpdate($event)\"\n></valtimo-plugin-host-edit-modal>\n\n<valtimo-plugin-host-frontend-origins-modal\n [host]=\"hostToEditFrontendOrigins$ | async\"\n [open]=\"frontendOriginsModalOpen$ | async\"\n (closeEvent)=\"closeFrontendOriginsModal()\"\n (submitEvent)=\"submitFrontendOriginsUpdate($event)\"\n></valtimo-plugin-host-frontend-origins-modal>\n\n<valtimo-plugin-host-event-queue-modal\n [host]=\"hostToEditEventQueue$ | async\"\n [open]=\"eventQueueModalOpen$ | async\"\n (closeEvent)=\"closeEventQueueModal()\"\n (submitEvent)=\"submitEventQueueUpdate($event)\"\n></valtimo-plugin-host-event-queue-modal>\n\n<valtimo-confirmation-modal\n [showModalSubject$]=\"reloadModalOpen$\"\n [titleTranslationKey]=\"'pluginManagement.reloadModal.title'\"\n [contentTranslationKey]=\"'pluginManagement.reloadModal.description'\"\n [confirmButtonTextTranslationKey]=\"'pluginManagement.reloadModal.reload'\"\n [cancelButtonTextTranslationKey]=\"'pluginManagement.reloadModal.later'\"\n (confirmEvent)=\"confirmReload()\"\n (cancelEvent)=\"cancelReload()\"\n></valtimo-confirmation-modal>\n\n<valtimo-confirmation-modal\n [showModalSubject$]=\"deleteHostModalOpen$\"\n [titleTranslationKey]=\"'pluginManagement.deleteHostModal.title'\"\n [contentTranslationKey]=\"'pluginManagement.deleteHostModal.description'\"\n [confirmButtonTextTranslationKey]=\"'interface.delete'\"\n [confirmButtonType]=\"'danger'\"\n [cancelButtonTextTranslationKey]=\"'interface.cancel'\"\n (confirmEvent)=\"confirmDeleteHost()\"\n (cancelEvent)=\"cancelDeleteHost()\"\n></valtimo-confirmation-modal>\n\n<valtimo-plugin-usage-modal\n [descriptionTranslationKey]=\"usageModalDescriptionKey\"\n [entityName]=\"usageModalEntityName\"\n [open]=\"usageModalOpen$ | async\"\n [titleTranslationKey]=\"usageModalTitleKey\"\n [usages]=\"usageModalUsages$ | async\"\n (closeEvent)=\"closeUsageModal()\"\n></valtimo-plugin-usage-modal>\n","/*\n * Copyright 2015-2026 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (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 * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\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 {\n ChangeDetectionStrategy,\n Component,\n EventEmitter,\n Input,\n OnChanges,\n OnDestroy,\n Output,\n signal,\n SimpleChanges,\n ViewChild,\n} from '@angular/core';\nimport {CommonModule} from '@angular/common';\nimport {HttpErrorResponse} from '@angular/common/http';\nimport {TranslateModule, TranslateService} from '@ngx-translate/core';\nimport {\n ButtonModule,\n LayerModule,\n LoadingModule,\n ModalModule,\n NotificationModule,\n ProgressIndicatorModule,\n} from 'carbon-components-angular';\nimport {\n CARBON_CONSTANTS,\n ConfirmationModalModule,\n ValtimoCdsModalDirective,\n} from '@valtimo/components';\nimport {\n ExternalPluginDefinition,\n ExternalPluginGrantedEndpointEntry,\n ExternalPluginGrantedEventEntry,\n ExternalPluginEndpoint,\n ExternalPluginHost,\n ExternalPluginService,\n} from '@valtimo/plugin';\nimport {NGXLogger} from 'ngx-logger';\nimport {BehaviorSubject, of, Subscription, timer} from 'rxjs';\nimport {catchError, switchMap} from 'rxjs/operators';\nimport {PluginHostConnectionFormComponent} from '../plugin-host-connection-form/plugin-host-connection-form.component';\nimport {PluginExternalConfigureComponent} from '../plugin-external-configure/plugin-external-configure.component';\nimport {PluginExternalPermissionsComponent} from '../plugin-external-permissions/plugin-external-permissions.component';\nimport {cspAllowsFrameOrigin} from '../../utils';\nimport {PLUGIN_APP_ADD_MODAL_TEST_IDS} from '../../constants';\n\ntype ConnectState = 'idle' | 'connecting' | 'connected' | 'failed' | 'conflict' | 'timeout';\n\n/** The 409 code the backend returns when the app's plugin is already registered elsewhere. */\nconst APP_ALREADY_REGISTERED_CODE = 'APP_PLUGIN_ALREADY_REGISTERED';\n\n/**\n * Connects an app and configures it in a single stepper: Connect → Enter data → Permissions.\n *\n * Connecting registers the app as an external plugin host (kind APP) and waits for the app's\n * plugin definition to be discovered. Because the CSP meta tag is fixed at bootstrap, an app that\n * ships its own config bundle cannot be framed until the page is reloaded — in that case a\n * confirmation dialog announces the refresh and the flow resumes at the configuration step via\n * the `configureApp` query parameter on the apps page (see {@link PluginAppsPageComponent}).\n * When the current CSP already allows the app's origin (or no CSP is configured), the stepper\n * continues without a refresh.\n */\n@Component({\n standalone: true,\n selector: 'valtimo-plugin-app-add-modal',\n templateUrl: './plugin-app-add-modal.component.html',\n styleUrls: ['./plugin-app-add-modal.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n CommonModule,\n TranslateModule,\n ModalModule,\n ButtonModule,\n LayerModule,\n LoadingModule,\n NotificationModule,\n ProgressIndicatorModule,\n ConfirmationModalModule,\n ValtimoCdsModalDirective,\n PluginHostConnectionFormComponent,\n PluginExternalConfigureComponent,\n PluginExternalPermissionsComponent,\n ],\n})\nexport class PluginAppAddModalComponent implements OnChanges, OnDestroy {\n @ViewChild(PluginHostConnectionFormComponent)\n private _connectionForm: PluginHostConnectionFormComponent | undefined;\n\n @ViewChild(PluginExternalConfigureComponent)\n private _configureComponent: PluginExternalConfigureComponent | undefined;\n\n @Input() public open = false;\n /** When set, the stepper opens at the configuration step for this already-connected app. */\n @Input() public resumeHostId: string | null = null;\n\n @Output() public closeEvent = new EventEmitter<void>();\n @Output() public completedEvent = new EventEmitter<void>();\n\n public readonly $currentStep = signal<number>(0);\n public readonly $connectState = signal<ConnectState>('idle');\n public readonly $connectionFormValid = signal<boolean>(false);\n public readonly $definition = signal<ExternalPluginDefinition | null>(null);\n public readonly $resolvingDefinition = signal<boolean>(false);\n public readonly $resumeLoadFailed = signal<boolean>(false);\n public readonly $configValid = signal<boolean>(false);\n public readonly $permissionsValid = signal<boolean>(false);\n public readonly $saving = signal<boolean>(false);\n\n public readonly $endpoints = signal<Array<ExternalPluginEndpoint>>([]);\n public readonly $eventSubscriptions = signal<Array<string>>([]);\n public readonly $capabilities = signal<Array<string>>([]);\n public readonly $egress = signal<Array<string>>([]);\n public readonly $derivedEgress = signal<Array<string>>([]);\n\n /** Details of the conflicting registration, shown when connecting is rejected with a 409. */\n public readonly $conflict = signal<{pluginId: string; hostName: string} | null>(null);\n\n /**\n * Why connecting failed, rendered in the failed notification. The backend answers a fixable\n * mistake (a bind address as base URL, a broker over plaintext HTTP) with a 400 whose `detail`\n * explains it — `createHost` keeps that off the global error toast so it can be shown here.\n */\n public readonly $connectError = signal<string | null>(null);\n\n public readonly refreshModalOpen$ = new BehaviorSubject<boolean>(false);\n\n public progressSteps: Array<{label: string; complete: boolean}> = [];\n\n protected readonly testIds = PLUGIN_APP_ADD_MODAL_TEST_IDS;\n\n private _host: ExternalPluginHost | null = null;\n private _definitionPollSubscription: Subscription | null = null;\n private readonly _subscriptions = new Subscription();\n\n /** The connection form stays locked from the moment the host is created. */\n public get connectionLocked(): boolean {\n return ['connecting', 'connected', 'timeout'].includes(this.$connectState());\n }\n\n constructor(\n private readonly _externalPluginService: ExternalPluginService,\n private readonly _translateService: TranslateService,\n private readonly _logger: NGXLogger\n ) {\n this._buildProgressSteps();\n this._subscriptions.add(\n this._translateService.onLangChange.subscribe(() => this._buildProgressSteps())\n );\n }\n\n public ngOnChanges(changes: SimpleChanges): void {\n if (changes['open'] && this.open) {\n if (this.resumeHostId) {\n this._startResume(this.resumeHostId);\n }\n }\n }\n\n public ngOnDestroy(): void {\n this._subscriptions.unsubscribe();\n this._stopDefinitionPoll();\n }\n\n // --- Connect step ---\n\n public onConnectionFormValidChange(valid: boolean): void {\n this.$connectionFormValid.set(valid);\n }\n\n public onConnect(): void {\n const request = this._connectionForm?.buildRequest('APP');\n if (!request || this.connectionLocked) return;\n\n this.$connectState.set('connecting');\n this.$conflict.set(null);\n this.$connectError.set(null);\n this._externalPluginService.createHost(request, true).subscribe({\n next: host => {\n this._host = host;\n this._pollForDefinition(host.id);\n },\n error: (response: HttpErrorResponse) => {\n // The backend rejected and rolled back the registration because the app's plugin is\n // already registered under another host — tell the admin where, instead of a generic\n // failure. Nothing was created, so the form stays editable.\n if (response.status === 409 && response.error?.code === APP_ALREADY_REGISTERED_CODE) {\n const conflict = response.error?.conflicts?.[0];\n this.$conflict.set({\n pluginId: conflict?.pluginId ?? '',\n hostName:\n conflict?.existingHostName ??\n this._translateService.instant('pluginManagement.appAdd.conflictUnknownHost'),\n });\n this.$connectState.set('conflict');\n return;\n }\n\n this.$connectState.set('failed');\n this.$connectError.set(this._extractConnectError(response));\n this._logger.error('Something went wrong with connecting the app.');\n },\n });\n }\n\n public onRetryDiscovery(): void {\n if (!this._host) return;\n this.$connectState.set('connecting');\n this._pollForDefinition(this._host.id);\n }\n\n public onContinue(): void {\n const host = this._host;\n if (!host || this.$connectState() !== 'connected') return;\n\n // The CSP meta tag was built before this host existed. If it blocks the app's origin, the\n // page must be reloaded before the configuration step (the config bundle iframe would be\n // refused) — the apps page restores this stepper at the configuration step afterwards.\n if (cspAllowsFrameOrigin(this.$definition()?.baseUrl ?? host.baseUrl)) {\n this.$currentStep.set(1);\n } else {\n this.refreshModalOpen$.next(true);\n }\n }\n\n public onRefreshConfirm(): void {\n const host = this._host;\n if (!host) return;\n window.location.assign(this._buildResumeUrl(host.id));\n }\n\n public onRefreshCancel(): void {\n // Stay on the connected step; the admin can continue (and refresh) later. The app itself\n // remains registered either way.\n }\n\n // --- Configuration & permissions steps ---\n\n public onConfigValid(valid: boolean): void {\n this.$configValid.set(valid);\n }\n\n public onEndpointsResolved(endpoints: Array<ExternalPluginEndpoint>): void {\n this.$endpoints.set(endpoints);\n }\n\n public onEventSubscriptionsResolved(eventTypes: Array<string>): void {\n this.$eventSubscriptions.set(eventTypes);\n }\n\n public onCapabilitiesResolved(capabilities: Array<string>): void {\n this.$capabilities.set(capabilities);\n }\n\n public onEgressResolved(targets: Array<string>): void {\n this.$egress.set(targets);\n }\n\n public onDerivedEgressResolved(targets: Array<string>): void {\n this.$derivedEgress.set(targets);\n }\n\n public onPermissionsValid(valid: boolean): void {\n this.$permissionsValid.set(valid);\n }\n\n public onGrantedEndpointsChange(endpoints: Array<ExternalPluginGrantedEndpointEntry>): void {\n this._configureComponent?.setGrantedEndpoints(endpoints);\n }\n\n public onGrantedEventsChange(events: Array<ExternalPluginGrantedEventEntry>): void {\n this._configureComponent?.setGrantedEvents(events);\n }\n\n public onGrantedCapabilitiesChange(capabilities: Array<string>): void {\n this._configureComponent?.setGrantedCapabilities(capabilities);\n }\n\n public onGrantedEgressChange(targets: Array<string>): void {\n this._configureComponent?.setGrantedEgress(targets);\n }\n\n public goToPermissionsStep(): void {\n if (this.$configValid()) this.$currentStep.set(2);\n }\n\n public onComplete(): void {\n if (!this.$permissionsValid() || this.$saving()) return;\n this._configureComponent?.triggerSave();\n }\n\n public onExternalSave(event: {\n definitionId: string;\n title: string;\n properties: Record<string, unknown>;\n grantedEndpoints: Array<ExternalPluginGrantedEndpointEntry>;\n grantedEvents: Array<ExternalPluginGrantedEventEntry>;\n grantedCapabilities: Array<string>;\n grantedEgress: Array<string>;\n }): void {\n this.$saving.set(true);\n this._externalPluginService\n .createConfiguration({\n definitionId: event.definitionId,\n title: event.title,\n properties: event.properties,\n grantedEndpoints: event.grantedEndpoints,\n grantedEvents: event.grantedEvents,\n grantedCapabilities: event.grantedCapabilities,\n grantedEgress: event.grantedEgress,\n })\n .subscribe({\n next: () => {\n this.completedEvent.emit();\n this._resetAfterClose();\n },\n error: () => {\n this.$saving.set(false);\n this._logger.error('Something went wrong with saving the app configuration.');\n },\n });\n }\n\n public onClose(): void {\n if (this.$saving()) return;\n this.closeEvent.emit();\n this._resetAfterClose();\n }\n\n // --- Private helpers ---\n\n private _startResume(hostId: string): void {\n this.$currentStep.set(1);\n this.$connectState.set('connected');\n this.$resumeLoadFailed.set(false);\n\n this._externalPluginService\n .getHosts()\n .pipe(catchError(() => of([] as ExternalPluginHost[])))\n .subscribe(hosts => {\n const host = hosts.find(h => h.id === hostId) ?? null;\n if (!host) {\n this.$resumeLoadFailed.set(true);\n return;\n }\n this._host = host;\n this._pollForDefinition(host.id);\n });\n }\n\n /**\n * Discovery runs synchronously (best-effort) when the host is created, so the definition is\n * usually there on the first try; the poll covers an app that is slow to come up, bounded to\n * roughly the backend's own periodic discovery interval.\n */\n private _pollForDefinition(hostId: string): void {\n const MAX_TRIES = 15;\n let tries = 0;\n\n this._stopDefinitionPoll();\n this.$resolvingDefinition.set(true);\n\n this._definitionPollSubscription = timer(0, 2000)\n .pipe(\n switchMap(() =>\n this._externalPluginService\n .getDefinitions()\n .pipe(catchError(() => of([] as ExternalPluginDefinition[])))\n )\n )\n .subscribe(definitions => {\n tries++;\n const definition =\n definitions.find(d => d.hostId === hostId && d.status === 'AVAILABLE') ??\n definitions.find(d => d.hostId === hostId) ??\n null;\n\n if (definition) {\n this._stopDefinitionPoll();\n this.$resolvingDefinition.set(false);\n this.$definition.set(definition);\n this.$connectState.set('connected');\n } else if (tries >= MAX_TRIES) {\n this._stopDefinitionPoll();\n this.$resolvingDefinition.set(false);\n this.$connectState.set('timeout');\n }\n });\n }\n\n private _stopDefinitionPoll(): void {\n this._definitionPollSubscription?.unsubscribe();\n this._definitionPollSubscription = null;\n }\n\n private _buildResumeUrl(hostId: string): string {\n const url = new URL(window.location.href);\n url.searchParams.set('configureApp', hostId);\n return url.toString();\n }\n\n /** See `PluginHostsPageComponent._extractHostError` — the message precedence is identical. */\n private _extractConnectError(response: HttpErrorResponse): string {\n const body = response?.error;\n const candidate =\n (typeof body?.detail === 'string' && body.detail) ||\n (typeof body?.message === 'string' && body.message) ||\n (typeof body?.title === 'string' && body.title) ||\n '';\n return (\n candidate.trim() ||\n this._translateService.instant('pluginManagement.host.createFailedFallback')\n );\n }\n\n private _resetAfterClose(): void {\n setTimeout(() => {\n this.$currentStep.set(0);\n this.$connectState.set('idle');\n this.$connectionFormValid.set(false);\n this.$definition.set(null);\n this.$resolvingDefinition.set(false);\n this.$resumeLoadFailed.set(false);\n this.$configValid.set(false);\n this.$permissionsValid.set(false);\n this.$saving.set(false);\n this.$endpoints.set([]);\n this.$eventSubscriptions.set([]);\n this.$capabilities.set([]);\n this.$egress.set([]);\n this.$derivedEgress.set([]);\n this.$conflict.set(null);\n this.$connectError.set(null);\n this.refreshModalOpen$.next(false);\n this._host = null;\n this._stopDefinitionPoll();\n this._connectionForm?.reset();\n }, CARBON_CONSTANTS.modalAnimationMs);\n }\n\n /**\n * Carbon's progress indicator recomputes step completion only inside its `current` setter, so a\n * rebuilt steps array must carry the `complete` flags itself: a rebuild with an unchanged current\n * step — the translation file finishing to load after the modal already resumed at the\n * configuration step — would otherwise wipe the checkmarks of the completed steps.\n */\n private _buildProgressSteps(): void {\n this.progressSteps = [\n 'pluginManagement.appAdd.steps.connection',\n 'pluginManagement.appAdd.steps.configuration',\n 'pluginManagement.appAdd.steps.permissions',\n ].map((key, index) => ({\n label: this._translateService.instant(key),\n complete: index < this.$currentStep(),\n }));\n }\n}\n","<!--\n ~ Copyright 2015-2026 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (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 ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\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<cds-modal valtimoCdsModal [open]=\"open\" size=\"lg\" (close)=\"onClose()\">\n <cds-modal-header [showCloseButton]=\"true\" (closeSelect)=\"onClose()\">\n <h3 cdsModalHeaderHeading class=\"plugin-app-add-modal__header\">\n {{ 'pluginManagement.addApp' | translate }}\n </h3>\n\n <!--\n `[steps]` must bind before `[current]`: Carbon marks preceding steps complete inside the\n `current` setter, which no-ops if `steps` isn't set yet. When the modal opens straight at the\n configuration step (resume after the CSP reload), `current` is 1 from the first render, so\n binding it after `steps` is what lets the connection step show as complete.\n -->\n <cds-progress-indicator\n [steps]=\"progressSteps\"\n [current]=\"$currentStep()\"\n spacing=\"equal\"\n class=\"plugin-app-add-modal__progress\"\n ></cds-progress-indicator>\n </cds-modal-header>\n\n <section cdsModalContent [cdsLayer]=\"1\">\n <div [hidden]=\"$currentStep() !== 0\">\n @if ($connectState() === 'connected') {\n <cds-inline-notification\n [notificationObj]=\"{\n type: 'success',\n title: ('pluginManagement.appAdd.connectedTitle' | translate),\n message: ('pluginManagement.appAdd.connectedDescription' | translate),\n showClose: false,\n lowContrast: true,\n }\"\n class=\"plugin-app-add-modal__notification plugin-app-add-modal__notification--top\"\n ></cds-inline-notification>\n }\n\n <valtimo-plugin-host-connection-form\n [active]=\"open && !resumeHostId\"\n [disabled]=\"connectionLocked\"\n variant=\"app\"\n (validChange)=\"onConnectionFormValidChange($event)\"\n ></valtimo-plugin-host-connection-form>\n\n @if ($connectState() === 'connecting') {\n <div class=\"plugin-app-add-modal__status\">\n <cds-loading size=\"sm\" [isActive]=\"true\"></cds-loading>\n\n <span>{{\n ($resolvingDefinition()\n ? 'pluginManagement.appAdd.preparing'\n : 'pluginManagement.appAdd.connecting'\n ) | translate\n }}</span>\n </div>\n }\n\n @if ($connectState() === 'timeout') {\n <cds-inline-notification\n [notificationObj]=\"{\n type: 'warning',\n title: ('pluginManagement.appAdd.discoveryTimeoutTitle' | translate),\n message: ('pluginManagement.appAdd.discoveryTimeoutDescription' | translate),\n showClose: false,\n lowContrast: true,\n }\"\n class=\"plugin-app-add-modal__notification\"\n ></cds-inline-notification>\n }\n\n @if ($connectState() === 'failed') {\n <cds-inline-notification\n [notificationObj]=\"{\n type: 'error',\n title: ('pluginManagement.appAdd.connectFailed' | translate),\n message: $connectError() ?? '',\n showClose: false,\n lowContrast: true,\n }\"\n class=\"plugin-app-add-modal__notification\"\n ></cds-inline-notification>\n }\n\n @if ($connectState() === 'conflict' && $conflict(); as conflict) {\n <cds-inline-notification\n [notificationObj]=\"{\n type: 'error',\n title: ('pluginManagement.appAdd.conflictTitle' | translate),\n message:\n ('pluginManagement.appAdd.conflictDescription'\n | translate: {pluginId: conflict.pluginId, hostName: conflict.hostName}),\n showClose: false,\n lowContrast: true,\n }\"\n class=\"plugin-app-add-modal__notification\"\n ></cds-inline-notification>\n }\n </div>\n\n <div [hidden]=\"$currentStep() !== 1\">\n @if ($definition(); as definition) {\n <valtimo-plugin-external-configure\n [definitionId]=\"definition.id\"\n (capabilitiesResolved)=\"onCapabilitiesResolved($event)\"\n (derivedEgressResolved)=\"onDerivedEgressResolved($event)\"\n (egressResolved)=\"onEgressResolved($event)\"\n (endpointsResolved)=\"onEndpointsResolved($event)\"\n (eventSubscriptionsResolved)=\"onEventSubscriptionsResolved($event)\"\n (saveEvent)=\"onExternalSave($event)\"\n (validEvent)=\"onConfigValid($event)\"\n ></valtimo-plugin-external-configure>\n } @else if ($resumeLoadFailed()) {\n <cds-inline-notification\n [notificationObj]=\"{\n type: 'error',\n title: ('pluginManagement.appAdd.resumeLoadFailed' | translate),\n showClose: false,\n lowContrast: true,\n }\"\n class=\"plugin-app-add-modal__notification\"\n ></cds-inline-notification>\n } @else if ($connectState() === 'timeout') {\n <cds-inline-notification\n [notificationObj]=\"{\n type: 'warning',\n title: ('pluginManagement.appAdd.discoveryTimeoutTitle' | translate),\n message: ('pluginManagement.appAdd.discoveryTimeoutDescription' | translate),\n showClose: false,\n lowContrast: true,\n }\"\n class=\"plugin-app-add-modal__notification\"\n ></cds-inline-notification>\n } @else {\n <div class=\"plugin-app-add-modal__status\">\n <cds-loading size=\"sm\" [isActive]=\"true\"></cds-loading>\n\n <span>{{ 'pluginManagement.appAdd.preparing' | translate }}</span>\n </div>\n }\n </div>\n\n <div [hidden]=\"$currentStep() !== 2\">\n <valtimo-plugin-external-permissions\n [capabilities]=\"$capabilities()\"\n [derivedEgress]=\"$derivedEgress()\"\n [egress]=\"$egress()\"\n [endpoints]=\"$endpoints()\"\n [eventSubscriptions]=\"$eventSubscriptions()\"\n (grantedCapabilitiesChange)=\"onGrantedCapabilitiesChange($event)\"\n (grantedEgressChange)=\"onGrantedEgressChange($event)\"\n (grantedEndpointsChange)=\"onGrantedEndpointsChange($event)\"\n (grantedEventsChange)=\"onGrantedEventsChange($event)\"\n (validEvent)=\"onPermissionsValid($event)\"\n ></valtimo-plugin-external-permissions>\n </div>\n </section>\n\n <cds-modal-footer>\n <button\n cdsButton=\"ghost\"\n [attr.data-test-id]=\"testIds.cancelButton\"\n [disabled]=\"$saving()\"\n (click)=\"onClose()\"\n >\n {{ 'stepper.cancelButtonText' | translate }}\n </button>\n\n @if ($currentStep() === 0) {\n @switch ($connectState()) {\n @case ('connected') {\n <button\n cdsButton=\"primary\"\n [attr.data-test-id]=\"testIds.continueButton\"\n (click)=\"onContinue()\"\n >\n {{ 'pluginManagement.appAdd.continue' | translate }}\n </button>\n }\n\n @case ('timeout') {\n <button\n cdsButton=\"primary\"\n [attr.data-test-id]=\"testIds.retryButton\"\n (click)=\"onRetryDiscovery()\"\n >\n {{ 'pluginManagement.appAdd.retry' | translate }}\n </button>\n }\n\n @default {\n <button\n cdsButton=\"primary\"\n [attr.data-test-id]=\"testIds.connectButton\"\n [disabled]=\"!$connectionFormValid() || connectionLocked\"\n (click)=\"onConnect()\"\n >\n {{ 'pluginManagement.appAdd.connect' | translate }}\n </button>\n }\n }\n }\n\n @if ($currentStep() === 1) {\n @if ($connectState() === 'timeout') {\n <button\n cdsButton=\"primary\"\n [attr.data-test-id]=\"testIds.retryButton\"\n (click)=\"onRetryDiscovery()\"\n >\n {{ 'pluginManagement.appAdd.retry' | translate }}\n </button>\n } @else {\n <button\n cdsButton=\"primary\"\n [attr.data-test-id]=\"testIds.nextButton\"\n [disabled]=\"!$configValid()\"\n (click)=\"goToPermissionsStep()\"\n >\n {{ 'pluginManagement.appAdd.steps.permissions' | translate }}\n </button>\n }\n }\n\n @if ($currentStep() === 2) {\n <button\n cdsButton=\"primary\"\n [attr.data-test-id]=\"testIds.completeButton\"\n [disabled]=\"!$permissionsValid() || $saving()\"\n (click)=\"onComplete()\"\n >\n {{ 'pluginManagement.appAdd.complete' | translate }}\n </button>\n }\n </cds-modal-footer>\n</cds-modal>\n\n<valtimo-confirmation-modal\n [cancelButtonTextTranslationKey]=\"'pluginManagement.appAdd.refreshModal.cancel'\"\n [confirmButtonTextTranslationKey]=\"'pluginManagement.appAdd.refreshModal.confirm'\"\n [contentTranslationKey]=\"'pluginManagement.appAdd.refreshModal.description'\"\n [showModalSubject$]=\"refreshModalOpen$\"\n [titleTranslationKey]=\"'pluginManagement.appAdd.refreshModal.title'\"\n (cancelEvent)=\"onRefreshCancel()\"\n (confirmEvent)=\"onRefreshConfirm()\"\n></valtimo-confirmation-modal>\n","/*\n * Copyright 2015-2026 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (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 * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\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 {\n ChangeDetectionStrategy,\n Component,\n EventEmitter,\n Input,\n OnChanges,\n Output,\n signal,\n SimpleChanges,\n} from '@angular/core';\nimport {CommonModule} from '@angular/common';\nimport {TranslateModule} from '@ngx-translate/core';\nimport {ButtonModule, LoadingModule, ModalModule, NotificationModule} from 'carbon-components-angular';\nimport {ValtimoCdsModalDirective} from '@valtimo/components';\nimport {\n ExternalPluginDefinition,\n ExternalPluginEndpoint,\n ExternalPluginService,\n} from '@valtimo/plugin';\nimport {PLUGIN_EXTERNAL_REVIEW_MODAL_TEST_IDS} from '../../constants';\nimport {PluginExternalPermissionsComponent} from '../plugin-external-permissions/plugin-external-permissions.component';\n\n/**\n * Review-and-accept flow for a definition whose host serves different content than what was\n * accepted (a changed plugin package, or — for URL apps without package hashing — a changed\n * manifest). Deliberately identical to the activation flow: the full *pending* permission\n * footprint with the standard acceptance text and all-or-nothing checkbox — no separate\n * changed-permissions treatment. Accepting is a single call: the backend pins the reviewed\n * content, promotes the pending manifest, and re-grants every configuration of the definition to\n * the manifest's declared sets in one transaction.\n */\n@Component({\n standalone: true,\n selector: 'valtimo-plugin-external-review-modal',\n templateUrl: './plugin-external-review-modal.component.html',\n styleUrls: ['./plugin-external-review-modal.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n CommonModule,\n TranslateModule,\n ModalModule,\n ButtonModule,\n LoadingModule,\n NotificationModule,\n ValtimoCdsModalDirective,\n PluginExternalPermissionsComponent,\n ],\n})\nexport class PluginExternalReviewModalComponent implements OnChanges {\n @Input() public open = false;\n @Input() public definition: ExternalPluginDefinition | null = null;\n\n @Output() public closeEvent = new EventEmitter<void>();\n @Output() public acceptedEvent = new EventEmitter<void>();\n\n public readonly $loading = signal(false);\n public readonly $errorMessage = signal<string | null>(null);\n public readonly $permissionsValid = signal(false);\n\n public readonly $pendingEndpoints = signal<Array<ExternalPluginEndpoint>>([]);\n public readonly $pendingEvents = signal<Array<string>>([]);\n public readonly $pendingCapabilities = signal<Array<string>>([]);\n public readonly $pendingEgress = signal<Array<string>>([]);\n\n protected readonly testIds = PLUGIN_EXTERNAL_REVIEW_MODAL_TEST_IDS;\n\n constructor(private readonly _externalPluginService: ExternalPluginService) {}\n\n public ngOnChanges(changes: SimpleChanges): void {\n if (!changes['definition'] && !changes['open']) return;\n\n this.$errorMessage.set(null);\n this.$permissionsValid.set(false);\n\n const pending = this.definition?.pendingManifest ?? null;\n this.$pendingEndpoints.set(pending?.permissions?.endpoints ?? []);\n this.$pendingCapabilities.set(pending?.permissions?.capabilities ?? []);\n this.$pendingEgress.set(pending?.permissions?.egress ?? []);\n this.$pendingEvents.set(pending?.eventSubscriptions ?? []);\n }\n\n public onPermissionsValid(valid: boolean): void {\n this.$permissionsValid.set(valid);\n }\n\n public onClose(): void {\n this.closeEvent.emit();\n }\n\n /**\n * Echoes the reviewed pending hash — acceptance of a *specific* state, not of whatever the host\n * serves by now. The backend re-grants the definition's configurations in the same act.\n */\n public onAccept(): void {\n const definition = this.definition;\n const pendingContentHash = definition?.pendingContentHash;\n if (!definition || !pendingContentHash) return;\n\n this.$loading.set(true);\n this.$errorMessage.set(null);\n\n this._externalPluginService.acceptDefinitionContent(definition.id, pendingContentHash).subscribe({\n next: () => {\n this.$loading.set(false);\n this.acceptedEvent.emit();\n },\n error: response => {\n this.$loading.set(false);\n this.$errorMessage.set(\n (typeof response?.error?.detail === 'string' && response.error.detail) ||\n (typeof response?.error?.message === 'string' && response.error.message) ||\n null\n );\n },\n });\n }\n}\n","<!--\n ~ Copyright 2015-2026 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (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 ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\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<cds-modal *ngIf=\"open\" [open]=\"open\" size=\"md\" valtimoCdsModal>\n <cds-modal-header (closeSelect)=\"onClose()\">\n {{ 'pluginManagement.review.modalTitle' | translate }}\n </cds-modal-header>\n\n <section cdsModalContent>\n <cds-loading *ngIf=\"$loading()\" [isActive]=\"true\" size=\"sm\"></cds-loading>\n\n <ng-container *ngIf=\"!$loading()\">\n <cds-inline-notification\n *ngIf=\"$errorMessage() as errorMessage\"\n [notificationObj]=\"{\n type: 'error',\n title: ('pluginManagement.review.failed' | translate),\n message: errorMessage,\n showClose: false,\n lowContrast: true,\n }\"\n class=\"plugin-external-review-modal__notification\"\n ></cds-inline-notification>\n\n <valtimo-plugin-external-permissions\n [capabilities]=\"$pendingCapabilities()\"\n [egress]=\"$pendingEgress()\"\n [endpoints]=\"$pendingEndpoints()\"\n [eventSubscriptions]=\"$pendingEvents()\"\n (validEvent)=\"onPermissionsValid($event)\"\n ></valtimo-plugin-external-permissions>\n </ng-container>\n </section>\n\n <cds-modal-footer>\n <button\n cdsButton=\"secondary\"\n [disabled]=\"$loading()\"\n (click)=\"onClose()\"\n [attr.data-test-id]=\"testIds.cancelButton\"\n >\n {{ 'interface.cancel' | translate }}\n </button>\n\n <button\n cdsButton=\"primary\"\n [disabled]=\"!$permissionsValid() || $loading()\"\n (click)=\"onAccept()\"\n [attr.data-test-id]=\"testIds.acceptButton\"\n >\n {{ 'pluginManagement.review.accept' | translate }}\n </button>\n </cds-modal-footer>\n</cds-modal>\n","/*\n * Copyright 2015-2026 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (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 * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\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 {ChangeDetectionStrategy, Component, OnDestroy, OnInit, signal} from '@angular/core';\nimport {CommonModule} from '@angular/common';\nimport {ActivatedRoute, Router} from '@angular/router';\nimport {TranslateModule, TranslateService} from '@ngx-translate/core';\nimport {HttpErrorResponse} from '@angular/common/http';\nimport {\n ActionItem,\n CarbonListModule,\n CarbonTag,\n ColumnConfig,\n ConfirmationModalModule,\n ViewType,\n} from '@valtimo/components';\nimport {\n ExternalPluginConfiguration,\n ExternalPluginDefinition,\n ExternalPluginHost,\n ExternalPluginHostConnectionUpdateRequest,\n ExternalPluginHostEventQueueUpdateRequest,\n ExternalPluginHostUsage,\n ExternalPluginService,\n} from '@valtimo/plugin';\nimport {ButtonModule, LoadingModule} from 'carbon-components-angular';\nimport {\n BehaviorSubject,\n EMPTY,\n forkJoin,\n fromEvent,\n merge,\n Observable,\n of,\n Subject,\n timer,\n} from 'rxjs';\nimport {\n catchError,\n distinctUntilChanged,\n map,\n startWith,\n switchMap,\n take,\n takeUntil,\n tap,\n} from 'rxjs/operators';\nimport {isEqual} from 'lodash';\nimport {NGXLogger} from 'ngx-logger';\nimport {PluginAppAddModalComponent} from '../plugin-app-add-modal/plugin-app-add-modal.component';\nimport {PluginExternalEditModalComponent} from '../plugin-external-edit-modal/plugin-external-edit-modal.component';\nimport {PluginExternalReviewModalComponent} from '../plugin-external-review-modal/plugin-external-review-modal.component';\nimport {PluginHostEditModalComponent} from '../plugin-host-edit-modal/plugin-host-edit-modal.component';\nimport {PluginHostEventQueueModalComponent} from '../plugin-host-event-queue-modal/plugin-host-event-queue-modal.component';\nimport {PluginHostFrontendOriginsModalComponent} from '../plugin-host-frontend-origins-modal/plugin-host-frontend-origins-modal.component';\nimport {PluginLogModalComponent} from '../plugin-log-modal/plugin-log-modal.component';\nimport {PluginUsageModalComponent} from '../plugin-usage-modal/plugin-usage-modal.component';\nimport {UnifiedPluginConfigurationRow} from '../../models';\nimport {cspAllowsFrameOrigin} from '../../utils';\n\n/** One row on the apps page: the APP-kind host enriched with its discovered plugin and configuration. */\ninterface PluginAppRow extends ExternalPluginHost {\n statusTags: CarbonTag[];\n lastHealthCheckFormatted: string;\n configurationTitle: string;\n definition: ExternalPluginDefinition | null;\n configuration: ExternalPluginConfiguration | null;\n /** Whether the app's plugin declares the `log` capability — apps without it serve no logs endpoint. */\n supportsLogs: boolean;\n /** The app changed its manifest/version after acceptance; an admin must review before it runs again. */\n reviewRequired: boolean;\n}\n\n/** Query parameter that restores the add-app stepper at the configuration step after a reload. */\nconst CONFIGURE_APP_QUERY_PARAM = 'configureApp';\n\n/**\n * Manifest capability an app must declare for its host to expose a logs endpoint. An app that does\n * not declare it (e.g. a lightweight app that only serves a plugin definition) has no logs to fetch,\n * so the logs action is disabled rather than left to fail against a missing endpoint. Plugins\n * uploaded to a full plugin host are not gated this way — the host always serves the logs endpoint.\n */\nconst LOG_CAPABILITY = 'log';\n\n@Component({\n standalone: true,\n templateUrl: './plugin-apps-page.component.html',\n styleUrls: ['./plugin-apps-page.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n CommonModule,\n TranslateModule,\n ButtonModule,\n LoadingModule,\n CarbonListModule,\n ConfirmationModalModule,\n PluginAppAddModalComponent,\n PluginExternalEditModalComponent,\n PluginExternalReviewModalComponent,\n PluginHostEditModalComponent,\n PluginHostEventQueueModalComponent,\n PluginHostFrontendOriginsModalComponent,\n PluginLogModalComponent,\n PluginUsageModalComponent,\n ],\n})\nexport class PluginAppsPageComponent implements OnInit, OnDestroy {\n private readonly _destroy$ = new Subject<void>();\n private readonly _refreshApps$ = new Subject<void>();\n private _appsInitialLoad = true;\n\n private readonly _tabVisible$: Observable<boolean> = fromEvent(document, 'visibilitychange').pipe(\n startWith(null),\n map(() => document.visibilityState === 'visible')\n );\n\n public readonly appsLoading$ = new BehaviorSubject<boolean>(true);\n public readonly appsRefreshing$ = new BehaviorSubject<boolean>(false);\n\n // --- Add / configure stepper ---\n public readonly $addModalOpen = signal<boolean>(false);\n public readonly $resumeHostId = signal<string | null>(null);\n\n // --- Refresh-before-configure dialog (list action on an app added in this page session) ---\n public readonly refreshModalOpen$ = new BehaviorSubject<boolean>(false);\n private _pendingRefreshHostId: string | null = null;\n\n // --- Edit configuration modal ---\n public readonly $editModalOpen = signal<boolean>(false);\n public readonly $selectedConfiguration = signal<UnifiedPluginConfigurationRow | null>(null);\n\n // --- Review & accept changed content/permissions ---\n public readonly $reviewModalOpen = signal<boolean>(false);\n public readonly $reviewDefinition = signal<ExternalPluginDefinition | null>(null);\n\n // --- Configuration delete ---\n public readonly deleteConfigurationModalOpen$ = new BehaviorSubject<boolean>(false);\n public configurationToDelete: {id: string; title: string} | null = null;\n\n // --- Logs modal ---\n public readonly $logModalOpen = signal<boolean>(false);\n public readonly $logConfigurationId = signal<string | null>(null);\n public readonly $logConfigurationTitle = signal<string>('');\n\n // --- Host delete ---\n public readonly deleteHostModalOpen$ = new BehaviorSubject<boolean>(false);\n public hostToDelete: ExternalPluginHost | null = null;\n\n public readonly eventQueueModalOpen$ = new BehaviorSubject<boolean>(false);\n public readonly hostToEditEventQueue$ = new BehaviorSubject<ExternalPluginHost | null>(null);\n\n public readonly editConnectionModalOpen$ = new BehaviorSubject<boolean>(false);\n public readonly hostToEditConnection$ = new BehaviorSubject<ExternalPluginHost | null>(null);\n public readonly editConnectionSubmitting$ = new BehaviorSubject<boolean>(false);\n public readonly editConnectionErrorMessage$ = new BehaviorSubject<string | null>(null);\n public readonly reloadModalOpen$ = new BehaviorSubject<boolean>(false);\n\n public readonly frontendOriginsModalOpen$ = new BehaviorSubject<boolean>(false);\n public readonly hostToEditFrontendOrigins$ = new BehaviorSubject<ExternalPluginHost | null>(null);\n\n public readonly usageModalOpen$ = new BehaviorSubject<boolean>(false);\n public readonly usageModalUsages$ = new BehaviorSubject<Array<ExternalPluginHostUsage>>([]);\n public usageModalEntityName: string | null = null;\n public usageModalTitleKey = '';\n public usageModalDescriptionKey = '';\n\n public readonly appFields: ColumnConfig[] = [\n {\n key: 'name',\n label: 'pluginManagement.labels.name',\n viewType: ViewType.TEXT,\n },\n {\n key: 'baseUrl',\n label: 'pluginManagement.labels.baseUrl',\n viewType: ViewType.TEXT,\n },\n {\n key: 'statusTags',\n label: 'pluginManagement.labels.status',\n viewType: ViewType.TAGS,\n tagAmount: 2,\n },\n {\n key: 'lastHealthCheckFormatted',\n label: 'pluginManagement.labels.lastHealthCheck',\n viewType: ViewType.TEXT,\n },\n {\n key: 'configurationTitle',\n label: 'pluginManagement.labels.configuration',\n viewType: ViewType.TEXT,\n },\n ];\n\n public readonly appActionItems: ActionItem[] = [\n // Configuring an app for the first time happens through the add-app stepper (or a row click on\n // an unconfigured app); a dedicated menu entry that only ever showed disabled once configured is\n // omitted.\n {\n callback: this.editConfiguration.bind(this),\n label: 'pluginManagement.editConfiguration',\n disabledCallback: (row: PluginAppRow) => !row.configuration,\n },\n {\n callback: this.reviewChanges.bind(this),\n label: 'pluginManagement.review.menuItem',\n disabledCallback: (row: PluginAppRow) => !row.reviewRequired,\n },\n {\n callback: this.viewLogs.bind(this),\n label: 'pluginManagement.logs.menuItem',\n // Also disabled when the app declares no `log` capability: its host serves no logs endpoint,\n // so fetching would fail rather than return an empty page.\n disabledCallback: (row: PluginAppRow) => !row.configuration || !row.supportsLogs,\n },\n {\n callback: this.editHostConnection.bind(this),\n label: 'pluginManagement.editConnection',\n },\n {\n callback: this.editHostEventQueue.bind(this),\n label: 'pluginManagement.editEventQueue',\n },\n {\n callback: this.editHostFrontendOrigins.bind(this),\n label: 'pluginManagement.editFrontendOrigins',\n },\n {\n callback: this.deleteHost.bind(this),\n label: 'interface.delete',\n type: 'danger',\n },\n ];\n\n public readonly apps$: Observable<Array<PluginAppRow>> = merge(\n this._tabVisible$.pipe(switchMap(visible => (visible ? timer(0, 5000) : EMPTY))),\n this._refreshApps$\n ).pipe(\n takeUntil(this._destroy$),\n tap(() => {\n if (!this._appsInitialLoad) {\n this.appsRefreshing$.next(true);\n }\n }),\n switchMap(() =>\n forkJoin({\n hosts: this._externalPluginService\n .getHosts()\n .pipe(catchError(() => of([] as ExternalPluginHost[]))),\n definitions: this._externalPluginService\n .getDefinitions()\n .pipe(catchError(() => of([] as ExternalPluginDefinition[]))),\n configurations: this._externalPluginService\n .getConfigurations()\n .pipe(catchError(() => of([] as ExternalPluginConfiguration[]))),\n })\n ),\n switchMap(({hosts, definitions, configurations}) =>\n this._translateService\n .stream('key')\n .pipe(\n map(() =>\n hosts\n .filter(host => host.kind === 'APP')\n .map(host => this._toAppRow(host, definitions, configurations))\n )\n )\n ),\n tap(() => {\n this._appsInitialLoad = false;\n this.appsLoading$.next(false);\n this.appsRefreshing$.next(false);\n }),\n distinctUntilChanged((prev, curr) => isEqual(prev, curr))\n );\n\n constructor(\n private readonly _logger: NGXLogger,\n private readonly _route: ActivatedRoute,\n private readonly _router: Router,\n private readonly _translateService: TranslateService,\n private readonly _externalPluginService: ExternalPluginService\n ) {}\n\n public ngOnInit(): void {\n // Restore the add-app stepper at the configuration step after the CSP refresh (or after a\n // manual reload while configuring).\n const resumeHostId = this._route.snapshot.queryParamMap.get(CONFIGURE_APP_QUERY_PARAM);\n if (resumeHostId) {\n this.$resumeHostId.set(resumeHostId);\n this.$addModalOpen.set(true);\n }\n }\n\n public ngOnDestroy(): void {\n this._destroy$.next();\n this._destroy$.complete();\n }\n\n // --- Add / configure stepper ---\n\n public openAddModal(): void {\n this.$resumeHostId.set(null);\n this.$addModalOpen.set(true);\n }\n\n public onAddModalClose(): void {\n this._closeAddModal();\n }\n\n public onAddModalCompleted(): void {\n this._closeAddModal();\n }\n\n public onRowClicked(row: PluginAppRow): void {\n if (row.reviewRequired) {\n // Nothing of the app runs until the change is reviewed — surface that flow first.\n this.reviewChanges(row);\n } else if (row.configuration) {\n this.editConfiguration(row);\n } else {\n this.configureApp(row);\n }\n }\n\n // --- Review & accept ---\n\n public reviewChanges(row: PluginAppRow): void {\n if (!row.reviewRequired || !row.definition) return;\n this.$reviewDefinition.set(row.definition);\n this.$reviewModalOpen.set(true);\n }\n\n public closeReviewModal(): void {\n this.$reviewModalOpen.set(false);\n this.$reviewDefinition.set(null);\n }\n\n public onReviewAccepted(): void {\n this.closeReviewModal();\n this._refreshApps$.next();\n }\n\n public configureApp(row: PluginAppRow): void {\n if (row.configuration) return;\n\n // An app registered during this page session is not yet covered by the bootstrap CSP —\n // configuring it requires the same refresh-and-resume the stepper uses.\n if (cspAllowsFrameOrigin(row.baseUrl)) {\n this._openResume(row.id);\n } else {\n this._pendingRefreshHostId = row.id;\n this.refreshModalOpen$.next(true);\n }\n }\n\n public onRefreshConfirm(): void {\n if (!this._pendingRefreshHostId) return;\n const url = new URL(window.location.href);\n url.searchParams.set(CONFIGURE_APP_QUERY_PARAM, this._pendingRefreshHostId);\n window.location.assign(url.toString());\n }\n\n public onRefreshCancel(): void {\n this._pendingRefreshHostId = null;\n }\n\n private _openResume(hostId: string): void {\n this.$resumeHostId.set(hostId);\n this.$addModalOpen.set(true);\n this._setConfigureAppQueryParam(hostId);\n }\n\n private _closeAddModal(): void {\n this.$addModalOpen.set(false);\n this.$resumeHostId.set(null);\n this._setConfigureAppQueryParam(null);\n this.appsLoading$.next(true);\n this._refreshApps$.next();\n }\n\n /** Keeps the resume parameter in the URL while configuring, so a manual reload restores the step. */\n private _setConfigureAppQueryParam(hostId: string | null): void {\n this._router.navigate([], {\n relativeTo: this._route,\n queryParams: {[CONFIGURE_APP_QUERY_PARAM]: hostId},\n queryParamsHandling: 'merge',\n replaceUrl: true,\n });\n }\n\n // --- Edit configuration ---\n\n public editConfiguration(row: PluginAppRow): void {\n const configuration = row.configuration;\n if (!configuration) return;\n\n this.$selectedConfiguration.set({\n id: configuration.id,\n title: configuration.title,\n pluginName: '',\n definitionKey: row.definition?.pluginId ?? '',\n source: 'external',\n externalDefinitionId: configuration.definitionId,\n });\n this.$editModalOpen.set(true);\n }\n\n public closeEditModal(): void {\n this.$editModalOpen.set(false);\n this.$selectedConfiguration.set(null);\n }\n\n public onConfigurationSaved(): void {\n this.closeEditModal();\n this._refreshApps$.next();\n }\n\n // --- Configuration delete ---\n\n public onConfigurationDeleteRequested(configurationId: string): void {\n const configurationTitle = this.$selectedConfiguration()?.title ?? '';\n this.closeEditModal();\n\n this._externalPluginService\n .getConfigurationUsages(configurationId)\n .pipe(take(1))\n .subscribe({\n next: usages => {\n if (usages.length > 0) {\n this._showConfigurationInUseModal(configurationTitle, usages);\n return;\n }\n this.configurationToDelete = {id: configurationId, title: configurationTitle};\n this.deleteConfigurationModalOpen$.next(true);\n },\n error: () => {\n this.configurationToDelete = {id: configurationId, title: configurationTitle};\n this.deleteConfigurationModalOpen$.next(true);\n },\n });\n }\n\n public confirmDeleteConfiguration(): void {\n const target = this.configurationToDelete;\n if (!target) return;\n this.configurationToDelete = null;\n\n this._externalPluginService\n .deleteConfiguration(target.id)\n .pipe(take(1))\n .subscribe({\n next: () => {\n this._refreshApps$.next();\n },\n error: (response: HttpErrorResponse) => {\n if (response.status === 409 && response.error?.usages) {\n this._showConfigurationInUseModal(\n target.title,\n response.error.usages as Array<ExternalPluginHostUsage>\n );\n return;\n }\n this._logger.error('Something went wrong with deleting the app configuration.');\n },\n });\n }\n\n public cancelDeleteConfiguration(): void {\n this.configurationToDelete = null;\n }\n\n // --- Logs ---\n\n public viewLogs(row: PluginAppRow): void {\n if (!row.configuration || !row.supportsLogs) return;\n this.$logConfigurationId.set(row.configuration.id);\n this.$logConfigurationTitle.set(row.configuration.title);\n this.$logModalOpen.set(true);\n }\n\n public closeLogModal(): void {\n this.$logModalOpen.set(false);\n this.$logConfigurationId.set(null);\n this.$logConfigurationTitle.set('');\n }\n\n // --- Host delete ---\n\n public deleteHost(host: ExternalPluginHost): void {\n this._externalPluginService\n .getHostUsages(host.id)\n .pipe(take(1))\n .subscribe({\n next: usages => {\n if (usages.length > 0) {\n this._showHostInUseModal(host, usages);\n return;\n }\n this.hostToDelete = host;\n this.deleteHostModalOpen$.next(true);\n },\n error: () => {\n this.hostToDelete = host;\n this.deleteHostModalOpen$.next(true);\n },\n });\n }\n\n public confirmDeleteHost(): void {\n if (!this.hostToDelete) return;\n const host = this.hostToDelete;\n this._externalPluginService\n .deleteHost(host.id)\n .pipe(take(1))\n .subscribe({\n next: () => {\n this.hostToDelete = null;\n this.appsLoading$.next(true);\n this._refreshApps$.next();\n },\n error: (response: HttpErrorResponse) => {\n if (response.status === 409 && response.error?.usages) {\n this.hostToDelete = null;\n this._showHostInUseModal(host, response.error.usages as Array<ExternalPluginHostUsage>);\n return;\n }\n this._logger.error('Something went wrong with deleting the app.');\n },\n });\n }\n\n public cancelDeleteHost(): void {\n this.hostToDelete = null;\n }\n\n // --- Event queue ---\n\n public editHostEventQueue(host: ExternalPluginHost): void {\n this.hostToEditEventQueue$.next(host);\n this.eventQueueModalOpen$.next(true);\n }\n\n public closeEventQueueModal(): void {\n this.eventQueueModalOpen$.next(false);\n this.hostToEditEventQueue$.next(null);\n }\n\n public submitEventQueueUpdate(request: ExternalPluginHostEventQueueUpdateRequest): void {\n const host = this.hostToEditEventQueue$.value;\n if (!host) return;\n this._externalPluginService.updateHostEventQueue(host.id, request).subscribe({\n next: () => {\n this.eventQueueModalOpen$.next(false);\n this.hostToEditEventQueue$.next(null);\n this._refreshApps$.next();\n },\n error: () => {\n this._logger.error('Something went wrong with updating the app event queue.');\n },\n });\n }\n\n // --- Connection editing (#618) ---\n\n public editHostConnection(host: ExternalPluginHost): void {\n this.hostToEditConnection$.next(host);\n this.editConnectionErrorMessage$.next(null);\n this.editConnectionModalOpen$.next(true);\n }\n\n public closeEditConnectionModal(): void {\n this.editConnectionModalOpen$.next(false);\n this.hostToEditConnection$.next(null);\n this.editConnectionErrorMessage$.next(null);\n }\n\n /** Same reload rule as the hosts page: a new base URL means a new CSP frame origin. */\n public submitConnectionUpdate(patch: ExternalPluginHostConnectionUpdateRequest): void {\n const host = this.hostToEditConnection$.value;\n if (!host) return;\n // Cleared first — the modal drops its copy on every keystroke, so an identical message twice\n // would not change the binding and would never re-render.\n this.editConnectionErrorMessage$.next(null);\n this.editConnectionSubmitting$.next(true);\n this._externalPluginService.updateHostConnection(host.id, patch).subscribe({\n next: () => {\n this.editConnectionSubmitting$.next(false);\n this.closeEditConnectionModal();\n this._refreshApps$.next();\n if (patch.baseUrl !== undefined) this.reloadModalOpen$.next(true);\n },\n error: (response: HttpErrorResponse) => {\n this.editConnectionSubmitting$.next(false);\n this.editConnectionErrorMessage$.next(this._extractHostError(response));\n this._logger.error('Something went wrong with updating the app connection.', response);\n },\n });\n }\n\n public confirmReload(): void {\n window.location.reload();\n }\n\n public cancelReload(): void {\n this._refreshApps$.next();\n }\n\n // --- Frontend origins ---\n\n public editHostFrontendOrigins(host: ExternalPluginHost): void {\n this.hostToEditFrontendOrigins$.next(host);\n this.frontendOriginsModalOpen$.next(true);\n }\n\n public closeFrontendOriginsModal(): void {\n this.frontendOriginsModalOpen$.next(false);\n this.hostToEditFrontendOrigins$.next(null);\n }\n\n public submitFrontendOriginsUpdate(origins: Array<string>): void {\n const host = this.hostToEditFrontendOrigins$.value;\n if (!host) return;\n this._externalPluginService.updateHostFrontendOrigins(host.id, origins).subscribe({\n next: () => {\n this.frontendOriginsModalOpen$.next(false);\n this.hostToEditFrontendOrigins$.next(null);\n this._refreshApps$.next();\n },\n error: () => {\n this._logger.error('Something went wrong with updating the app frontend origins.');\n },\n });\n }\n\n /** Mirrors the hosts page: `detail` is the operator-facing reason the validation mapper fills. */\n private _extractHostError(response: HttpErrorResponse): string {\n const body = response?.error;\n const candidate =\n (typeof body?.detail === 'string' && body.detail) ||\n (typeof body?.message === 'string' && body.message) ||\n (typeof body?.title === 'string' && body.title) ||\n '';\n return (\n candidate.trim() ||\n this._translateService.instant('pluginManagement.host.createFailedFallback')\n );\n }\n\n // --- Usage modal ---\n\n public closeUsageModal(): void {\n this.usageModalOpen$.next(false);\n this.usageModalUsages$.next([]);\n this.usageModalEntityName = null;\n }\n\n // --- Private helpers ---\n\n private _toAppRow(\n host: ExternalPluginHost,\n definitions: Array<ExternalPluginDefinition>,\n configurations: Array<ExternalPluginConfiguration>\n ): PluginAppRow {\n const hostDefinitions = definitions.filter(definition => definition.hostId === host.id);\n const definition =\n hostDefinitions.find(candidate => candidate.status === 'AVAILABLE') ??\n hostDefinitions[0] ??\n null;\n\n const hostDefinitionIds = new Set(hostDefinitions.map(hostDefinition => hostDefinition.id));\n // An app conceptually has a single configuration; should more exist (e.g. after a version\n // upgrade), the most recent one is the one the page manages.\n const configuration =\n configurations\n .filter(candidate => hostDefinitionIds.has(candidate.definitionId))\n .sort((a, b) => (b.createdAt ?? '').localeCompare(a.createdAt ?? ''))[0] ?? null;\n\n const reviewRequired = definition?.requiresReacceptance ?? false;\n const statusTags: CarbonTag[] = [this._getStatusTag(host.status)];\n if (reviewRequired) {\n // Same flag the plugins page shows: the app changed its manifest/version after acceptance\n // and is deactivated until an admin reviews and accepts the new state.\n statusTags.push({\n content: this._translateService.instant('pluginManagement.reviewRequired.tag'),\n type: 'magenta',\n });\n }\n\n return {\n ...host,\n statusTags,\n lastHealthCheckFormatted: this._formatLastHealthCheck(host.lastHealthCheck),\n configurationTitle:\n configuration?.title ?? this._translateService.instant('pluginManagement.notConfigured'),\n definition,\n configuration,\n supportsLogs: (definition?.manifest?.permissions?.capabilities ?? []).includes(\n LOG_CAPABILITY\n ),\n reviewRequired,\n };\n }\n\n private _showHostInUseModal(\n host: ExternalPluginHost,\n usages: Array<ExternalPluginHostUsage>\n ): void {\n this.usageModalEntityName =\n host.name || this._translateService.instant('pluginManagement.hostInUseModal.thisHost');\n this.usageModalTitleKey = 'pluginManagement.hostInUseModal.title';\n this.usageModalDescriptionKey = 'pluginManagement.hostInUseModal.description';\n this.usageModalUsages$.next(usages);\n this.usageModalOpen$.next(true);\n }\n\n private _showConfigurationInUseModal(\n title: string,\n usages: Array<ExternalPluginHostUsage>\n ): void {\n this.usageModalEntityName =\n title ||\n this._translateService.instant('pluginManagement.configurationInUseModal.thisConfiguration');\n this.usageModalTitleKey = 'pluginManagement.configurationInUseModal.title';\n this.usageModalDescriptionKey = 'pluginManagement.configurationInUseModal.description';\n this.usageModalUsages$.next(usages);\n this.usageModalOpen$.next(true);\n }\n\n private _getStatusTag(status: 'CONNECTED' | 'UNREACHABLE'): CarbonTag {\n return {\n content: this._translateService.instant(`pluginManagement.hostStatus.${status}`),\n type: status === 'CONNECTED' ? 'green' : 'red',\n };\n }\n\n private _formatLastHealthCheck(lastHealthCheck: string | null): string {\n if (!lastHealthCheck) {\n return '-';\n }\n const date = new Date(lastHealthCheck);\n return date.toLocaleString(this._translateService.currentLang || 'en', {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n });\n }\n}\n","<!--\n ~ Copyright 2015-2026 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (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 ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\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\n *ngIf=\"{\n apps: apps$ | async,\n refreshing: appsRefreshing$ | async,\n } as appObs\"\n>\n <valtimo-carbon-list\n [loading]=\"appsLoading$ | async\"\n [items]=\"appObs.apps\"\n [fields]=\"appFields\"\n [actionItems]=\"appActionItems\"\n [header]=\"false\"\n (rowClicked)=\"onRowClicked($event)\"\n >\n <ng-container carbonToolbarContent>\n <cds-loading\n *ngIf=\"appObs.refreshing\"\n size=\"sm\"\n [isActive]=\"true\"\n class=\"plugin-apps-page__spinner\"\n ></cds-loading>\n\n <button cdsButton=\"primary\" [disabled]=\"appsLoading$ | async\" (click)=\"openAddModal()\">\n {{ 'pluginManagement.addApp' | translate }}\n\n <svg cdsIcon=\"add\" size=\"16\" class=\"cds--btn__icon\"></svg>\n </button>\n </ng-container>\n\n <valtimo-no-results\n [action]=\"addAppButton\"\n [title]=\"'pluginManagement.noApps' | translate\"\n ></valtimo-no-results>\n </valtimo-carbon-list>\n\n <ng-template #addAppButton>\n <button cdsButton=\"primary\" [disabled]=\"appsLoading$ | async\" (click)=\"openAddModal()\">\n {{ 'pluginManagement.addApp' | translate }}\n\n <svg cdsIcon=\"add\" size=\"16\" class=\"cds--btn__icon\"></svg>\n </button>\n </ng-template>\n</ng-container>\n\n<valtimo-plugin-app-add-modal\n [open]=\"$addModalOpen()\"\n [resumeHostId]=\"$resumeHostId()\"\n (closeEvent)=\"onAddModalClose()\"\n (completedEvent)=\"onAddModalCompleted()\"\n></valtimo-plugin-app-add-modal>\n\n<valtimo-plugin-external-edit-modal\n [open]=\"$editModalOpen()\"\n [configuration]=\"$selectedConfiguration()\"\n (closeEvent)=\"closeEditModal()\"\n (savedEvent)=\"onConfigurationSaved()\"\n (deleteEvent)=\"onConfigurationDeleteRequested($event)\"\n></valtimo-plugin-external-edit-modal>\n\n<valtimo-plugin-external-review-modal\n [definition]=\"$reviewDefinition()\"\n [open]=\"$reviewModalOpen()\"\n (acceptedEvent)=\"onReviewAccepted()\"\n (closeEvent)=\"closeReviewModal()\"\n></valtimo-plugin-external-review-modal>\n\n<valtimo-plugin-host-event-queue-modal\n [host]=\"hostToEditEventQueue$ | async\"\n [open]=\"eventQueueModalOpen$ | async\"\n variant=\"app\"\n (closeEvent)=\"closeEventQueueModal()\"\n (submitEvent)=\"submitEventQueueUpdate($event)\"\n></valtimo-plugin-host-event-queue-modal>\n\n<valtimo-plugin-host-edit-modal\n [errorMessage]=\"editConnectionErrorMessage$ | async\"\n [host]=\"hostToEditConnection$ | async\"\n [open]=\"editConnectionModalOpen$ | async\"\n [submitting]=\"editConnectionSubmitting$ | async\"\n [variant]=\"'app'\"\n (closeEvent)=\"closeEditConnectionModal()\"\n (submitEvent)=\"submitConnectionUpdate($event)\"\n></valtimo-plugin-host-edit-modal>\n\n<valtimo-plugin-host-frontend-origins-modal\n [host]=\"hostToEditFrontendOrigins$ | async\"\n [open]=\"frontendOriginsModalOpen$ | async\"\n (closeEvent)=\"closeFrontendOriginsModal()\"\n (submitEvent)=\"submitFrontendOriginsUpdate($event)\"\n></valtimo-plugin-host-frontend-origins-modal>\n\n<valtimo-confirmation-modal\n [showModalSubject$]=\"reloadModalOpen$\"\n [titleTranslationKey]=\"'pluginManagement.reloadModal.title'\"\n [contentTranslationKey]=\"'pluginManagement.reloadModal.description'\"\n [confirmButtonTextTranslationKey]=\"'pluginManagement.reloadModal.reload'\"\n [cancelButtonTextTranslationKey]=\"'pluginManagement.reloadModal.later'\"\n (confirmEvent)=\"confirmReload()\"\n (cancelEvent)=\"cancelReload()\"\n></valtimo-confirmation-modal>\n\n<valtimo-plugin-log-modal\n [open]=\"$logModalOpen()\"\n [configurationId]=\"$logConfigurationId()\"\n [configurationTitle]=\"$logConfigurationTitle()\"\n (closeModal)=\"closeLogModal()\"\n></valtimo-plugin-log-modal>\n\n<valtimo-confirmation-modal\n [showModalSubject$]=\"refreshModalOpen$\"\n [titleTranslationKey]=\"'pluginManagement.appAdd.refreshModal.title'\"\n [contentTranslationKey]=\"'pluginManagement.appAdd.refreshModal.description'\"\n [confirmButtonTextTranslationKey]=\"'pluginManagement.appAdd.refreshModal.confirm'\"\n [cancelButtonTextTranslationKey]=\"'pluginManagement.appAdd.refreshModal.cancel'\"\n (confirmEvent)=\"onRefreshConfirm()\"\n (cancelEvent)=\"onRefreshCancel()\"\n></valtimo-confirmation-modal>\n\n<valtimo-confirmation-modal\n [showModalSubject$]=\"deleteConfigurationModalOpen$\"\n [titleTranslationKey]=\"'pluginManagement.deleteConfigurationModal.title'\"\n [contentTranslationKey]=\"'pluginManagement.deleteConfigurationModal.description'\"\n [confirmButtonTextTranslationKey]=\"'interface.delete'\"\n [confirmButtonType]=\"'danger'\"\n [cancelButtonTextTranslationKey]=\"'interface.cancel'\"\n (confirmEvent)=\"confirmDeleteConfiguration()\"\n (cancelEvent)=\"cancelDeleteConfiguration()\"\n></valtimo-confirmation-modal>\n\n<valtimo-confirmation-modal\n [showModalSubject$]=\"deleteHostModalOpen$\"\n [titleTranslationKey]=\"'pluginManagement.deleteHostModal.title'\"\n [contentTranslationKey]=\"'pluginManagement.deleteHostModal.description'\"\n [confirmButtonTextTranslationKey]=\"'interface.delete'\"\n [confirmButtonType]=\"'danger'\"\n [cancelButtonTextTranslationKey]=\"'interface.cancel'\"\n (confirmEvent)=\"confirmDeleteHost()\"\n (cancelEvent)=\"cancelDeleteHost()\"\n></valtimo-confirmation-modal>\n\n<valtimo-plugin-usage-modal\n [descriptionTranslationKey]=\"usageModalDescriptionKey\"\n [entityName]=\"usageModalEntityName\"\n [open]=\"usageModalOpen$ | async\"\n [titleTranslationKey]=\"usageModalTitleKey\"\n [usages]=\"usageModalUsages$ | async\"\n (closeEvent)=\"closeUsageModal()\"\n></valtimo-plugin-usage-modal>\n","/*\n * Copyright 2015-2026 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (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 * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\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 {NgModule} from '@angular/core';\nimport {RouterModule, Routes} from '@angular/router';\nimport {CommonModule} from '@angular/common';\nimport {AuthGuardService} from '@valtimo/security';\nimport {ROLE_ADMIN} from '@valtimo/shared';\nimport {PluginManagementComponent} from './components/plugin-management/plugin-management.component';\nimport {PluginHostsPageComponent} from './components/plugin-hosts-page/plugin-hosts-page.component';\nimport {PluginAppsPageComponent} from './components/plugin-apps-page/plugin-apps-page.component';\n\nconst routes: Routes = [\n {\n path: 'plugins',\n component: PluginManagementComponent,\n canActivate: [AuthGuardService],\n data: {title: 'Plugins', roles: [ROLE_ADMIN]},\n },\n {\n path: 'plugin-hosts',\n component: PluginHostsPageComponent,\n canActivate: [AuthGuardService],\n data: {title: 'Plugin hosts', roles: [ROLE_ADMIN]},\n },\n {\n path: 'plugin-apps',\n component: PluginAppsPageComponent,\n canActivate: [AuthGuardService],\n data: {title: 'Apps', roles: [ROLE_ADMIN]},\n },\n];\n\n@NgModule({\n declarations: [],\n imports: [CommonModule, RouterModule.forChild(routes)],\n exports: [RouterModule],\n})\nexport class PluginManagementRoutingModule {}\n","/*\n * Copyright 2015-2026 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (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 * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\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 {NgModule} from '@angular/core';\nimport {PluginManagementRoutingModule} from './plugin-management-routing';\nimport {CommonModule} from '@angular/common';\nimport {ReactiveFormsModule} from '@angular/forms';\nimport {TranslateModule} from '@ngx-translate/core';\nimport {PluginManagementComponent} from './components/plugin-management/plugin-management.component';\nimport {PluginAddModalComponent} from './components/plugin-add-modal/plugin-add-modal.component';\nimport {PluginManagementStateService} from './services';\nimport {PluginAddSelectComponent} from './components/plugin-add-select/plugin-add-select.component';\nimport {PluginConfigureComponent} from './components/plugin-configure/plugin-configure.component';\nimport {PluginConfigurationContainerModule, PluginTranslatePipeModule} from '@valtimo/plugin';\nimport {PluginEditModalComponent} from './components/plugin-edit-modal/plugin-edit-modal.component';\nimport {PluginEditComponent} from './components/plugin-edit/plugin-edit.component';\nimport {PluginExternalEditModalComponent} from './components/plugin-external-edit-modal/plugin-external-edit-modal.component';\nimport {PluginExternalConfigureComponent} from './components/plugin-external-configure/plugin-external-configure.component';\nimport {PluginExternalPermissionsComponent} from './components/plugin-external-permissions/plugin-external-permissions.component';\nimport {PluginUploadModalComponent} from './components/plugin-upload-modal/plugin-upload-modal.component';\nimport {PluginUsageModalComponent} from './components/plugin-usage-modal/plugin-usage-modal.component';\nimport {PluginLogModalComponent} from './components/plugin-log-modal/plugin-log-modal.component';\nimport {\n CarbonListModule,\n ConfirmationModalModule,\n ParagraphModule,\n TableModule,\n TooltipModule as VTooltipModule,\n ValtimoCdsModalDirective,\n VModalModule,\n} from '@valtimo/components';\nimport {\n ButtonModule as CarbonButtonModule,\n IconModule,\n LayerModule,\n LoadingModule,\n ModalModule as CarbonModalModule,\n NotificationModule,\n ProgressIndicatorModule,\n TagModule,\n TilesModule,\n} from 'carbon-components-angular';\n\n@NgModule({\n providers: [PluginManagementStateService],\n declarations: [\n PluginManagementComponent,\n PluginAddModalComponent,\n PluginAddSelectComponent,\n PluginConfigureComponent,\n PluginEditModalComponent,\n PluginEditComponent,\n ],\n imports: [\n CommonModule,\n ReactiveFormsModule,\n PluginManagementRoutingModule,\n TranslateModule,\n ParagraphModule,\n TableModule,\n ProgressIndicatorModule,\n VModalModule,\n PluginTranslatePipeModule,\n PluginConfigurationContainerModule,\n CarbonButtonModule,\n CarbonListModule,\n CarbonModalModule,\n IconModule,\n NotificationModule,\n TagModule,\n ValtimoCdsModalDirective,\n LayerModule,\n TilesModule,\n LoadingModule,\n PluginExternalEditModalComponent,\n PluginExternalConfigureComponent,\n PluginExternalPermissionsComponent,\n PluginUploadModalComponent,\n PluginUsageModalComponent,\n PluginLogModalComponent,\n ConfirmationModalModule,\n VTooltipModule,\n ],\n exports: [\n PluginManagementComponent,\n PluginAddModalComponent,\n PluginAddSelectComponent,\n PluginConfigureComponent,\n PluginEditModalComponent,\n PluginEditComponent,\n ],\n})\nexport class PluginManagementModule {}\n","/*\n * Copyright 2015-2025 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (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 * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\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 * Public API Surface of plugin-management\n */\n\nexport * from './lib/constants';\nexport * from './lib/models';\nexport * from './lib/services';\nexport * from './lib/plugin-management.module';\nexport * from './lib/components/plugin-management/plugin-management.component';\nexport * from './lib/components/plugin-add-modal/plugin-add-modal.component';\nexport * from './lib/components/plugin-add-select/plugin-add-select.component';\nexport * from './lib/components/plugin-configure/plugin-configure.component';\nexport * from './lib/components/plugin-edit-modal/plugin-edit-modal.component';\nexport * from './lib/components/plugin-edit/plugin-edit.component';\nexport * from './lib/components/plugin-host-modal/plugin-host-modal.component';\nexport * from './lib/components/plugin-app-add-modal/plugin-app-add-modal.component';\nexport * from './lib/components/plugin-hosts-page/plugin-hosts-page.component';\nexport * from './lib/components/plugin-apps-page/plugin-apps-page.component';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","i2","i3","i4","i1.PluginManagementStateService","i5","i6","i2.PluginManagementStateService","i7","i8.PluginExternalConfigureComponent","i9.PluginExternalPermissionsComponent","i10.PluginAddSelectComponent","i11.PluginConfigureComponent","i7.PluginEditComponent","i8","distinctUntilChanged","uuidv4","i3.PluginManagementStateService","i9.PluginExternalEditModalComponent","i10.PluginUploadModalComponent","i11.PluginUsageModalComponent","i12.PluginLogModalComponent","i13.PluginAddModalComponent","i14.PluginEditModalComponent","ORIGIN_PATTERN","CarbonButtonModule","CarbonModalModule","VTooltipModule"],"mappings":"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"}