release version 1.11.0
| @@ -3,7 +3,7 @@ | ||||
|   <parent> | ||||
|     <groupId>ru.entaxy.esb.ui</groupId> | ||||
|     <artifactId>entaxy-hawtio</artifactId> | ||||
|     <version>1.10.0</version> | ||||
|     <version>1.11.0</version> | ||||
|   </parent> | ||||
|   <groupId>ru.entaxy.esb.ui.hawtio</groupId> | ||||
|   <artifactId>artemis-plugin-entaxy</artifactId> | ||||
|   | ||||
| @@ -2,7 +2,7 @@ | ||||
|  * ~~~~~~licensing~~~~~~ | ||||
|  * artemis-plugin-entaxy | ||||
|  * ========== | ||||
|  * Copyright (C) 2020 - 2024 EmDev LLC | ||||
|  * Copyright (C) 2020 - 2025 EmDev LLC | ||||
|  * ========== | ||||
|  * You may not use this file except in accordance with the License Terms of the Copyright | ||||
|  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property | ||||
|   | ||||
| @@ -3,7 +3,7 @@ | ||||
|   ~~~~~~licensing~~~~~~ | ||||
|   artemis-plugin-entaxy | ||||
|   ========== | ||||
|   Copyright (C) 2020 - 2024 EmDev LLC | ||||
|   Copyright (C) 2020 - 2025 EmDev LLC | ||||
|   ========== | ||||
|   You may not use this file except in accordance with the License Terms of the Copyright | ||||
|   Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property | ||||
|   | ||||
| @@ -2,7 +2,7 @@ | ||||
| # ~~~~~~licensing~~~~~~ | ||||
| # artemis-plugin-entaxy | ||||
| # ========== | ||||
| # Copyright (C) 2020 - 2024 EmDev LLC | ||||
| # Copyright (C) 2020 - 2025 EmDev LLC | ||||
| # ========== | ||||
| # You may not use this file except in accordance with the License Terms of the Copyright | ||||
| # Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property | ||||
|   | ||||
| @@ -20,7 +20,7 @@ | ||||
|   ~~~~~~licensing~~~~~~ | ||||
|   artemis-plugin-entaxy | ||||
|   ========== | ||||
|   Copyright (C) 2020 - 2024 EmDev LLC | ||||
|   Copyright (C) 2020 - 2025 EmDev LLC | ||||
|   ========== | ||||
|   You may not use this file except in accordance with the License Terms of the Copyright | ||||
|   Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property | ||||
|   | ||||
| @@ -2,7 +2,7 @@ | ||||
|   ~~~~~~licensing~~~~~~ | ||||
|   artemis-plugin-entaxy | ||||
|   ========== | ||||
|   Copyright (C) 2020 - 2024 EmDev LLC | ||||
|   Copyright (C) 2020 - 2025 EmDev LLC | ||||
|   ========== | ||||
|   You may not use this file except in accordance with the License Terms of the Copyright | ||||
|   Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property | ||||
|   | ||||
| @@ -2,7 +2,7 @@ | ||||
|   ~~~~~~licensing~~~~~~ | ||||
|   artemis-plugin-entaxy | ||||
|   ========== | ||||
|   Copyright (C) 2020 - 2024 EmDev LLC | ||||
|   Copyright (C) 2020 - 2025 EmDev LLC | ||||
|   ========== | ||||
|   You may not use this file except in accordance with the License Terms of the Copyright | ||||
|   Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property | ||||
|   | ||||
| @@ -2,7 +2,7 @@ | ||||
|   ~~~~~~licensing~~~~~~ | ||||
|   artemis-plugin-entaxy | ||||
|   ========== | ||||
|   Copyright (C) 2020 - 2024 EmDev LLC | ||||
|   Copyright (C) 2020 - 2025 EmDev LLC | ||||
|   ========== | ||||
|   You may not use this file except in accordance with the License Terms of the Copyright | ||||
|   Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property | ||||
|   | ||||
| @@ -2,7 +2,7 @@ | ||||
|  * ~~~~~~licensing~~~~~~ | ||||
|  * artemis-plugin-entaxy | ||||
|  * ========== | ||||
|  * Copyright (C) 2020 - 2024 EmDev LLC | ||||
|  * Copyright (C) 2020 - 2025 EmDev LLC | ||||
|  * ========== | ||||
|  * You may not use this file except in accordance with the License Terms of the Copyright | ||||
|  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property | ||||
|   | ||||
| @@ -2,7 +2,7 @@ | ||||
|  * ~~~~~~licensing~~~~~~ | ||||
|  * artemis-plugin-entaxy | ||||
|  * ========== | ||||
|  * Copyright (C) 2020 - 2024 EmDev LLC | ||||
|  * Copyright (C) 2020 - 2025 EmDev LLC | ||||
|  * ========== | ||||
|  * You may not use this file except in accordance with the License Terms of the Copyright | ||||
|  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property | ||||
|   | ||||
| @@ -2,7 +2,7 @@ | ||||
|  * ~~~~~~licensing~~~~~~ | ||||
|  * artemis-plugin-entaxy | ||||
|  * ========== | ||||
|  * Copyright (C) 2020 - 2024 EmDev LLC | ||||
|  * Copyright (C) 2020 - 2025 EmDev LLC | ||||
|  * ========== | ||||
|  * You may not use this file except in accordance with the License Terms of the Copyright | ||||
|  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property | ||||
|   | ||||
| @@ -2,7 +2,7 @@ | ||||
|  * ~~~~~~licensing~~~~~~ | ||||
|  * artemis-plugin-entaxy | ||||
|  * ========== | ||||
|  * Copyright (C) 2020 - 2024 EmDev LLC | ||||
|  * Copyright (C) 2020 - 2025 EmDev LLC | ||||
|  * ========== | ||||
|  * You may not use this file except in accordance with the License Terms of the Copyright | ||||
|  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property | ||||
|   | ||||
| @@ -2,7 +2,7 @@ | ||||
|  * ~~~~~~licensing~~~~~~ | ||||
|  * artemis-plugin-entaxy | ||||
|  * ========== | ||||
|  * Copyright (C) 2020 - 2024 EmDev LLC | ||||
|  * Copyright (C) 2020 - 2025 EmDev LLC | ||||
|  * ========== | ||||
|  * You may not use this file except in accordance with the License Terms of the Copyright | ||||
|  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property | ||||
|   | ||||
| @@ -2,7 +2,7 @@ | ||||
|  * ~~~~~~licensing~~~~~~ | ||||
|  * artemis-plugin-entaxy | ||||
|  * ========== | ||||
|  * Copyright (C) 2020 - 2024 EmDev LLC | ||||
|  * Copyright (C) 2020 - 2025 EmDev LLC | ||||
|  * ========== | ||||
|  * You may not use this file except in accordance with the License Terms of the Copyright | ||||
|  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property | ||||
|   | ||||
| @@ -2,7 +2,7 @@ | ||||
|  * ~~~~~~licensing~~~~~~ | ||||
|  * artemis-plugin-entaxy | ||||
|  * ========== | ||||
|  * Copyright (C) 2020 - 2024 EmDev LLC | ||||
|  * Copyright (C) 2020 - 2025 EmDev LLC | ||||
|  * ========== | ||||
|  * You may not use this file except in accordance with the License Terms of the Copyright | ||||
|  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property | ||||
|   | ||||
| @@ -2,7 +2,7 @@ | ||||
|  * ~~~~~~licensing~~~~~~ | ||||
|  * artemis-plugin-entaxy | ||||
|  * ========== | ||||
|  * Copyright (C) 2020 - 2024 EmDev LLC | ||||
|  * Copyright (C) 2020 - 2025 EmDev LLC | ||||
|  * ========== | ||||
|  * You may not use this file except in accordance with the License Terms of the Copyright | ||||
|  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property | ||||
|   | ||||
| @@ -2,7 +2,7 @@ | ||||
|  * ~~~~~~licensing~~~~~~ | ||||
|  * artemis-plugin-entaxy | ||||
|  * ========== | ||||
|  * Copyright (C) 2020 - 2024 EmDev LLC | ||||
|  * Copyright (C) 2020 - 2025 EmDev LLC | ||||
|  * ========== | ||||
|  * You may not use this file except in accordance with the License Terms of the Copyright | ||||
|  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property | ||||
|   | ||||
| @@ -2,7 +2,7 @@ | ||||
|  * ~~~~~~licensing~~~~~~ | ||||
|  * artemis-plugin-entaxy | ||||
|  * ========== | ||||
|  * Copyright (C) 2020 - 2024 EmDev LLC | ||||
|  * Copyright (C) 2020 - 2025 EmDev LLC | ||||
|  * ========== | ||||
|  * You may not use this file except in accordance with the License Terms of the Copyright | ||||
|  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property | ||||
|   | ||||
| @@ -2,7 +2,7 @@ | ||||
|  * ~~~~~~licensing~~~~~~ | ||||
|  * artemis-plugin-entaxy | ||||
|  * ========== | ||||
|  * Copyright (C) 2020 - 2024 EmDev LLC | ||||
|  * Copyright (C) 2020 - 2025 EmDev LLC | ||||
|  * ========== | ||||
|  * You may not use this file except in accordance with the License Terms of the Copyright | ||||
|  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property | ||||
|   | ||||
| @@ -2,7 +2,7 @@ | ||||
|  * ~~~~~~licensing~~~~~~ | ||||
|  * artemis-plugin-entaxy | ||||
|  * ========== | ||||
|  * Copyright (C) 2020 - 2024 EmDev LLC | ||||
|  * Copyright (C) 2020 - 2025 EmDev LLC | ||||
|  * ========== | ||||
|  * You may not use this file except in accordance with the License Terms of the Copyright | ||||
|  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property | ||||
|   | ||||
| @@ -2,7 +2,7 @@ | ||||
|  * ~~~~~~licensing~~~~~~ | ||||
|  * artemis-plugin-entaxy | ||||
|  * ========== | ||||
|  * Copyright (C) 2020 - 2024 EmDev LLC | ||||
|  * Copyright (C) 2020 - 2025 EmDev LLC | ||||
|  * ========== | ||||
|  * You may not use this file except in accordance with the License Terms of the Copyright | ||||
|  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property | ||||
|   | ||||
| @@ -2,7 +2,7 @@ | ||||
|  * ~~~~~~licensing~~~~~~ | ||||
|  * artemis-plugin-entaxy | ||||
|  * ========== | ||||
|  * Copyright (C) 2020 - 2024 EmDev LLC | ||||
|  * Copyright (C) 2020 - 2025 EmDev LLC | ||||
|  * ========== | ||||
|  * You may not use this file except in accordance with the License Terms of the Copyright | ||||
|  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property | ||||
|   | ||||
| @@ -2,7 +2,7 @@ | ||||
|  * ~~~~~~licensing~~~~~~ | ||||
|  * artemis-plugin-entaxy | ||||
|  * ========== | ||||
|  * Copyright (C) 2020 - 2024 EmDev LLC | ||||
|  * Copyright (C) 2020 - 2025 EmDev LLC | ||||
|  * ========== | ||||
|  * You may not use this file except in accordance with the License Terms of the Copyright | ||||
|  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property | ||||
|   | ||||
| @@ -2,7 +2,7 @@ | ||||
|  * ~~~~~~licensing~~~~~~ | ||||
|  * artemis-plugin-entaxy | ||||
|  * ========== | ||||
|  * Copyright (C) 2020 - 2024 EmDev LLC | ||||
|  * Copyright (C) 2020 - 2025 EmDev LLC | ||||
|  * ========== | ||||
|  * You may not use this file except in accordance with the License Terms of the Copyright | ||||
|  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property | ||||
|   | ||||
| @@ -2,7 +2,7 @@ | ||||
|  * ~~~~~~licensing~~~~~~ | ||||
|  * artemis-plugin-entaxy | ||||
|  * ========== | ||||
|  * Copyright (C) 2020 - 2024 EmDev LLC | ||||
|  * Copyright (C) 2020 - 2025 EmDev LLC | ||||
|  * ========== | ||||
|  * You may not use this file except in accordance with the License Terms of the Copyright | ||||
|  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property | ||||
|   | ||||
| @@ -2,7 +2,7 @@ | ||||
|  * ~~~~~~licensing~~~~~~ | ||||
|  * artemis-plugin-entaxy | ||||
|  * ========== | ||||
|  * Copyright (C) 2020 - 2024 EmDev LLC | ||||
|  * Copyright (C) 2020 - 2025 EmDev LLC | ||||
|  * ========== | ||||
|  * You may not use this file except in accordance with the License Terms of the Copyright | ||||
|  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property | ||||
|   | ||||
| @@ -2,7 +2,7 @@ | ||||
|  * ~~~~~~licensing~~~~~~ | ||||
|  * artemis-plugin-entaxy | ||||
|  * ========== | ||||
|  * Copyright (C) 2020 - 2024 EmDev LLC | ||||
|  * Copyright (C) 2020 - 2025 EmDev LLC | ||||
|  * ========== | ||||
|  * You may not use this file except in accordance with the License Terms of the Copyright | ||||
|  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property | ||||
|   | ||||
| @@ -2,7 +2,7 @@ | ||||
|  * ~~~~~~licensing~~~~~~ | ||||
|  * artemis-plugin-entaxy | ||||
|  * ========== | ||||
|  * Copyright (C) 2020 - 2024 EmDev LLC | ||||
|  * Copyright (C) 2020 - 2025 EmDev LLC | ||||
|  * ========== | ||||
|  * You may not use this file except in accordance with the License Terms of the Copyright | ||||
|  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property | ||||
|   | ||||
| @@ -2,7 +2,7 @@ | ||||
|  * ~~~~~~licensing~~~~~~ | ||||
|  * artemis-plugin-entaxy | ||||
|  * ========== | ||||
|  * Copyright (C) 2020 - 2024 EmDev LLC | ||||
|  * Copyright (C) 2020 - 2025 EmDev LLC | ||||
|  * ========== | ||||
|  * You may not use this file except in accordance with the License Terms of the Copyright | ||||
|  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property | ||||
|   | ||||
| @@ -2,7 +2,7 @@ | ||||
|  * ~~~~~~licensing~~~~~~ | ||||
|  * artemis-plugin-entaxy | ||||
|  * ========== | ||||
|  * Copyright (C) 2020 - 2024 EmDev LLC | ||||
|  * Copyright (C) 2020 - 2025 EmDev LLC | ||||
|  * ========== | ||||
|  * You may not use this file except in accordance with the License Terms of the Copyright | ||||
|  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property | ||||
|   | ||||
| @@ -2,7 +2,7 @@ | ||||
|  * ~~~~~~licensing~~~~~~ | ||||
|  * artemis-plugin-entaxy | ||||
|  * ========== | ||||
|  * Copyright (C) 2020 - 2024 EmDev LLC | ||||
|  * Copyright (C) 2020 - 2025 EmDev LLC | ||||
|  * ========== | ||||
|  * You may not use this file except in accordance with the License Terms of the Copyright | ||||
|  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property | ||||
|   | ||||
| @@ -2,7 +2,7 @@ | ||||
|  * ~~~~~~licensing~~~~~~ | ||||
|  * artemis-plugin-entaxy | ||||
|  * ========== | ||||
|  * Copyright (C) 2020 - 2024 EmDev LLC | ||||
|  * Copyright (C) 2020 - 2025 EmDev LLC | ||||
|  * ========== | ||||
|  * You may not use this file except in accordance with the License Terms of the Copyright | ||||
|  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property | ||||
|   | ||||
| @@ -2,7 +2,7 @@ | ||||
|  * ~~~~~~licensing~~~~~~ | ||||
|  * artemis-plugin-entaxy | ||||
|  * ========== | ||||
|  * Copyright (C) 2020 - 2024 EmDev LLC | ||||
|  * Copyright (C) 2020 - 2025 EmDev LLC | ||||
|  * ========== | ||||
|  * You may not use this file except in accordance with the License Terms of the Copyright | ||||
|  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property | ||||
|   | ||||
| @@ -3,7 +3,7 @@ | ||||
|   <parent> | ||||
|     <groupId>ru.entaxy.esb.ui</groupId> | ||||
|     <artifactId>entaxy-hawtio</artifactId> | ||||
|     <version>1.10.0</version> | ||||
|     <version>1.11.0</version> | ||||
|   </parent> | ||||
|   <groupId>ru.entaxy.esb.ui.hawtio</groupId> | ||||
|   <artifactId>entaxy-branding-plugin</artifactId> | ||||
|   | ||||
| @@ -2,7 +2,7 @@ | ||||
|  * ~~~~~~licensing~~~~~~ | ||||
|  * entaxy-branding-plugin | ||||
|  * ========== | ||||
|  * Copyright (C) 2020 - 2024 EmDev LLC | ||||
|  * Copyright (C) 2020 - 2025 EmDev LLC | ||||
|  * ========== | ||||
|  * You may not use this file except in accordance with the License Terms of the Copyright | ||||
|  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property | ||||
|   | ||||
| @@ -3,7 +3,7 @@ | ||||
|   ~~~~~~licensing~~~~~~ | ||||
|   entaxy-branding-plugin | ||||
|   ========== | ||||
|   Copyright (C) 2020 - 2024 EmDev LLC | ||||
|   Copyright (C) 2020 - 2025 EmDev LLC | ||||
|   ========== | ||||
|   You may not use this file except in accordance with the License Terms of the Copyright | ||||
|   Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property | ||||
|   | ||||
| @@ -3,7 +3,7 @@ | ||||
|   ~~~~~~licensing~~~~~~ | ||||
|   entaxy-branding-plugin | ||||
|   ========== | ||||
|   Copyright (C) 2020 - 2024 EmDev LLC | ||||
|   Copyright (C) 2020 - 2025 EmDev LLC | ||||
|   ========== | ||||
|   You may not use this file except in accordance with the License Terms of the Copyright | ||||
|   Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property | ||||
|   | ||||
| @@ -2,7 +2,7 @@ | ||||
|  * ~~~~~~licensing~~~~~~ | ||||
|  * entaxy-branding-plugin | ||||
|  * ========== | ||||
|  * Copyright (C) 2020 - 2024 EmDev LLC | ||||
|  * Copyright (C) 2020 - 2025 EmDev LLC | ||||
|  * ========== | ||||
|  * You may not use this file except in accordance with the License Terms of the Copyright | ||||
|  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property | ||||
| @@ -147,6 +147,10 @@ entaxy-header .pficon.pficon-info:hover { | ||||
|     background: url("../img/icons/cranberry-red/entaxy-route-libraries-icon.png"); | ||||
| } | ||||
|  | ||||
| .entaxy-data-management-icon span.node-icon::before { | ||||
|     background: url("../img/icons/cranberry-red/entaxy-data-management-icon.png"); | ||||
| } | ||||
|  | ||||
| .entaxy-cicd-projects-icon span.node-icon::before { | ||||
|     background: url("../img/icons/cicd/entaxy-cicd-projects-icon.png"); | ||||
| } | ||||
| @@ -195,6 +199,7 @@ entaxy-header .pficon.pficon-info:hover { | ||||
| .entaxy-search-icon span.node-icon::before, | ||||
| .entaxy-route-libraries-icon span.node-icon::before, | ||||
| .entaxy-route-component-libraries-icon span.node-icon::before, | ||||
| .entaxy-data-management-icon span.node-icon::before, | ||||
|  | ||||
| .entaxy-cicd-projects-icon span.node-icon::before, | ||||
| .entaxy-cicd-applications-icon span.node-icon::before, | ||||
| @@ -401,9 +406,11 @@ svg text { | ||||
|  | ||||
| .btn-primary.active.focus, | ||||
| .btn-primary.active:focus, | ||||
| .btn-primary.active:hover, .btn-primary:active.focus, | ||||
| .btn-primary.active:hover, | ||||
| .btn-primary:active.focus, | ||||
| .btn-primary:active:focus, | ||||
| .btn-primary:active:hover, | ||||
| .open .dropdown-toggle.btn-primary, | ||||
| .open .dropdown-toggle.btn-primary.focus, | ||||
| .open .dropdown-toggle.btn-primary:focus, | ||||
| .open .dropdown-toggle.btn-primary:hover { | ||||
| @@ -411,6 +418,10 @@ svg text { | ||||
|     border-color: #B21054; | ||||
| } | ||||
|  | ||||
| .btn-primary .caret:before { | ||||
|     color: #fff; | ||||
| } | ||||
|  | ||||
| /*These change the row in a table when hovered over*/ | ||||
| .table-hover>tbody>tr:hover { | ||||
|     background-color: #DF667Bb3; | ||||
| @@ -528,6 +539,16 @@ table.dataTable thead .sorting_asc:before, table.dataTable thead .sorting_desc:b | ||||
|     min-width: 900px; | ||||
| } | ||||
|  | ||||
| .modal-xxl { | ||||
|     width: 90%; | ||||
|     min-width: 900px; | ||||
| } | ||||
|  | ||||
| .modal-body-without-header iframe { | ||||
|     width: 100%; | ||||
|     margin: 0; | ||||
| } | ||||
|  | ||||
| .modal-body-header { | ||||
|     height: 70px; | ||||
|     max-height: 70px; | ||||
| @@ -865,6 +886,20 @@ table.dataTable thead .sorting_asc:before, table.dataTable thead .sorting_desc:b | ||||
|     outline: none; | ||||
| } | ||||
|  | ||||
| .form-group .extra-actions { | ||||
|     padding-left: 0px; | ||||
|     padding-top: 4px; | ||||
|     margin-left: -10px; | ||||
| } | ||||
|  | ||||
| .form-group .extra-actions .reset-button { | ||||
|     cursor: pointer; | ||||
| } | ||||
|  | ||||
| .form-group .extra-actions .reset-button:hover { | ||||
|     color: #DF667B; | ||||
| } | ||||
|  | ||||
| /*These are for custom forms*/ | ||||
|  | ||||
| .entaxy-xml-form { | ||||
| @@ -872,8 +907,37 @@ table.dataTable thead .sorting_asc:before, table.dataTable thead .sorting_desc:b | ||||
|     height: 26px; | ||||
| } | ||||
|  | ||||
| button[disabled].entaxy-xml-form { | ||||
| button.btn-std, | ||||
| .has-error button.btn-std.btn-std-ignore-error { | ||||
|     background-color: #efefef; | ||||
|     border: 1px solid #767676; | ||||
|     border-radius: 2px; | ||||
|     padding: 2px 7px; | ||||
| } | ||||
|  | ||||
| button.btn-std:hover, | ||||
| .has-error button.btn-std.btn-std-ignore-error:hover { | ||||
|     background-color: #dfdfdf; | ||||
|     border-color: #535353; | ||||
| } | ||||
|  | ||||
| .has-error button.btn-std { | ||||
|     background-color: #f3dede; | ||||
|     border: 1px solid #c00; | ||||
|     border-radius: 2px; | ||||
|     padding: 2px 7px; | ||||
| } | ||||
|  | ||||
| .has-error button.btn-std:hover { | ||||
|     background-color: #f1cece; | ||||
|     border-color: #900; | ||||
| } | ||||
|  | ||||
| button[disabled].btn-std, | ||||
| button[disabled].btn-std:hover { | ||||
|     background-color: #efefef; | ||||
|     color: #8b8d8f; | ||||
|     border-color: #d1d1d1; | ||||
| } | ||||
|  | ||||
| .input-with-button, | ||||
| @@ -1055,11 +1119,45 @@ select.form-control { | ||||
| } | ||||
|  | ||||
| .modal-resources-viewer-container { | ||||
|     padding: 10px; | ||||
|     padding: 10px 0; | ||||
|     height: inherit; | ||||
| } | ||||
|  | ||||
| .modal-resources-viewer-container .modal-resources-viewer-header-container { | ||||
|     padding: 0 10px; | ||||
| } | ||||
|  | ||||
| .modal-resources-viewer-container .file-panel { | ||||
|     height: calc(100% - 17px); | ||||
|     overflow: hidden auto; | ||||
|     padding-right: 0 !important; | ||||
|     padding-left: 5px; | ||||
|     padding-bottom: 20px; | ||||
| } | ||||
|  | ||||
| .modal-resources-viewer-header-container { | ||||
|     display: flex; | ||||
|     flex-direction: column; | ||||
|     -webkit-flex-direction: column; | ||||
| } | ||||
|  | ||||
| .modal-resources-viewer-header-container .provider-selector { | ||||
|     display: flex; | ||||
| } | ||||
|  | ||||
| .modal-resources-viewer-header-container .provider-selector > span { | ||||
|     font-size: 13.5px; | ||||
|     margin-top: 2px; | ||||
|     margin-right: 10px; | ||||
| } | ||||
|  | ||||
| .modal-resources-viewer-header-container .provider-selector > select { | ||||
|     width: 180px; | ||||
|     margin-bottom: 5px; | ||||
| } | ||||
|  | ||||
| .modal-resources-viewer-header-container .navigation-creation { | ||||
|     display: flex; | ||||
| } | ||||
|  | ||||
| .modal-resources-viewer-header-container entaxy-crumbs { | ||||
| @@ -1070,6 +1168,44 @@ entaxy-resource-viewer-modal .modal-body-without-header { | ||||
|     margin-top: 0 !important; | ||||
| } | ||||
|  | ||||
| .modal-body-without-header.entaxy-resource-save-mode { | ||||
|     height: calc(100vh - 256px); | ||||
|     max-height: calc(100vh - 256px); | ||||
| } | ||||
|  | ||||
| .modal-footer.entaxy-resource-save-mode { | ||||
|     display: flex; | ||||
| } | ||||
|  | ||||
| .modal-footer.entaxy-resource-save-mode .entaxy-resource-save-mode-labelled-field-container { | ||||
|     display: flex; | ||||
|     width: 100%; | ||||
|     margin-right: 20px | ||||
| } | ||||
|  | ||||
| .modal-footer.entaxy-resource-save-mode .entaxy-resource-save-mode-field-container { | ||||
|     display: flex; | ||||
|     flex-direction: column; | ||||
|     width: 100%; | ||||
|     height: 52px; | ||||
|     margin-right: 20px; | ||||
| } | ||||
|  | ||||
| .modal-footer.entaxy-resource-save-mode .entaxy-resource-save-mode-field-container entaxy-input-with-extension { | ||||
|     width: 100%; | ||||
|     margin-left: 20px; | ||||
| } | ||||
|  | ||||
| .modal-footer.entaxy-resource-save-mode span.help-block { | ||||
|     text-align: left; | ||||
|     margin-left: 20px; | ||||
| } | ||||
|  | ||||
| .modal-footer.entaxy-resource-save-mode .btn { | ||||
|     height: 26px; | ||||
|     align-self: end; | ||||
| } | ||||
|  | ||||
| /* css for resource loading ui */ | ||||
|  | ||||
| .highlighted { | ||||
| @@ -1173,6 +1309,7 @@ entaxy-resource-viewer-modal .modal-body-without-header { | ||||
|  | ||||
| .file-panel .tile { | ||||
|     width: 100px; | ||||
|     height: fit-content; | ||||
|     display: flex; | ||||
|     flex-direction: column; | ||||
|     -webkit-flex-direction: column; | ||||
| @@ -1238,6 +1375,8 @@ entaxy-resource-viewer-modal .modal-body-without-header { | ||||
|     display: flex; | ||||
|     flex-direction: row; | ||||
|     -webkit-flex-direction: row; | ||||
|     flex-wrap: wrap; | ||||
|     -webkit-flex-wrap: wrap; | ||||
|     color: #535353; | ||||
|     cursor: pointer; | ||||
|     margin-bottom: 5px; | ||||
| @@ -1823,10 +1962,14 @@ entaxy-connectors-with-flow { | ||||
|     background-color: #D2D2D2; | ||||
| } | ||||
|  | ||||
| .out-flow-customization-points-container { | ||||
| .out-flow-customization-points-container, | ||||
| .custom-connector-customization-points-container { | ||||
|     display: flex; | ||||
|     justify-content: space-between; | ||||
|     width: 150px; | ||||
| } | ||||
|  | ||||
| .custom-connector-customization-points-container .customization-point-block { | ||||
|     width: 90px !important; | ||||
| } | ||||
|  | ||||
| .customization-point-block.connector-selector { | ||||
| @@ -1850,11 +1993,13 @@ entaxy-connectors-with-flow { | ||||
|     margin-bottom: 1px; | ||||
| } | ||||
|  | ||||
| .connector-block .customization-point-block { | ||||
| .connector-block .customization-point-block, | ||||
| .custom-connector-customization-points-container { | ||||
|     width: 200px; | ||||
| } | ||||
|  | ||||
| .flow-block .customization-point-block { | ||||
| .flow-block .customization-point-block, | ||||
| .out-flow-customization-points-container { | ||||
|     width: 150px; | ||||
| } | ||||
|  | ||||
| @@ -2552,7 +2697,7 @@ entaxy-ci-cd-configurations .entaxy-cicd-objects-table-container { | ||||
| } | ||||
|  | ||||
| .entaxy-cicd-table .pficon-arrow:before, | ||||
| .entaxy-cicd-table .pficon-error-circle-o:before { | ||||
| .entaxy-cicd-table .pficon-error-circle-o.blue:before { | ||||
|     color: #0000ff; | ||||
| } | ||||
|  | ||||
| @@ -2587,6 +2732,65 @@ entaxy-ci-cd-add-objects-modal entaxy-expandable-list .list-view-pf .list-group- | ||||
|     border-top: 1px solid #d1d1d1; | ||||
| } | ||||
|  | ||||
| /* atlasmap console */ | ||||
|  | ||||
| .entaxy-atlasmap-console { | ||||
|     width: calc(100% + 52px); | ||||
|     height: 100%; | ||||
|     margin: 0 -20px -6px -32px; | ||||
|     overflow: scroll; | ||||
|     border: none; | ||||
| } | ||||
|  | ||||
| /* atlasmap console modal */ | ||||
|  | ||||
| .modal-body-without-header.entaxy-atlasmap-console-modal { | ||||
|     margin: 0; | ||||
|     height: calc(100vh - 170px); | ||||
|     max-height: calc(100vh - 170px); | ||||
| } | ||||
|  | ||||
| .modal-body-without-header.entaxy-atlasmap-console-modal .entaxy-atlasmap-console-container { | ||||
|     height: 100%; | ||||
| } | ||||
|  | ||||
| /* atlasmap create instance modal, create resource modal */ | ||||
|  | ||||
| .entaxy-resource-editor-container, | ||||
| .entaxy-create-resource-fields-container { | ||||
|     padding: 0 20px 10px 20px; | ||||
| } | ||||
|  | ||||
| .entaxy-create-resource-fields-container .entaxy-create-resource-name-field-container { | ||||
|     display: flex; | ||||
|     margin-bottom: 10px; | ||||
| } | ||||
|  | ||||
| .entaxy-create-resource-fields-container .entaxy-create-resource-name-field-container .control-label { | ||||
|     margin-right: 20px; | ||||
| } | ||||
|  | ||||
| .entaxy-editor-container .entaxy-editor.has-error .CodeMirror, | ||||
| .entaxy-resource-editor-container .entaxy-editor.has-error .CodeMirror { | ||||
|     border-color: #c00; | ||||
| } | ||||
|  | ||||
| /* edit resource modal */ | ||||
|  | ||||
| .syntax-highlighting-container { | ||||
|     padding: 0 20px 10px 20px; | ||||
|     display: flex; | ||||
| } | ||||
|  | ||||
| .syntax-highlighting-container label { | ||||
|     margin-right: 20px; | ||||
|     white-space: nowrap; | ||||
| } | ||||
|  | ||||
| .syntax-highlighting-container entaxy-select-from-enum { | ||||
|     width: 100%; | ||||
| } | ||||
|  | ||||
| /*This is the original css from HawtIO 1,leaving as is as somemay be used*/ | ||||
| * { | ||||
|   font-family: "Open Sans"; | ||||
| @@ -2739,15 +2943,23 @@ ul.dynatree-container li { | ||||
|   border: 1px solid #d4d4d4; | ||||
| } | ||||
|  | ||||
| .xml-editor-container { | ||||
| .entaxy-editor-container { | ||||
|   margin-left: 20px; | ||||
|   margin-right: 20px; | ||||
| } | ||||
|  | ||||
| .xml-editor-container .editor-autoresize .CodeMirror-scroll { | ||||
| .entaxy-editor-container .editor-autoresize .CodeMirror-scroll { | ||||
|   height: calc(100vh - 240px); | ||||
| } | ||||
|  | ||||
| .entaxy-resource-editor-container .editor-autoresize .CodeMirror-scroll { | ||||
|     height: calc(100vh - 276px); | ||||
| } | ||||
|  | ||||
| entaxy-create-resource-modal .entaxy-resource-editor-container .editor-autoresize .CodeMirror-scroll { | ||||
|     height: calc(100vh - 312px); | ||||
| } | ||||
|  | ||||
| .xml-route-source-container .editor-autoresize .CodeMirror-scroll { | ||||
|   height: calc(100vh - 320px); | ||||
| } | ||||
|   | ||||
| @@ -3,7 +3,7 @@ | ||||
|   ~~~~~~licensing~~~~~~ | ||||
|   entaxy-branding-plugin | ||||
|   ========== | ||||
|   Copyright (C) 2020 - 2024 EmDev LLC | ||||
|   Copyright (C) 2020 - 2025 EmDev LLC | ||||
|   ========== | ||||
|   You may not use this file except in accordance with the License Terms of the Copyright | ||||
|   Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property | ||||
|   | ||||
| @@ -3,7 +3,7 @@ | ||||
|   ~~~~~~licensing~~~~~~ | ||||
|   entaxy-branding-plugin | ||||
|   ========== | ||||
|   Copyright (C) 2020 - 2024 EmDev LLC | ||||
|   Copyright (C) 2020 - 2025 EmDev LLC | ||||
|   ========== | ||||
|   You may not use this file except in accordance with the License Terms of the Copyright | ||||
|   Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property | ||||
|   | ||||
| After Width: | Height: | Size: 800 B | 
| After Width: | Height: | Size: 864 B | 
| After Width: | Height: | Size: 923 B | 
| After Width: | Height: | Size: 892 B | 
| After Width: | Height: | Size: 758 B | 
| After Width: | Height: | Size: 811 B | 
| After Width: | Height: | Size: 392 B | 
| After Width: | Height: | Size: 745 B | 
| After Width: | Height: | Size: 646 B | 
| After Width: | Height: | Size: 939 B | 
| After Width: | Height: | Size: 645 B | 
| After Width: | Height: | Size: 758 B | 
| After Width: | Height: | Size: 636 B | 
| After Width: | Height: | Size: 576 B | 
| After Width: | Height: | Size: 609 B | 
| After Width: | Height: | Size: 739 B | 
| @@ -2,7 +2,7 @@ | ||||
|  * ~~~~~~licensing~~~~~~ | ||||
|  * entaxy-branding-plugin | ||||
|  * ========== | ||||
|  * Copyright (C) 2020 - 2024 EmDev LLC | ||||
|  * Copyright (C) 2020 - 2025 EmDev LLC | ||||
|  * ========== | ||||
|  * You may not use this file except in accordance with the License Terms of the Copyright | ||||
|  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property | ||||
|   | ||||
							
								
								
									
										175
									
								
								ui/entaxy-hawtio/entaxy-cicd-plugin/LICENSE.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,175 @@ | ||||
|                                  ЛИЦЕНЗИЯ ОГРАНИЧЕННОГО ПРИМЕНЕНИЯ | ||||
|  | ||||
| Настоящий документ устанавливает для Пользователя условия применения Базовой (некоммерческой) | ||||
| версии лицензии для пробного использования программного обеспечения ENTAXY, принадлежащего | ||||
| Правообладателю – Обществу с ограниченной ответственностью "ЕМДЕВ" (ОГРН 1057810026658, ИНН | ||||
| 7813313860, юридический адрес: 197022, Россия, г. Санкт-Петербург, ул. Профессора Попова, | ||||
| д. 23, литера В, помещение 3Н), расположенной в сети Интернет по адресу | ||||
| https://www.emdev.ru/about (далее - Компания). | ||||
|  | ||||
| Используя или получая доступ к Программному обеспечению, или нажав «Я согласен с Условиями» | ||||
| (или аналогичную кнопку или флажок) после загрузки или установки Программного обеспечения, | ||||
| Пользователь выражает свое согласие на обязательность условий и ограничений, изложенных в | ||||
| настоящем документе, в противном случае, он должен не использовать или не получать доступ | ||||
| к Программному обеспечению. | ||||
|  | ||||
|                                     1. ТЕРМИНЫ И ОПРЕДЕЛЕНИЯ | ||||
|  | ||||
| a) ПО – Программное обеспечение, интеграционная шина «ЭНТАКСИ» (ENTAXY) в любой ее версии | ||||
| или редакции, исключительные права на которую принадлежат Правообладателю. | ||||
| b) Правообладатель (Компания) – ООО «ЕМДЕВ», ОГРН 1057810026658, ИНН 7813313860, исключительные | ||||
| права которого подтверждаются Свидетельством о государственной регистрации в Реестре программ | ||||
| для ЭВМ № 2021610848 от 19.01.2021 года. | ||||
| c) Пользователь – юридическое или физическое лицо, получившее через скачивание с сайта | ||||
| https://entaxy.ru или иным образом, дистрибутив ПО, пользующееся ПО. | ||||
| d) ИС – интеллектуальная собственность – закреплённое законом исключительное право, а также | ||||
| личные неимущественные права авторов произведений на результат интеллектуальной деятельности. | ||||
| e) Подписка – это коммерческое предложение Правообладателя, состоящее из Лицензии на использование | ||||
| ПО и доступа к технической поддержке программного обеспечения на срок Подписки. Подписка | ||||
| включает предоставление Пользователю неисключительного права использования ПО, в том числе | ||||
| получение обновлений функционала ПО и безопасности ПО, исправление ошибок ПО и получение | ||||
| патчей с обновлениями и исправлениями программного обеспечения. Подписка приобретается | ||||
| Пользователем на период времени, указанный в Сертификате. Количество подписок устанавливается | ||||
| для каждого Пользователя индивидуально в Сертификате. | ||||
| f) Сертификат – документ, выдаваемый Дистрибъютором или Авторизованным партнёром (Партнёром), | ||||
| подтверждающий факт приобретения физическим или юридическим лицом Подписки на программное | ||||
| обеспечение в ограниченном объёме и на определённый период времени. | ||||
| g) Лицензия (простая (неисключительная) – совокупность ограниченных прав использования ПО, | ||||
| предоставленных Пользователю согласно условиям Подписки. | ||||
| h) Библиотека – совокупность подпрограмм и объектов, используемых для разработки программного | ||||
| обеспечения. | ||||
| i) Исходный код – текст компьютерной программы на каком-либо языке программирования, состоящий | ||||
| из одного или нескольких файлов, который может быть прочтён человеком. | ||||
| j) Объектный код – файл (часть машинного кода) с промежуточным представлением отдельного модуля | ||||
| программы, полученный в результате обработки исходного кода, еще не связанный в полную программу. | ||||
| Это машинный код для одной конкретной библиотеки или модуля, который будет составлять готовый | ||||
| продукт. | ||||
| k) Некоммерческое использование – индивидуальное личное использование Пользователем программного | ||||
| обеспечения с целью обучения работе с Программным обеспечением, для оценки или демонстрации | ||||
| возможностей Программного обеспечения, при котором, Пользователем не извлекается коммерческая | ||||
| выгода и/или не идёт в доход денежное вознаграждение при использовании Программного обеспечения. | ||||
|  | ||||
|                     2. ДОПУСТИМЫЕ СПОСОБЫ ИСПОЛЬЗОВАНИЯ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ | ||||
|  | ||||
| 2.1. Правообладатель предоставляет Пользователю ограниченное право использования Программного | ||||
| обеспечения на условиях простой (неисключительной) лицензии в объёме, ограниченном правом | ||||
| воспроизведения полной рабочей версии программного обеспечения, новых версий программного обеспечения | ||||
| в памяти оборудования и его запуска на оборудовании в соответствии со ст. 1280 ГК РФ. | ||||
| 2.2. Право на использование Программного обеспечения, предоставляемое Пользователю, носит | ||||
| неисключительный характер. | ||||
| 2.3. Пользователю предоставляется всемирная, неисключительная, не подлежащая сублицензированию, | ||||
| лицензия на ограниченное использование Программного обеспечения. | ||||
| 2.4. Пользователь, имеющий Базовую (некоммерческую) версию лицензии для пробного использования | ||||
| имеет право приобрести Подписку на программное обеспечение. В этом случае Пользователь обязан | ||||
| обратиться в службу поддержки Правообладателя по адресу:  https://entaxy.ru/ для изменения | ||||
| вида лицензии с Базовой бесплатной версии на Подписки. | ||||
| 2.5. Срок использования скачанной Пользователем базовой (некоммерческой) версии лицензии для | ||||
| пробного использования программного обеспечения – не ограничен. | ||||
| 2.6. Использование Пользователем настоящего программного обеспечения в целях разработки, | ||||
| модификации, обновления другого ПО, принадлежащего третьим лицам, а не Правообладателю, | ||||
| без разрешения Правообладателя не допускается. | ||||
|  | ||||
|                                 3. АВТОРСКОЕ ПРАВО. | ||||
|  | ||||
| 3.1. Все авторские права, все права интеллектуальной собственности на Программное обеспечение | ||||
| и любые его копии принадлежат Правообладателю. | ||||
| 3.2. Все авторские права, все права интеллектуальной собственности в отношении любого контента, | ||||
| к которому можно получить доступ с помощью Программного обеспечения, является собственностью | ||||
| соответствующего владельца контента и защищается применимым законодательством об авторском | ||||
| праве или другими законами и договорами об интеллектуальной собственности. | ||||
| 3.3. Условия использования Программного обеспечения. | ||||
| Лицензия, предоставленная Пользователю, действительна только в том случае, если Пользователь | ||||
| придерживается следующих условий: | ||||
| 3.3.1. Принятие уведомлений об авторских правах. Пользователю запрещается удалять или изменять | ||||
| какие-либо уведомления об авторских правах или лицензиях, которые появляются при использовании | ||||
| Программного обеспечения или на нем. | ||||
| 3.3.2. Модификация. Пользователю запрещается модифицировать, изменять, декомпилировать, | ||||
| расшифровывать, дизассемблировать, переводить или реверсировать, перепроектировать | ||||
| Программное обеспечение. | ||||
| 3.3.3. Распространение. Пользователю запрещается сублицензировать, передавать право использования | ||||
| ПО или иным образом распространять или предоставлять Программное обеспечение любой третьей стороне. | ||||
| 3.3.4. SaaS. За исключением случаев, когда это разрешено Правообладателем, Пользователю запрещено | ||||
| использовать Программное обеспечение в коммерческих целях для оказания услуг третьим лицам. | ||||
|  | ||||
|                     4. ОТВЕТСТВЕННОСТЬ ПРАВООБЛАДАТЕЛЯ ПРИ НАРУШЕНИИ ПОЛЬЗОВАТЕЛЕМ ПРАВ «ИС» | ||||
|  | ||||
| 4.1. Правообладатель не несет никаких обязательств в отношении каких-либо претензий к Пользователю | ||||
| на предмет нарушения последним прав Интеллектуальной собственности, возникших в связи с | ||||
| использованием Пользователем: | ||||
| 4.1.1. Любых компонентов программного обеспечения с открытым исходным кодом, включенных в | ||||
| Программное обеспечение; | ||||
| 4.1.2. Любого нарушения правил использования Программного обеспечения, установленного условиями | ||||
| настоящего соглашения; | ||||
| 4.1.3. Любого использования Программного обеспечения в сочетании с другими ПО, оборудованием, | ||||
| или данными, не предоставленными Пользователю Правообладателем; | ||||
| 4.1.4. Любого изменения Программного обеспечения любым третьим лицом, а не Правообладателем. | ||||
|  | ||||
|  | ||||
| 5. НАСТОЯЩИМ ПРАВООБЛАДАТЕЛЬ ЗАЯВЛЯЕТ, ЧТО ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПРЕДОСТАВЛЯЕТСЯ ПОЛЬЗОВАТЕЛЮ | ||||
| ПО ПРИНЦИПУ «AS IS» - «КАК ЕСТЬ». НИ ПРИ КАКИХ ОБСТОЯТЕЛЬСТВАХ ПРАВООБЛАДАТЕЛЬ НЕ ГАРАНТИРУЕТ | ||||
| И НЕ ОБЕЩАЕТ, ЧТО ПРЕДОСТАВЛЕННОЕ ИМ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ БУДЕТ ПОДХОДИТЬ ИЛИ НЕ ПОДХОДИТЬ | ||||
| ДЛЯ КОНКРЕТНЫХ ЦЕЛЕЙ ПОЛЬЗОВАТЕЛЯ, ЧТО ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ БУДЕТ ОТВЕЧАТЬ ВСЕМ КОММЕРЧЕСКИМ | ||||
| И ЛИЧНЫМ СУБЪЕКТИВНЫМ ОЖИДАНИЯМ ПОЛЬЗОВАТЕЛЯ, ЧТО ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ БУДЕТ РАБОТАТЬ | ||||
| ИСПРАВНО, БЕЗ ТЕХНИЧЕСКИХ ОШИБОК, БЫСТРО И БЕСПЕРЕБОЙНО. | ||||
|  | ||||
|                         6. ОГРАНИЧЕНИЕ ОТВЕТСТВЕННОСТИ. | ||||
| НИ ПРИ КАКИХ ОБСТОЯТЕЛЬСТВАХ ПРАВООБЛАДАТЕЛЬ ИЛИ ЕГО АФФИЛЛИРОВАННЫЕ ЛИЦА НЕ НЕСУТ ПЕРЕД ПОЛЬЗОВАТЕЛЕМ | ||||
| ОТВЕТСТВЕННОСТИ ЗА ЛЮБЫЕ ПРЯМЫЕ ИЛИ КОСВЕННЫЕ УБЫТКИ ПОЛЬЗОВАТЕЛЯ, ЕГО РАСХОДЫ ИЛИ РЕАЛЬНЫЙ УЩЕРБ, | ||||
| ВКЛЮЧАЯ, ПОМИМО ПРОЧЕГО, ПРОСТОИ; УТРАТУ БИЗНЕСА; УПУЩЕННУЮ ВЫГОДУ; НЕДОПОЛУЧЕННУЮ ПРИБЫЛЬ; | ||||
| ПОТЕРЮ ИЛИ ПОВРЕЖДЕНИЕ ДАННЫХ, ИМУЩЕСТВА И ИНОЕ. | ||||
| ОГРАНИЧЕНИЯ ПРИМЕНЯЮТСЯ НЕЗАВИСИМО ОТ ОСНОВАНИЯ НАСТУПЛЕНИЯ ОТВЕТСТВЕННОСТИ; В ТОМ ЧИСЛЕ ВСЛЕДСТВИЕ | ||||
| ДЕЙСТВИЯ ИЛИ БЕЗДЕЙСТВИЯ, НЕБРЕЖНОСТИ, УМЫСЛА, ПРЯМОГО ИЛИ КОСВЕННОГО; НЕОСТОРОЖНОСТИ; ЗАБЛУЖДЕНИЯ; | ||||
| КЛЕВЕТЫ; НАРУШЕНИЯ КОНФИДЕНЦИАЛЬНОСТИ ИЛИ ПРАВА ИНТЕЛЛЕКТУАЛЬНОЙ СОБСТВЕННОСТИ; ИЛИ ЛЮБОЕ ДРУГОЕ | ||||
| ОСНОВАНИЕ НАСТУПЛЕНИЯ ОТВЕТСТВЕННОСТИ. | ||||
|  | ||||
|                         7. ОБЯЗАННОСТЬ ПОЛЬЗОВАТЕЛЯ: | ||||
| Не осуществлять самостоятельно и (или) с привлечением третьих лиц нижеследующие действия | ||||
| (включая, но не ограничиваясь) по: | ||||
| -дизассемблированию и (или) декомпилированию (преобразованию объектного кода в исходный код) | ||||
|  Программного обеспечения; | ||||
| -модификации Программного обеспечения, в том числе вносить изменения в объектный код, исходный | ||||
| код Программного обеспечения, за исключением тех изменений, которые вносятся средствами, | ||||
| включёнными в Программное обеспечение и описанными непосредственно в документации к нему; | ||||
| -созданию условий для использования Программного обеспечения лицами, не имеющими прав на | ||||
| использование данного Программного обеспечения, включая (но не ограничиваясь) вмешательство | ||||
| третьих лиц в функционирование Программного обеспечения, предоставление третьим лицам доступа | ||||
| к исследованию и (или) замене настроек Программного обеспечения, включая его первичную установку; | ||||
| -распространению Программного обеспечения в целом или в части (включая приложенную к нему документацию). | ||||
|  | ||||
|                     8. БИБЛИОТЕКА ПО. ИСПОЛЬЗУЕМЫЕ ПРОГРАММНЫЕ СРЕДСТВА. | ||||
|  | ||||
| 8.1. Настоящим, Правообладатель заверяет, что Библиотека программного обеспечения состоит из | ||||
| лицензионных продуктов, используемых на законных основаниях, а | ||||
| именно https://entaxy.ru/libs/licenses/root-aggregated.deps. | ||||
| 8.2. Любые программные средства, применяемые Пользователем при работе с ПО, должны быть | ||||
| совместимы с библиотекой ПО, указанной в п.8.1. настоящего соглашения. | ||||
| 8.3. Перечень внешних модулей ПО, указанный в п.8.1 настоящего соглашения, может изменяться | ||||
| Правообладателем в одностороннем порядке, в зависимости от выпуска релизов программного обеспечения, | ||||
| содержащих все изменения и дополнения программного обеспечения. | ||||
|  | ||||
|                         9. ВНЕСЕНИЕ ИЗМЕНЕНИЙ В ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ. | ||||
|  | ||||
| 9.1.  Программное обеспечение, интеграционная шина «ЭНТАКСИ» (ENTAXY) является свободно распространяемым | ||||
| программным обеспечением. | ||||
| 9.2. Пользователь имеет право вносить изменения в исходный код программного обеспечения исключительно | ||||
| с согласия Правообладателя в порядке предложения изменений/правок/дополнений через механизм | ||||
| «Pull Requests» в открытом репозитории Правообладателя по адресу: https://git.entaxy.ru/entaxy/entaxy-public. | ||||
| 9.3. Любые изменения программного обеспечения, осуществляемые Пользователем без соблюдения условий | ||||
| пункта 9.2. настоящего документа, являются нарушением авторских и смежных прав Правообладателя, | ||||
| прав интеллектуальной собственности Правообладателя и влекут применение к Пользователю мер | ||||
| ответственности в соответствии с условиями настоящей Лицензии, а также применимого законодательства | ||||
| Российской Федерации. | ||||
|  | ||||
|                                 10. ЗАКЛЮЧИТЕЛЬНЫЕ ПОЛОЖЕНИЯ. | ||||
|  | ||||
| 10.1. В случае нарушения Пользователем любого из условий настоящей Лицензии, Правообладатель имеет | ||||
| право взыскать с Пользователя любые причинённые таким нарушением убытки, реальный ущерб, | ||||
| недополученную прибыль, упущенную выгоду, а также в случае нарушения Пользователем условий | ||||
| пункта 9.2 настоящего соглашения, в том числе, взыскать с Пользователя штраф в размере | ||||
| 2 000 000 (Два миллиона) рублей за каждый установленный случай несанкционированного изменения | ||||
| исходного или объектного кода Программного обеспечения «Энтакси» (Entaxy). | ||||
| 10.2. В рамках исполнения Пользователем обязательств по настоящей Лицензии, применимое | ||||
| законодательство – Российской Федерации. | ||||
| 10.3. Если какое-либо положение настоящей Лицензии будет признано судом недействительным, | ||||
| остальные положения будут продолжать своё действие, а Пользователь будет обязан продолжать | ||||
| исполнять свои обязанности в соответствии с этими положениями. | ||||
							
								
								
									
										253
									
								
								ui/entaxy-hawtio/entaxy-cicd-plugin/pom.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,253 @@ | ||||
| <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> | ||||
|     <modelVersion>4.0.0</modelVersion> | ||||
|     <parent> | ||||
|         <groupId>ru.entaxy.esb.ui</groupId> | ||||
|         <artifactId>entaxy-hawtio</artifactId> | ||||
|         <version>1.11.0</version> | ||||
|     </parent> | ||||
|     <groupId>ru.entaxy.esb.ui.hawtio</groupId> | ||||
|     <artifactId>entaxy-cicd-plugin</artifactId> | ||||
|     <packaging>war</packaging> | ||||
|     <name>ENTAXY :: UI :: HAWTIO :: ENTAXY CI/CD PLUGIN</name> | ||||
|     <description>ENTAXY :: UI :: HAWTIO :: ENTAXY CI/CD MANAGEMENT</description> | ||||
|  | ||||
|     <properties> | ||||
|         <!-- filtered plugin properties, we don't define plugin-scripts here | ||||
| 			as we build that dynamically using maven-antrun-plugin below. --> | ||||
|         <!-- plugin-context is what context this plugin will handle requests on | ||||
|           in the application server --> | ||||
|         <plugin-context>/entaxy-cicd</plugin-context> | ||||
|  | ||||
|         <!-- plugin-name is the name of our plugin, affects the name used for | ||||
|           the plugin's mbean --> | ||||
|         <plugin-name>entaxy-cicd</plugin-name> | ||||
|  | ||||
|         <!-- plugin-domain is currently unused, we just define it to an empty | ||||
|           string --> | ||||
|         <plugin-domain /> | ||||
|  | ||||
|         <!-- this lets this plugin deploy nicely into karaf, these get used | ||||
|           for the ImportPackage directive for maven-bundle-plugin --> | ||||
|         <bundle.osgi.import.pkg> | ||||
|             javax.management;resolution:=optional, | ||||
|             org.slf4j;resolution:=optional;version="[1.7,2)", | ||||
|             javax.servlet;version="[3.1,4)" | ||||
|         </bundle.osgi.import.pkg> | ||||
|  | ||||
|         <webapp-dir>${project.artifactId}-${project.version}</webapp-dir> | ||||
|         <webapp-outdir>${basedir}/target/${webapp-dir}</webapp-outdir> | ||||
|         <schema-outdir>${basedir}/src/main/webapp/lib</schema-outdir> | ||||
|         <appjs-outfile>${webapp-outdir}/app/app.js</appjs-outfile> | ||||
|  | ||||
|         <bundle.osgi.remove.headers>Karaf-Commands,Private-Package,Include-Resource</bundle.osgi.remove.headers> | ||||
|     </properties> | ||||
|  | ||||
|  | ||||
|     <dependencies> | ||||
|         <dependency> | ||||
|             <groupId>io.hawt</groupId> | ||||
|             <artifactId>hawtio-plugin-mbean</artifactId> | ||||
|             <exclusions> | ||||
|                 <exclusion> | ||||
|                     <groupId>org.slf4j</groupId> | ||||
|                     <artifactId>slf4j-log4j12</artifactId> | ||||
|                 </exclusion> | ||||
|             </exclusions> | ||||
|         </dependency> | ||||
|  | ||||
|         <!-- dependency> | ||||
|             <groupId>com.google.errorprone</groupId> | ||||
|             <artifactId>error_prone_core</artifactId> | ||||
|         </dependency --> | ||||
|  | ||||
|         <dependency> | ||||
|             <groupId>javax.servlet</groupId> | ||||
|             <artifactId>javax.servlet-api</artifactId> | ||||
|         </dependency> | ||||
|     </dependencies> | ||||
|  | ||||
|     <build> | ||||
|  | ||||
|         <!-- we want to ensure src/main/resources/WEB-INF/web.xml is being filtered | ||||
|           so that it picks up all of our javascript files --> | ||||
|         <resources> | ||||
|             <resource> | ||||
|                 <directory>src/main/resources</directory> | ||||
|                 <filtering>true</filtering> | ||||
|                 <includes> | ||||
|                     <include>**/*.xml</include> | ||||
|                 </includes> | ||||
|             </resource> | ||||
|         </resources> | ||||
|  | ||||
|         <plugins> | ||||
|  | ||||
|             <!-- We use maven-antrun-plugin to build up a list of | ||||
|                  javascript files for our plugin mbean, this means | ||||
|                  it needs to run before the maven-resources-plugin | ||||
|                  copies and filters the web.xml, since for this | ||||
|                  example we use contextParam settings to configure | ||||
|                  our plugin mbean --> | ||||
|  | ||||
|             <plugin> | ||||
|                 <artifactId>maven-antrun-plugin</artifactId> | ||||
|                 <version>${maven-antrun-plugin.version}</version> | ||||
|                 <executions> | ||||
|  | ||||
|                     <execution> | ||||
|                         <!-- we run this early in the build process before | ||||
|                           maven-resources-plugin is run.  We're exporting the | ||||
|                           plugin-scripts property from here, so we need to | ||||
|                           use maven-antrun-plugin 1.6 or up --> | ||||
|                         <id>generate-sources</id> | ||||
|                         <phase>generate-sources</phase> | ||||
|                         <goals> | ||||
|                             <goal>run</goal> | ||||
|                         </goals> | ||||
|                         <configuration> | ||||
|                             <target> | ||||
|                                 <echo>Building plugin javascript file list</echo> | ||||
|                                 <!-- javascript-files will contain all of the javascript in | ||||
|                                   our project --> | ||||
|                                 <fileset id="javascript-files-main" dir="${basedir}/src/main/webapp"> | ||||
|                                     <include name="**/entaxyCICDPlugin.js" /> | ||||
|                                 </fileset> | ||||
|                                 <fileset id="javascript-files-others" dir="${basedir}/src/main/webapp"> | ||||
|                                     <include name="**/*.js" /> | ||||
|                                     <exclude name="**/entaxyCICDPlugin.js" /> | ||||
|                                 </fileset> | ||||
|                                 <!-- we need to strip out the top level path which is | ||||
|                                    our source directory and be sure to change the directory | ||||
|                                    separators to forward slashes --> | ||||
|                                 <pathconvert pathsep="," dirsep="/" property="plugin-scripts-main" refid="javascript-files-main"> | ||||
|                                     <map from="${basedir}/src/main/webapp/" to="" /> | ||||
|                                 </pathconvert> | ||||
|                                 <pathconvert pathsep="," dirsep="/" property="plugin-scripts-others" refid="javascript-files-others"> | ||||
|                                     <map from="${basedir}/src/main/webapp/" to="" /> | ||||
|                                 </pathconvert> | ||||
|  | ||||
|                                 <property name="plugin-scripts" value="${plugin-scripts-main},${plugin-scripts-others}" /> | ||||
|  | ||||
|                                 <echo>Files: ${plugin-scripts}</echo> | ||||
|                                 <!--<replace file="${webapp-outdir}/plugin/js/brandingPlugin.js"> | ||||
|                                     <replacefilter token="@artemis.version@" value="${project.version}" /> | ||||
|                                 </replace>--> | ||||
|  | ||||
|                             </target> | ||||
|                             <!-- this exports plugin-scripts to the maven build, without | ||||
|                               this line ${plugin-scripts} in the web.xml file won't be | ||||
|                               replaced --> | ||||
|                             <exportAntProperties>true</exportAntProperties> | ||||
|                         </configuration> | ||||
|                     </execution> | ||||
|                 </executions> | ||||
|             </plugin> | ||||
|  | ||||
|             <plugin> | ||||
|                 <artifactId>maven-resources-plugin</artifactId> | ||||
|                 <version>${maven-resources-plugin.version}</version> | ||||
|                 <executions> | ||||
|                     <execution> | ||||
|                         <!-- defining this maven plugin in the same phase as the | ||||
|                           maven-antrun-plugin but *after* we've configured the | ||||
|                           maven-antrun-plugin ensures we filter resources *after* | ||||
|                           we've discovered the plugin .js files. --> | ||||
|                         <id>copy-resources</id> | ||||
|                         <phase>generate-sources</phase> | ||||
|                         <goals> | ||||
|                             <goal>resources</goal> | ||||
|                         </goals> | ||||
|                     </execution> | ||||
|                 </executions> | ||||
|             </plugin> | ||||
|  | ||||
|             <!-- maven-bundle-plugin config, needed to make this war | ||||
|               deployable in karaf, defines the context that this bundle | ||||
|               should handle requests on --> | ||||
|             <plugin> | ||||
|                 <groupId>org.apache.felix</groupId> | ||||
|                 <artifactId>maven-bundle-plugin</artifactId> | ||||
|                 <executions> | ||||
|                     <execution> | ||||
|                         <id>bundle-manifest</id> | ||||
|                         <phase>process-classes</phase> | ||||
|                         <goals> | ||||
|                             <goal>manifest</goal> | ||||
|                         </goals> | ||||
|                     </execution> | ||||
|                 </executions> | ||||
|                 <configuration> | ||||
|                     <manifestLocation>${webapp-outdir}/META-INF</manifestLocation> | ||||
|                     <supportedProjectTypes> | ||||
|                         <supportedProjectType>jar</supportedProjectType> | ||||
|                         <supportedProjectType>bundle</supportedProjectType> | ||||
|                         <supportedProjectType>war</supportedProjectType> | ||||
|                     </supportedProjectTypes> | ||||
|                     <instructions> | ||||
|                         <Webapp-Context>${plugin-context}</Webapp-Context> | ||||
|                         <Web-ContextPath>${plugin-context}</Web-ContextPath> | ||||
|  | ||||
|                         <Embed-Directory>WEB-INF/lib</Embed-Directory> | ||||
|                         <Embed-Dependency>*;scope=compile|runtime</Embed-Dependency> | ||||
|                         <Embed-Transitive>true</Embed-Transitive> | ||||
|  | ||||
|                         <!-- Export-Package>${osgi.export}</Export-Package --> | ||||
|                         <!-- Import-Package> | ||||
|                         	javax.management;resolution:=optional, | ||||
|                         	org.slf4j;resolution:=optional;version="[1.7,2)", | ||||
|                         	javax.servlet;version="[3.1,4)" | ||||
| 						</Import-Package --> | ||||
|                         <!-- DynamicImport-Package>${osgi.dynamic}</DynamicImport-Package --> | ||||
|                         <!-- Private-Package></Private-Package --> | ||||
|  | ||||
|                         <Bundle-ClassPath>.,WEB-INF/classes</Bundle-ClassPath> | ||||
|  | ||||
|                         <Bundle-Name>${project.name}</Bundle-Name> | ||||
|                         <Bundle-SymbolicName>${project.groupId}.${project.artifactId}</Bundle-SymbolicName> | ||||
|                         <Implementation-Title>Entaxy</Implementation-Title> | ||||
|                         <Implementation-Version>${project.version}</Implementation-Version> | ||||
|                     </instructions> | ||||
|                 </configuration> | ||||
|             </plugin> | ||||
|  | ||||
|             <!-- We define the maven-war-plugin here and make sure it uses | ||||
|               the manifest file generated by the maven-bundle-plugin.  We | ||||
|               also ensure it picks up our filtered web.xml and not the one | ||||
|               in src/main/resources --> | ||||
|             <plugin> | ||||
|                 <groupId>org.apache.maven.plugins</groupId> | ||||
|                 <artifactId>maven-war-plugin</artifactId> | ||||
|                 <configuration> | ||||
|                     <outputFileNameMapping>@{artifactId}@-@{baseVersion}@@{dashClassifier?}@.@{extension}@</outputFileNameMapping> | ||||
|                     <packagingExcludes>**/classes/OSGI-INF/**</packagingExcludes> | ||||
|                     <failOnMissingWebXml>false</failOnMissingWebXml> | ||||
|                     <archive> | ||||
|                         <manifestFile>${webapp-outdir}/META-INF/MANIFEST.MF</manifestFile> | ||||
|                     </archive> | ||||
|                     <webResources> | ||||
|                         <resource> | ||||
|                             <filtering>true</filtering> | ||||
|                             <directory>src/main/resources</directory> | ||||
|                             <includes> | ||||
|                                 <include>**/*.*</include> | ||||
|                             </includes> | ||||
|                             <excludes> | ||||
|                                 <exclude>log4j.properties</exclude> | ||||
|                             </excludes> | ||||
|                         </resource> | ||||
|                         <resource> | ||||
|                             <filtering>true</filtering> | ||||
|                             <directory>src/main/webapp</directory> | ||||
|                             <includes> | ||||
|                                 <include>**/*.*</include> | ||||
|                             </includes> | ||||
|                             <excludes> | ||||
|                                 <exclude>log4j.properties</exclude> | ||||
|                             </excludes> | ||||
|                         </resource> | ||||
|                     </webResources> | ||||
|                 </configuration> | ||||
|             </plugin> | ||||
|         </plugins> | ||||
|     </build> | ||||
| </project> | ||||
| @@ -0,0 +1,80 @@ | ||||
| /*- | ||||
|  * ~~~~~~licensing~~~~~~ | ||||
|  * entaxy-cicd-plugin | ||||
|  * ========== | ||||
|  * Copyright (C) 2020 - 2025 EmDev LLC | ||||
|  * ========== | ||||
|  * You may not use this file except in accordance with the License Terms of the Copyright | ||||
|  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property | ||||
|  * rights to the Software and any copies are the property of the Copyright Holder. Unless | ||||
|  * it is explicitly allowed the Copyright Holder, the User is prohibited from using the | ||||
|  * Software for commercial purposes to provide services to third parties. | ||||
|  *  | ||||
|  * The Copyright Holder hereby declares that the Software is provided on an "AS IS". | ||||
|  * Under no circumstances does the Copyright Holder guarantee or promise that the | ||||
|  * Software provided by him will be suitable or not suitable for the specific purposes | ||||
|  * of the User, that the Software will meet all commercial and personal subjective | ||||
|  * expectations of the User, that the Software will work properly, without technical | ||||
|  * errors, quickly and uninterruptedly. | ||||
|  *  | ||||
|  * Under no circumstances shall the Copyright Holder or its Affiliates is not liable | ||||
|  * to the User for any direct or indirect losses of the User, his expenses or actual | ||||
|  * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss | ||||
|  * or damage to data, property, etc. | ||||
|  * ~~~~~~/licensing~~~~~~ | ||||
|  */ | ||||
| package ru.entaxy.ui.hawtio.cicd; | ||||
|  | ||||
| import io.hawt.web.plugin.HawtioPlugin; | ||||
| import org.slf4j.Logger; | ||||
| import org.slf4j.LoggerFactory; | ||||
|  | ||||
| import javax.servlet.ServletContext; | ||||
| import javax.servlet.ServletContextEvent; | ||||
| import javax.servlet.ServletContextListener; | ||||
|  | ||||
| /** | ||||
|  * The Plugin Context Listener used to load in the plugin | ||||
|  **/ | ||||
| public class PluginContextListener implements ServletContextListener { | ||||
|  | ||||
|     private static final Logger LOG = LoggerFactory.getLogger(PluginContextListener.class); | ||||
|  | ||||
|     HawtioPlugin plugin = null; | ||||
|  | ||||
|     @Override | ||||
|     public void contextInitialized(ServletContextEvent servletContextEvent) { | ||||
|  | ||||
|         ServletContext context = servletContextEvent.getServletContext(); | ||||
|  | ||||
|         plugin = new HawtioPlugin(); | ||||
|         plugin.setContext(context.getContextPath()); | ||||
|         plugin.setName(context.getInitParameter("plugin-name")); | ||||
|         plugin.setScripts(context.getInitParameter("plugin-scripts")); | ||||
|         plugin.setDomain(null); | ||||
|  | ||||
|         try { | ||||
|             plugin.init(); | ||||
|         } catch (Exception e) { | ||||
|             throw createServletException(e); | ||||
|         } | ||||
|  | ||||
|         LOG.info("Initialized {} plugin", plugin.getName()); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public void contextDestroyed(ServletContextEvent servletContextEvent) { | ||||
|         try { | ||||
|             plugin.destroy(); | ||||
|         } catch (Exception e) { | ||||
|             throw createServletException(e); | ||||
|         } | ||||
|  | ||||
|         LOG.info("Destroyed {} plugin", plugin.getName()); | ||||
|     } | ||||
|  | ||||
|     protected RuntimeException createServletException(Exception e) { | ||||
|         return new RuntimeException(e); | ||||
|     } | ||||
|  | ||||
| } | ||||
| @@ -0,0 +1,73 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <!-- | ||||
|   ~~~~~~licensing~~~~~~ | ||||
|   entaxy-cicd-plugin | ||||
|   ========== | ||||
|   Copyright (C) 2020 - 2025 EmDev LLC | ||||
|   ========== | ||||
|   You may not use this file except in accordance with the License Terms of the Copyright | ||||
|   Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property | ||||
|   rights to the Software and any copies are the property of the Copyright Holder. Unless | ||||
|   it is explicitly allowed the Copyright Holder, the User is prohibited from using the | ||||
|   Software for commercial purposes to provide services to third parties. | ||||
|    | ||||
|   The Copyright Holder hereby declares that the Software is provided on an "AS IS". | ||||
|   Under no circumstances does the Copyright Holder guarantee or promise that the | ||||
|   Software provided by him will be suitable or not suitable for the specific purposes | ||||
|   of the User, that the Software will meet all commercial and personal subjective | ||||
|   expectations of the User, that the Software will work properly, without technical | ||||
|   errors, quickly and uninterruptedly. | ||||
|    | ||||
|   Under no circumstances shall the Copyright Holder or its Affiliates is not liable | ||||
|   to the User for any direct or indirect losses of the User, his expenses or actual | ||||
|   damage, including, downtime; loss of bussines; lost profit; lost earnings; loss | ||||
|   or damage to data, property, etc. | ||||
|   ~~~~~~/licensing~~~~~~ | ||||
|   --> | ||||
|  | ||||
|  | ||||
| <web-app xmlns="http://java.sun.com/xml/ns/j2ee" | ||||
|          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | ||||
|          xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee | ||||
| 	      http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" | ||||
|          version="2.4"> | ||||
|  | ||||
|     <description>Entaxy HawtIO management plugin</description> | ||||
|     <display-name>entaxy hawt.io management plugin</display-name> | ||||
|  | ||||
|     <context-param> | ||||
|         <description>Plugin's path on the server</description> | ||||
|         <param-name>plugin-context</param-name> | ||||
|         <param-value>${plugin-context}</param-value> | ||||
|     </context-param> | ||||
|  | ||||
|     <context-param> | ||||
|         <description>Plugin's path on the server</description> | ||||
|         <param-name>plugin-name</param-name> | ||||
|         <param-value>${plugin-name}</param-value> | ||||
|     </context-param> | ||||
|  | ||||
|     <context-param> | ||||
|         <description>Plugin's path on the server</description> | ||||
|         <param-name>plugin-domain</param-name> | ||||
|         <param-value>${plugin-domain}</param-value> | ||||
|     </context-param> | ||||
|  | ||||
|     <context-param> | ||||
|         <description>Plugin's path on the server</description> | ||||
|         <param-name>plugin-scripts</param-name> | ||||
|         <param-value>${plugin-scripts}</param-value> | ||||
|     </context-param> | ||||
|  | ||||
|     <context-param> | ||||
|         <description>Disable listing of directories and files</description> | ||||
|         <param-name>org.eclipse.jetty.servlet.Default.dirAllowed</param-name> | ||||
|         <param-value>false</param-value> | ||||
|     </context-param> | ||||
|  | ||||
|     <listener> | ||||
|         <listener-class>ru.entaxy.ui.hawtio.cicd.PluginContextListener</listener-class> | ||||
|     </listener> | ||||
|  | ||||
|  | ||||
| </web-app> | ||||
| @@ -0,0 +1,193 @@ | ||||
| /*- | ||||
|  * ~~~~~~licensing~~~~~~ | ||||
|  * entaxy-cicd-plugin | ||||
|  * ========== | ||||
|  * Copyright (C) 2020 - 2025 EmDev LLC | ||||
|  * ========== | ||||
|  * You may not use this file except in accordance with the License Terms of the Copyright | ||||
|  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property | ||||
|  * rights to the Software and any copies are the property of the Copyright Holder. Unless | ||||
|  * it is explicitly allowed the Copyright Holder, the User is prohibited from using the | ||||
|  * Software for commercial purposes to provide services to third parties. | ||||
|  *  | ||||
|  * The Copyright Holder hereby declares that the Software is provided on an "AS IS". | ||||
|  * Under no circumstances does the Copyright Holder guarantee or promise that the | ||||
|  * Software provided by him will be suitable or not suitable for the specific purposes | ||||
|  * of the User, that the Software will meet all commercial and personal subjective | ||||
|  * expectations of the User, that the Software will work properly, without technical | ||||
|  * errors, quickly and uninterruptedly. | ||||
|  *  | ||||
|  * Under no circumstances shall the Copyright Holder or its Affiliates is not liable | ||||
|  * to the User for any direct or indirect losses of the User, his expenses or actual | ||||
|  * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss | ||||
|  * or damage to data, property, etc. | ||||
|  * ~~~~~~/licensing~~~~~~ | ||||
|  */ | ||||
|  | ||||
| var EntaxyCICD; | ||||
| (function (EntaxyCICD) { | ||||
|     EntaxyCICD._module.component('entaxyCiCdApplication', { | ||||
|         template: | ||||
|         ` | ||||
|           <div class="entaxy-cicd-zero-revision-note" ng-if="$ctrl.isRevisionSelected && $ctrl.revision === '0'"> | ||||
|             <entaxy-form-field-extra-info type="'info'" message="$ctrl.zeroRevisionNote"></entaxy-form-field-extra-info> | ||||
|           </div> | ||||
|           <div ng-if="$ctrl.versions || $ctrl.isVersionSelected || $ctrl.isRevisionSelected" | ||||
|                 class="entaxy-cicd-header-container"> | ||||
|             <div class="entaxy-cicd-title-with-info-container"> | ||||
|               <span class="first" ng-class="{'lead': !$ctrl.isVersionSelected && !$ctrl.isRevisionSelected}"> | ||||
|                 Application: {{$ctrl.application}} | ||||
|               </span> | ||||
|               <span ng-class="{'lead': $ctrl.isVersionSelected}"  | ||||
|                     ng-if="$ctrl.isVersionSelected || $ctrl.isRevisionSelected"> | ||||
|                 Version: {{$ctrl.version}} | ||||
|               </span> | ||||
|               <div ng-if="!$ctrl.isVersionSelected && !$ctrl.isRevisionSelected"> | ||||
|                 <span>Version:</span> | ||||
|                 <entaxy-select-from-enum values="$ctrl.versions" model="$ctrl.version" | ||||
|                           is-empty-included="false"></entaxy-select-from-enum>                         | ||||
|               </div> | ||||
|               <span ng-if="$ctrl.isVersionSelected"> | ||||
|                 Last Revision: {{$ctrl.lastRevision}} | ||||
|               </span> | ||||
|               <span ng-if="$ctrl.isVersionSelected"> | ||||
|                 Installed Revision: {{$ctrl.installedRevision}} | ||||
|               </span> | ||||
|               <span class="lead" ng-if="$ctrl.isRevisionSelected"> | ||||
|                 Revision: {{$ctrl.revision}} | ||||
|               </span> | ||||
|               <span ng-if="$ctrl.isRevisionSelected"> | ||||
|                 Revision Status: {{$ctrl.revisionStatus}} | ||||
|               </span> | ||||
|             </div> | ||||
|             <div ng-if="$ctrl.isRevisionSelected" class="entaxy-cicd-header-buttons-container"> | ||||
|               <entaxy-ci-cd-application-management-buttons storage="$ctrl.storage" application="$ctrl.application" | ||||
|                         version="$ctrl.version" revision="$ctrl.revision" revision-status="$ctrl.revisionStatus"> | ||||
|               </entaxy-ci-cd-application-management-buttons> | ||||
|             </div> | ||||
|             <div class="dropdown primary-action entaxy-cicd-header-buttons-container" | ||||
|                     uib-dropdown ng-if="$ctrl.isVersionSelected"> | ||||
|               <button class="dropdown-toggle" uib-dropdown-toggle type="button"> | ||||
|                 Add Revision | ||||
|                 <span class="caret"></span> | ||||
|               </button> | ||||
|               <ul class="dropdown-menu dropdown-menu-right"> | ||||
|                 <li role="menuitem" ng-click="$ctrl.addRevision()"> | ||||
|                   <a class="secondary-action">Add Revision</a> | ||||
|                 </li> | ||||
|                 <li role="menuitem" ng-click="$ctrl.addRevisionFromExistent()"> | ||||
|                   <a class="secondary-action">Add Revision From Existent</a> | ||||
|                 </li> | ||||
|               </ul> | ||||
|             </div> | ||||
|           </div> | ||||
|            | ||||
|           <div class="entaxy-cicd-content-container"> | ||||
|             <h2 class="first"> | ||||
|               Items | ||||
|             </h2> | ||||
|              | ||||
|             <entaxy-ci-cd-application-items version="$ctrl.version"></entaxy-ci-cd-application-items> | ||||
|                | ||||
|             <h2> | ||||
|               Requirements | ||||
|             </h2> | ||||
|                | ||||
|             <entaxy-ci-cd-requirements version="$ctrl.version" type="Application"></entaxy-ci-cd-requirements> | ||||
|           </div> | ||||
|         `, | ||||
|         controller: EntaxyCICDApplicationController | ||||
|     }) | ||||
|         .name; | ||||
|  | ||||
|     function EntaxyCICDApplicationController(workspace, $uibModal, entaxyCICDService) { | ||||
|         'ngInject'; | ||||
|  | ||||
|         let ctrl = this; | ||||
|         ctrl.zeroRevisionNote = 'Revision 0 cannot be configured'; | ||||
|  | ||||
|         ctrl.$onInit = function() { | ||||
|  | ||||
|             ctrl.storage = EntaxyCICD.getStorage(workspace.selection); | ||||
|             ctrl.application = EntaxyCICD.getProjectOrApplication(workspace.selection); | ||||
|  | ||||
|             ctrl.isVersionSelected = EntaxyCICD.isVersion(workspace.selection); | ||||
|             ctrl.isRevisionSelected = EntaxyCICD.isRevision(workspace.selection); | ||||
|  | ||||
|             if (ctrl.isVersionSelected || ctrl.isRevisionSelected) { | ||||
|                 ctrl.version = EntaxyCICD.getVersion(workspace.selection); | ||||
|  | ||||
|                 if (ctrl.isRevisionSelected) { | ||||
|                     let revisionInfo = EntaxyCICD.getRevisionInfo(workspace.selection); | ||||
|                     ctrl.revision = revisionInfo.revision; | ||||
|                     ctrl.revisionStatus = revisionInfo.revisionStatus; | ||||
|                 } else { | ||||
|                     entaxyCICDService.executeOperation('readApplicationVersionLastAndInstalledRevision', | ||||
|                         [ctrl.storage, ctrl.application, ctrl.version]) | ||||
|                     .then(result => { | ||||
|                         let revisionsInfo = JSON.parse(result); | ||||
|                         ctrl.lastRevision = revisionsInfo.lastRevision; | ||||
|                         ctrl.installedRevision = revisionsInfo.installedRevision; | ||||
|                     }); | ||||
|                 } | ||||
|             } else { | ||||
|                 populateVersions(); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         function populateVersions() { | ||||
|             ctrl.versions = EntaxyCICD.getVersions(workspace.selection); | ||||
|             if (ctrl.versions.length > 0) { | ||||
|                 ctrl.version = ctrl.versions[ctrl.versions.length - 1]; | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         ctrl.addRevision = function () { | ||||
|             createRevision(-1); | ||||
|         } | ||||
|  | ||||
|         ctrl.addRevisionFromExistent = function () { | ||||
|             let formFields = [ | ||||
|                 { | ||||
|                     label: 'Prototype Revision', | ||||
|                     name: 'prototypeRevision', | ||||
|                     enum: true, | ||||
|                     required: true, | ||||
|                     values: workspace.selection.children.map(revision => revision.title.split(' ')[0]), | ||||
|                     setFocused: true | ||||
|                 } | ||||
|             ]; | ||||
|             openCreateRevisionModal(formFields); | ||||
|         } | ||||
|  | ||||
|         function openCreateRevisionModal(formFields) { | ||||
|             $uibModal.open({ | ||||
|                 component: 'entaxyCiCdSimpleFieldsModal', | ||||
|                 resolve: { | ||||
|                     modalTitle: () => 'Create Revision', | ||||
|                     formFields: () => formFields | ||||
|                 }, | ||||
|                 backdrop: 'static' | ||||
|             }).result.then((args) => { | ||||
|                 createRevision(...args); | ||||
|             }, reason => { | ||||
|                 if (reason && reason !== Entaxy.MODAL_CANCEL_REASON.ESCAPE_KEY_PRESS) { | ||||
|                     Entaxy.notificationError(reason); | ||||
|                 } | ||||
|             }); | ||||
|         } | ||||
|  | ||||
|         function createRevision(prototypeRevision) { | ||||
|             entaxyCICDService.executeOperation('createRevision', | ||||
|                 [ctrl.storage, ctrl.application, ctrl.version, prototypeRevision]) | ||||
|             .then(result => { | ||||
|                 Entaxy.notificationSuccess(result); | ||||
|                 entaxyCICDService.treeUpdated(); | ||||
|             }).catch(error => { | ||||
|                 Entaxy.notificationError(error); | ||||
|             }); | ||||
|         } | ||||
|     } | ||||
|     EntaxyCICDApplicationController.$inject = ['workspace', '$uibModal', 'entaxyCICDService']; | ||||
|  | ||||
| })(EntaxyCICD || (EntaxyCICD = {})); | ||||
| @@ -0,0 +1,108 @@ | ||||
| /*- | ||||
|  * ~~~~~~licensing~~~~~~ | ||||
|  * entaxy-cicd-plugin | ||||
|  * ========== | ||||
|  * Copyright (C) 2020 - 2025 EmDev LLC | ||||
|  * ========== | ||||
|  * You may not use this file except in accordance with the License Terms of the Copyright | ||||
|  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property | ||||
|  * rights to the Software and any copies are the property of the Copyright Holder. Unless | ||||
|  * it is explicitly allowed the Copyright Holder, the User is prohibited from using the | ||||
|  * Software for commercial purposes to provide services to third parties. | ||||
|  *  | ||||
|  * The Copyright Holder hereby declares that the Software is provided on an "AS IS". | ||||
|  * Under no circumstances does the Copyright Holder guarantee or promise that the | ||||
|  * Software provided by him will be suitable or not suitable for the specific purposes | ||||
|  * of the User, that the Software will meet all commercial and personal subjective | ||||
|  * expectations of the User, that the Software will work properly, without technical | ||||
|  * errors, quickly and uninterruptedly. | ||||
|  *  | ||||
|  * Under no circumstances shall the Copyright Holder or its Affiliates is not liable | ||||
|  * to the User for any direct or indirect losses of the User, his expenses or actual | ||||
|  * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss | ||||
|  * or damage to data, property, etc. | ||||
|  * ~~~~~~/licensing~~~~~~ | ||||
|  */ | ||||
|  | ||||
| var EntaxyCICD; | ||||
| (function (EntaxyCICD) { | ||||
|     EntaxyCICD._module.component('entaxyCiCdApplicationManagementButtons', { | ||||
|         bindings: { | ||||
|             storage: '<', | ||||
|             application: '<', | ||||
|             version: '<', | ||||
|             revision: '<', | ||||
|             revisionStatus: '<', | ||||
|             isConfigurationDirty: '<' | ||||
|         }, | ||||
|         template: | ||||
|         ` | ||||
|           <button type="button" ng-click="$ctrl.configure()" | ||||
|                 ng-if="!$ctrl.isInstalled && !$ctrl.isUninstalled">Configure</button> | ||||
|           <button type="button" ng-click="$ctrl.deploy()" | ||||
|                 ng-if="!$ctrl.isInstalled && !$ctrl.isUninstalled">Deploy</button> | ||||
|           <button type="button" ng-click="$ctrl.install()" ng-if="!$ctrl.isInstalled">Install</button> | ||||
|           <button type="button" ng-click="$ctrl.uninstall()" ng-if="$ctrl.isInstalled">Uninstall</button> | ||||
|         `, | ||||
|         controller: EntaxyCICDApplicationManagementButtonsController | ||||
|     }) | ||||
|         .name; | ||||
|  | ||||
|     function EntaxyCICDApplicationManagementButtonsController(workspace, entaxyCICDService) { | ||||
|         'ngInject'; | ||||
|  | ||||
|         let ctrl = this; | ||||
|  | ||||
|         ctrl.$onInit = function() { | ||||
|             ctrl.isConfigured = ctrl.revisionStatus === EntaxyCICD.REVISION_STATUS.CONFIGURED; | ||||
|             ctrl.isDeployed = ctrl.revisionStatus === EntaxyCICD.REVISION_STATUS.DEPLOYED; | ||||
|             ctrl.isInstalled = ctrl.revisionStatus === EntaxyCICD.REVISION_STATUS.INSTALLED; | ||||
|             ctrl.isUninstalled = ctrl.revisionStatus === EntaxyCICD.REVISION_STATUS.UNINSTALLED; | ||||
|         } | ||||
|  | ||||
|         const OPERATION_TYPE = { | ||||
|             CONFIGURE: 'configure', | ||||
|             DEPLOY: 'deploy', | ||||
|             INSTALL: 'install', | ||||
|             UNINSTALL: 'uninstall' | ||||
|         } | ||||
|  | ||||
|         ctrl.configure = function () { | ||||
|             processOperation(OPERATION_TYPE.CONFIGURE); | ||||
|         } | ||||
|  | ||||
|         ctrl.deploy = function () { | ||||
|             processOperation(OPERATION_TYPE.DEPLOY); | ||||
|         } | ||||
|  | ||||
|         ctrl.install = function () { | ||||
|             processOperation(OPERATION_TYPE.INSTALL); | ||||
|         } | ||||
|  | ||||
|         ctrl.uninstall = function () { | ||||
|             processOperation(OPERATION_TYPE.UNINSTALL); | ||||
|         } | ||||
|  | ||||
|         function processOperation(operationType) { | ||||
|             if (!ctrl.isConfigurationDirty || confirm(Entaxy.CONFIRMATION.UNSAVED_CHANGES)) { | ||||
|  | ||||
|                 entaxyCICDService.executeOperation(operationType + 'Revision', | ||||
|                     [ctrl.storage, ctrl.application, ctrl.version, ctrl.revision]) | ||||
|                 .then(result => { | ||||
|                     let message = | ||||
|                         operationType === OPERATION_TYPE.INSTALL || operationType === OPERATION_TYPE.UNINSTALL ? | ||||
|                             EntaxyCICD.capitalize(operationType) + 'ation started successfully. ' + | ||||
|                             '<b>Please notice that operation may take some time.</b>' : result; | ||||
|                     Entaxy.notification(Entaxy.NOTIFICATION_TYPE.SUCCESS, message, | ||||
|                         Entaxy.configuration[Entaxy.CONFIGURATION_KEYS.NOTIFICATION_TIMEOUT_SUCCESS]); | ||||
|                     entaxyCICDService.treeUpdated(); | ||||
|                 }).catch(error => { | ||||
|                     Entaxy.notificationError(error); | ||||
|                     EntaxyCICD.log.error(error); | ||||
|                 }); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|     EntaxyCICDApplicationManagementButtonsController.$inject = ['workspace', 'entaxyCICDService']; | ||||
|  | ||||
| })(EntaxyCICD || (EntaxyCICD = {})); | ||||
| @@ -0,0 +1,143 @@ | ||||
| /*- | ||||
|  * ~~~~~~licensing~~~~~~ | ||||
|  * entaxy-cicd-plugin | ||||
|  * ========== | ||||
|  * Copyright (C) 2020 - 2025 EmDev LLC | ||||
|  * ========== | ||||
|  * You may not use this file except in accordance with the License Terms of the Copyright | ||||
|  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property | ||||
|  * rights to the Software and any copies are the property of the Copyright Holder. Unless | ||||
|  * it is explicitly allowed the Copyright Holder, the User is prohibited from using the | ||||
|  * Software for commercial purposes to provide services to third parties. | ||||
|  *  | ||||
|  * The Copyright Holder hereby declares that the Software is provided on an "AS IS". | ||||
|  * Under no circumstances does the Copyright Holder guarantee or promise that the | ||||
|  * Software provided by him will be suitable or not suitable for the specific purposes | ||||
|  * of the User, that the Software will meet all commercial and personal subjective | ||||
|  * expectations of the User, that the Software will work properly, without technical | ||||
|  * errors, quickly and uninterruptedly. | ||||
|  *  | ||||
|  * Under no circumstances shall the Copyright Holder or its Affiliates is not liable | ||||
|  * to the User for any direct or indirect losses of the User, his expenses or actual | ||||
|  * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss | ||||
|  * or damage to data, property, etc. | ||||
|  * ~~~~~~/licensing~~~~~~ | ||||
|  */ | ||||
|  | ||||
| var EntaxyCICD; | ||||
| (function (EntaxyCICD) { | ||||
|     EntaxyCICD._module.component('entaxyCiCdApplications', { | ||||
|         template: | ||||
|         ` | ||||
|           <div class="entaxy-cicd-content-with-title-container"> | ||||
|             <h2> | ||||
|               Applications | ||||
|             </h2> | ||||
|  | ||||
|             <entaxy-ci-cd-applications-table type="Application" | ||||
|                 import-from-file="$ctrl.importFromFile" import-from-repository="$ctrl.importFromRepository"> | ||||
|             </entaxy-ci-cd-applications-table> | ||||
|           </div> | ||||
|         `, | ||||
|         controller: EntaxyCICDApplicationsController | ||||
|     }) | ||||
|     .name; | ||||
|  | ||||
|     function EntaxyCICDApplicationsController(workspace, $uibModal, entaxyCICDService) { | ||||
|         'ngInject'; | ||||
|  | ||||
|         let ctrl = this; | ||||
|  | ||||
|         const isStorageSelected = EntaxyCICD.isStorage(workspace.selection); | ||||
|  | ||||
|         ctrl.$onInit = function() { | ||||
|         } | ||||
|  | ||||
|         function getFormFields(isFromRepository) { | ||||
|             let formFields = [ | ||||
|                 { | ||||
|                     name: 'storage', | ||||
|                     label: 'Storage', | ||||
|                     type: 'string', | ||||
|                     value: isStorageSelected ? workspace.selection.title : undefined, | ||||
|                     enum: isStorageSelected ? undefined : true, | ||||
|                     values: isStorageSelected ? undefined : workspace.selection.children.map(child => child.title), | ||||
|                     required: true, | ||||
|                     readOnly: isStorageSelected ? true : undefined, | ||||
|                     setFocused: true | ||||
|                 } | ||||
|             ]; | ||||
|             if (isFromRepository) { | ||||
|                 formFields.push({ | ||||
|                     name: 'mavenUrl', | ||||
|                     label: 'Maven Url', | ||||
|                     type: 'string', | ||||
|                     required: true | ||||
|                 }); | ||||
|             } else { | ||||
|                 formFields.push({ | ||||
|                     name: 'file', | ||||
|                     label: 'File', | ||||
|                     resource: true, | ||||
|                     required: true | ||||
|                 }); | ||||
|             } | ||||
|             return formFields; | ||||
|         } | ||||
|  | ||||
|         ctrl.importFromFile = function () { | ||||
|             openModalAndProcessResults(false); | ||||
|         } | ||||
|  | ||||
|         ctrl.importFromRepository = function () { | ||||
|             openModalAndProcessResults(true); | ||||
|         } | ||||
|  | ||||
|         function openModalAndProcessResults(isFromRepository) { | ||||
|             $uibModal.open({ | ||||
|                 component: 'entaxyCiCdSimpleFieldsModal', | ||||
|                 resolve: { | ||||
|                     modalTitle: () => 'Import Application From ' + (isFromRepository ? 'Repository' : 'File'), | ||||
|                     formFields: () => getFormFields(isFromRepository) | ||||
|                 }, | ||||
|                 backdrop: 'static' | ||||
|             }) | ||||
|             .result.then(args => { | ||||
|                 if (isFromRepository) { | ||||
|                     processOperation('importFromRepository', args); | ||||
|                 } else { | ||||
|                     importFromFile(args); | ||||
|                 } | ||||
|             }, | ||||
|             reason => { | ||||
|                 if (reason && reason !== Entaxy.MODAL_CANCEL_REASON.ESCAPE_KEY_PRESS) { | ||||
|                     Entaxy.notificationError(reason); | ||||
|                 } | ||||
|             }); | ||||
|         } | ||||
|  | ||||
|         function importFromFile(args) { | ||||
|             let file = args[1]; | ||||
|             const reader = new FileReader(); | ||||
|             reader.readAsBinaryString(file); | ||||
|             reader.onloadend = function () { | ||||
|                 const base64String = btoa(reader.result); | ||||
|                 processOperation('importFromBase64String', [args[0], base64String]); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         function processOperation(operationName, properties) { | ||||
|             entaxyCICDService.executeOperation(operationName, properties) | ||||
|             .then(result => { | ||||
|                 Entaxy.notificationSuccess(result); | ||||
|                 entaxyCICDService.treeUpdated(); | ||||
|             }) | ||||
|             .catch(error => { | ||||
|                 Entaxy.notificationError(error); | ||||
|                 EntaxyCICD.log.error(error); | ||||
|             }); | ||||
|         } | ||||
|     } | ||||
|     EntaxyCICDApplicationsController.$inject = ['workspace', '$uibModal', 'entaxyCICDService']; | ||||
|  | ||||
| })(EntaxyCICD || (EntaxyCICD = {})); | ||||
| @@ -0,0 +1,297 @@ | ||||
| /*- | ||||
|  * ~~~~~~licensing~~~~~~ | ||||
|  * entaxy-cicd-plugin | ||||
|  * ========== | ||||
|  * Copyright (C) 2020 - 2025 EmDev LLC | ||||
|  * ========== | ||||
|  * You may not use this file except in accordance with the License Terms of the Copyright | ||||
|  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property | ||||
|  * rights to the Software and any copies are the property of the Copyright Holder. Unless | ||||
|  * it is explicitly allowed the Copyright Holder, the User is prohibited from using the | ||||
|  * Software for commercial purposes to provide services to third parties. | ||||
|  *  | ||||
|  * The Copyright Holder hereby declares that the Software is provided on an "AS IS". | ||||
|  * Under no circumstances does the Copyright Holder guarantee or promise that the | ||||
|  * Software provided by him will be suitable or not suitable for the specific purposes | ||||
|  * of the User, that the Software will meet all commercial and personal subjective | ||||
|  * expectations of the User, that the Software will work properly, without technical | ||||
|  * errors, quickly and uninterruptedly. | ||||
|  *  | ||||
|  * Under no circumstances shall the Copyright Holder or its Affiliates is not liable | ||||
|  * to the User for any direct or indirect losses of the User, his expenses or actual | ||||
|  * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss | ||||
|  * or damage to data, property, etc. | ||||
|  * ~~~~~~/licensing~~~~~~ | ||||
|  */ | ||||
|  | ||||
| var EntaxyCICD; | ||||
| (function (EntaxyCICD) { | ||||
|     EntaxyCICD._module.component('entaxyCiCdConfiguration', { | ||||
|         bindings: { | ||||
|             configurationId: '<', | ||||
|             configured: '<', | ||||
|             isDirty: '=' | ||||
|         }, | ||||
|         template: | ||||
|         ` | ||||
|           <div class="entaxy-cicd-header-container"> | ||||
|             <h2> | ||||
|               Configuration: {{$ctrl.configurationId}} | ||||
|             </h2> | ||||
|           </div> | ||||
|            | ||||
|           <div class="entaxy-cicd-subtitle-info-container"> | ||||
|             <span>Configured Id: {{$ctrl.configuredId}}</span> | ||||
|             <span>Configured Type: {{$ctrl.configuredType}}</span> | ||||
|           </div> | ||||
|            | ||||
|           <pf-toolbar class="entaxy-toolbar" config="$ctrl.toolbarConfig"></pf-toolbar> | ||||
|           <form name="entaxyObjectForm" class="form-horizontal"> | ||||
|             <div class="entaxy-table-with-inputs" ng-if="$ctrl.viewedItems && $ctrl.viewedItems.length > 0"> | ||||
|               <table datatable="ng" dt-options="$ctrl.dtOptions" | ||||
|                     class="table-view-container table table-striped table-bordered table-hover dataTable no-footer"> | ||||
|                 <thead> | ||||
|                   <tr role="row"> | ||||
|                     <th>Name</th> | ||||
|                     <th>Display Name</th> | ||||
|                     <th>Imported Value</th> | ||||
|                     <th>Local Value</th> | ||||
|                   </tr> | ||||
|                 </thead> | ||||
|                 <tbody> | ||||
|                   <tr role="row" ng-repeat="field in $ctrl.viewedItems"> | ||||
|                     <td ng-class="{'red': field.isRed, 'green': field.isGreen, 'bold': field.importedValue !== field.originValue}"> | ||||
|                       {{ field.name }} | ||||
|                     </td> | ||||
|                     <td>{{ field.displayName }}</td> | ||||
|                     <td class="field-input-cell" ng-class="{'field-input-checkbox-cell': field.type === 'checkbox'}" | ||||
|                             ng-if="$ctrl.configured"> | ||||
|                       <input type="{{field.type}}" ng-class="{'form-control': field.type !== 'checkbox'}" | ||||
|                             ng-model="field.importedValue" ng-change="$ctrl.checkDirtiness()"/> | ||||
|                     </td> | ||||
|                     <td ng-if="!$ctrl.configured">{{ field.importedValue }}</td> | ||||
|                     <td>{{ field.localValue }}</td> | ||||
|                   </tr> | ||||
|                 </tbody> | ||||
|               </table> | ||||
|             </div> | ||||
|           </form> | ||||
|           <pf-empty-state ng-if="!$ctrl.viewedItems || $ctrl.viewedItems.length == 0"></pf-empty-state> | ||||
|         `, | ||||
|         controller: EntaxyCICDConfigurationController | ||||
|     }) | ||||
|         .name; | ||||
|  | ||||
|     function EntaxyCICDConfigurationController(workspace, $scope, $location, entaxyCICDService, entaxyService, | ||||
|                                                entaxyHotkeysService) { | ||||
|         'ngInject'; | ||||
|  | ||||
|         let ctrl = this; | ||||
|  | ||||
|         ctrl.dtOptions = { | ||||
|             autoWidth: false, | ||||
|             destroy: true, | ||||
|             order: [[0, "asc"]], | ||||
|             dom: "t", | ||||
|             paging: false | ||||
|         }; | ||||
|  | ||||
|         ctrl.toolbarConfig = { | ||||
|             filterConfig: { | ||||
|                 fields: [ | ||||
|                     { | ||||
|                         id: 'displayName', | ||||
|                         title: 'Display Name', | ||||
|                         placeholder: 'Filter by Display Name...', | ||||
|                         filterType: 'text' | ||||
|                     }, | ||||
|                     { | ||||
|                         id: 'name', | ||||
|                         title: 'Name', | ||||
|                         placeholder: 'Filter by Name...', | ||||
|                         filterType: 'text' | ||||
|                     } | ||||
|                 ], | ||||
|                 inlineResults: true, | ||||
|                 appliedFilters: [], | ||||
|                 onFilterChange: filterChange | ||||
|             }, | ||||
|             isTableView: true | ||||
|         }; | ||||
|  | ||||
|         function filterChange(filters) { | ||||
|             ctrl.viewedItems = Entaxy.applyFilters(ctrl.items, filters, matchesFilter); | ||||
|             ctrl.toolbarConfig.filterConfig.resultsCount = ctrl.viewedItems.length; | ||||
|         }; | ||||
|  | ||||
|         function matchesFilter(item, filter) { | ||||
|             let match = true; | ||||
|             if (filter.id === 'name') { | ||||
|                 match = item.name.toLowerCase().match(filter.value.toLowerCase()) !== null; | ||||
|             } else if (filter.id === 'displayName') { | ||||
|                 match = item.displayName.toLowerCase().match(filter.value.toLowerCase()) !== null; | ||||
|             } | ||||
|             return match; | ||||
|         }; | ||||
|  | ||||
|         ctrl.checkDirtiness = function () { | ||||
|             if ($scope.entaxyObjectForm.$dirty) { | ||||
|                 let isDirty = false; | ||||
|                 for (let i = 0; i < ctrl.items.length; i++) { | ||||
|                     if (ctrl.items[i].importedValue !== ctrl.items[i].originValue) { | ||||
|                         isDirty = true; | ||||
|                         break; | ||||
|                     } | ||||
|                 } | ||||
|                 if (!isDirty) { | ||||
|                     $scope.entaxyObjectForm.$setPristine(); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         setTimeout( function () { | ||||
|             ctrl.activeTabIndex = entaxyService.getActiveTabIndex(); | ||||
|         }); | ||||
|  | ||||
|         $scope.$on("$locationChangeStart", function(event) { | ||||
|             if ($scope.entaxyObjectForm.$dirty && !confirm(Entaxy.CONFIRMATION.UNSAVED_CHANGES)) { | ||||
|                 event.preventDefault(); | ||||
|                 ctrl.isTreeOrTabSelectionUpdateNeeded = true; | ||||
|             } | ||||
|         }); | ||||
|  | ||||
|         $scope.$watch('$ctrl.isTreeOrTabSelectionUpdateNeeded', function (newValue) { | ||||
|             if (newValue) { | ||||
|                 setTimeout(function () { | ||||
|                     entaxyService.updateTabSelection(ctrl.activeTabIndex); | ||||
|                 }); | ||||
|                 Jmx.updateTreeSelectionFromURL($location, $(entaxyCICDTreeElementId)); | ||||
|                 ctrl.isTreeOrTabSelectionUpdateNeeded = false; | ||||
|             } | ||||
|         }); | ||||
|  | ||||
|         ctrl.$onInit = function() { | ||||
|             entaxyHotkeysService.setHotkeys($scope, getHotkeysConfigs()); | ||||
|  | ||||
|             if (ctrl.configured) { | ||||
|                 let primaryActions = [ | ||||
|                     { name: 'Clear Changes', actionFn: clearChanges }, | ||||
|                     { name: 'Copy Local Values', actionFn: useLocalValues }, | ||||
|                     { name: 'Save Changes', actionFn: save } | ||||
|                 ]; | ||||
|  | ||||
|                 ctrl.toolbarConfig.actionsConfig = { | ||||
|                     primaryActions: primaryActions | ||||
|                 }; | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         const storage = EntaxyCICD.getStorage(workspace.selection); | ||||
|         const application = EntaxyCICD.getProjectOrApplication(workspace.selection); | ||||
|         const version = EntaxyCICD.getVersion(workspace.selection); | ||||
|         const revision = workspace.selection.title.split(' ')[0]; | ||||
|  | ||||
|         $scope.$watch('entaxyObjectForm.$dirty', function () { | ||||
|             ctrl.isDirty = $scope.entaxyObjectForm.$dirty; | ||||
|         }); | ||||
|  | ||||
|         $scope.$watch('$ctrl.configurationId', function () { | ||||
|             $scope.entaxyObjectForm.$setPristine(); | ||||
|             populateTable(); | ||||
|         }); | ||||
|  | ||||
|         function populateTable() { | ||||
|  | ||||
|             entaxyCICDService.executeOperation('readRevisionConfiguration', | ||||
|                 [storage, application, version, revision, ctrl.configurationId]) | ||||
|             .then(result => { | ||||
|                 let config = JSON.parse(result); | ||||
|  | ||||
|                 ctrl.configuredId = config.id; | ||||
|                 ctrl.configuredType = config.type; | ||||
|  | ||||
|                 let fields = config.fields; | ||||
|                 ctrl.items = fields.length === 0 ? [] : fields.map(field => { | ||||
|                     field.type = Entaxy.convertToHtmlInputType(field.type); | ||||
|                     if (field.importedValue === "" || field.importedValue === null) { | ||||
|                         field.isRed = true; | ||||
|                     } else if (field.localValue === "" || field.localValue === null) { | ||||
|                         field.isGreen = true; | ||||
|                     } | ||||
|                     if (field.type === 'number') { | ||||
|                         field.importedValue = field.importedValue !== null ? JSON.parse(field.importedValue) : null; | ||||
|                     } | ||||
|                     field.originValue = field.importedValue; | ||||
|                     return field; | ||||
|                 }); | ||||
|                 filterChange(ctrl.toolbarConfig.filterConfig.appliedFilters); | ||||
|             }).catch(error => { | ||||
|                 Entaxy.notificationError('Can not read configuration: ' + error); | ||||
|                 EntaxyCICD.log.error(error); | ||||
|             }); | ||||
|         } | ||||
|  | ||||
|         function clearChanges() { | ||||
|             if ($scope.entaxyObjectForm.$dirty) { | ||||
|                 ctrl.items = ctrl.items.map(item => { | ||||
|                     item.importedValue = item.originValue; | ||||
|                     return item; | ||||
|                 }); | ||||
|                 filterChange(ctrl.toolbarConfig.filterConfig.appliedFilters); | ||||
|                 $scope.entaxyObjectForm.$setPristine(); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         function useLocalValues() { | ||||
|             ctrl.items = ctrl.items.map(item => { | ||||
|                 item.importedValue = item.localValue; | ||||
|                 return item; | ||||
|             }); | ||||
|             if (!$scope.entaxyObjectForm.$dirty) { | ||||
|                 $scope.entaxyObjectForm.$setDirty(); | ||||
|             } else { | ||||
|                 ctrl.checkDirtiness(); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         function save() { | ||||
|             if ($scope.entaxyObjectForm.$dirty) { | ||||
|                 let properties = getProperties(); | ||||
|  | ||||
|                 entaxyCICDService.executeOperation('saveRevisionConfiguration', | ||||
|                     [storage, application, version, revision, ctrl.configurationId, properties]) | ||||
|                 .then(result => { | ||||
|                     Entaxy.notificationSuccess(result); | ||||
|                     $scope.entaxyObjectForm.$setPristine(); | ||||
|                     populateTable(); | ||||
|                 }).catch(error => { | ||||
|                     Entaxy.notificationError(error); | ||||
|                     EntaxyCICD.log.error(error); | ||||
|                 }); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         function getProperties() { | ||||
|             let filteredFields = ctrl.items.filter(field => field.importedValue !== field.originValue); | ||||
|  | ||||
|             if (filteredFields && filteredFields.length > 0) { | ||||
|                 return filteredFields.reduce((obj, cur) => ({ ...obj, [cur.name] : cur.importedValue }), {}); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         function getHotkeysConfigs() { | ||||
|             return [ | ||||
|                 { | ||||
|                     ...Entaxy.getSaveHotkeyDescription(), | ||||
|                     callback: function (event) { | ||||
|                         event.preventDefault(); | ||||
|                         save(); | ||||
|                     } | ||||
|                 } | ||||
|             ]; | ||||
|         } | ||||
|     } | ||||
|     EntaxyCICDConfigurationController.$inject = ['workspace', '$scope', '$location', 'entaxyCICDService', | ||||
|         'entaxyService', 'entaxyHotkeysService']; | ||||
|  | ||||
| })(EntaxyCICD || (EntaxyCICD = {})); | ||||
| @@ -0,0 +1,189 @@ | ||||
| /*- | ||||
|  * ~~~~~~licensing~~~~~~ | ||||
|  * entaxy-cicd-plugin | ||||
|  * ========== | ||||
|  * Copyright (C) 2020 - 2025 EmDev LLC | ||||
|  * ========== | ||||
|  * You may not use this file except in accordance with the License Terms of the Copyright | ||||
|  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property | ||||
|  * rights to the Software and any copies are the property of the Copyright Holder. Unless | ||||
|  * it is explicitly allowed the Copyright Holder, the User is prohibited from using the | ||||
|  * Software for commercial purposes to provide services to third parties. | ||||
|  *  | ||||
|  * The Copyright Holder hereby declares that the Software is provided on an "AS IS". | ||||
|  * Under no circumstances does the Copyright Holder guarantee or promise that the | ||||
|  * Software provided by him will be suitable or not suitable for the specific purposes | ||||
|  * of the User, that the Software will meet all commercial and personal subjective | ||||
|  * expectations of the User, that the Software will work properly, without technical | ||||
|  * errors, quickly and uninterruptedly. | ||||
|  *  | ||||
|  * Under no circumstances shall the Copyright Holder or its Affiliates is not liable | ||||
|  * to the User for any direct or indirect losses of the User, his expenses or actual | ||||
|  * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss | ||||
|  * or damage to data, property, etc. | ||||
|  * ~~~~~~/licensing~~~~~~ | ||||
|  */ | ||||
|  | ||||
| var EntaxyCICD; | ||||
| (function (EntaxyCICD) { | ||||
|     EntaxyCICD._module.component('entaxyCiCdConfigurations', { | ||||
|         bindings: { | ||||
|             changeSelection: '<', | ||||
|             configured: '<' | ||||
|         }, | ||||
|         template: | ||||
|         ` | ||||
|           <pf-toolbar class="entaxy-toolbar" config="$ctrl.toolbarConfig"></pf-toolbar> | ||||
|           <div class="entaxy-cicd-objects-table-container"> | ||||
|             <pf-table-view config="$ctrl.tableConfig" | ||||
|                           columns="$ctrl.tableColumns" | ||||
|                           items="$ctrl.viewedItems"> | ||||
|             </pf-table-view> | ||||
|           </div> | ||||
|         `, | ||||
|         controller: EntaxyCICDConfigurationsController | ||||
|     }) | ||||
|     .name; | ||||
|  | ||||
|     function EntaxyCICDConfigurationsController(workspace, $q, entaxyCICDService, $templateCache, $route) { | ||||
|         'ngInject'; | ||||
|  | ||||
|         let ctrl = this; | ||||
|  | ||||
|         ctrl.tableConfig = { | ||||
|             selectionMatchProp: 'id' | ||||
|         }; | ||||
|  | ||||
|         function changeSelected(item) { | ||||
|             if (ctrl.selected[item.id]) { | ||||
|                 delete ctrl.selected[item.id]; | ||||
|             } else { | ||||
|                 ctrl.selected[item.id] = item; | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         ctrl.toolbarConfig = { | ||||
|             filterConfig: { | ||||
|                 fields: [ | ||||
|                     { | ||||
|                         id: 'id', | ||||
|                         title: 'Id', | ||||
|                         placeholder: 'Filter by Id...', | ||||
|                         filterType: 'text' | ||||
|                     } | ||||
|                 ], | ||||
|                 inlineResults: true, | ||||
|                 appliedFilters: [], | ||||
|                 onFilterChange: filterChange | ||||
|             }, | ||||
|             isTableView: true | ||||
|         }; | ||||
|  | ||||
|         ctrl.tableColumns = [ | ||||
|             { | ||||
|                 header: 'Id', | ||||
|                 itemField: 'id', | ||||
|                 htmlTemplate: 'configurations/id.html', | ||||
|                 colActionFn: (configurationId) => ctrl.changeSelection(configurationId) | ||||
|             }, | ||||
|             { header: 'Location', itemField: 'location' } | ||||
|         ]; | ||||
|  | ||||
|         $templateCache.put( | ||||
|             'configurations/id.html', | ||||
|             '<a href="" ng-click="$ctrl.handleColAction(key, value)">{{value}}</a>' | ||||
|         ); | ||||
|  | ||||
|         function filterChange(filters) { | ||||
|             ctrl.viewedItems = Entaxy.applyFilters(ctrl.items, filters, matchesFilter); | ||||
|             ctrl.toolbarConfig.filterConfig.resultsCount = ctrl.viewedItems.length; | ||||
|         }; | ||||
|  | ||||
|         function matchesFilter(item, filter) { | ||||
|             let match = true; | ||||
|             if (filter.id === 'id') { | ||||
|                 match = item.id.toLowerCase().match(filter.value.toLowerCase()) !== null; | ||||
|             } | ||||
|             return match; | ||||
|         }; | ||||
|  | ||||
|         ctrl.items = []; | ||||
|         ctrl.viewedItems = []; | ||||
|  | ||||
|         ctrl.$onInit = function() { | ||||
|             ctrl.tableConfig.showCheckboxes = ctrl.configured; | ||||
|  | ||||
|             if (ctrl.configured) { | ||||
|                 ctrl.selected = {}; | ||||
|                 ctrl.tableConfig.onCheckBoxChange = (item) => changeSelected(item); | ||||
|  | ||||
|                 let primaryActions = [ | ||||
|                     {name: 'Set Local Values', actionFn: useLocalValues} | ||||
|                 ]; | ||||
|  | ||||
|                 ctrl.toolbarConfig.actionsConfig = { | ||||
|                     primaryActions: primaryActions | ||||
|                 }; | ||||
|             } | ||||
|  | ||||
|             ctrl.storage = EntaxyCICD.getStorage(workspace.selection); | ||||
|             ctrl.application = EntaxyCICD.getProjectOrApplication(workspace.selection); | ||||
|             ctrl.version = EntaxyCICD.getVersion(workspace.selection); | ||||
|             ctrl.revision = workspace.selection.title.split(' ')[0]; | ||||
|  | ||||
|             populateTable(); | ||||
|         } | ||||
|  | ||||
|         function populateTable() { | ||||
|             entaxyCICDService.executeOperation('listRevisionConfigurations', | ||||
|                 [ctrl.storage, ctrl.application, ctrl.version, ctrl.revision]) | ||||
|             .then(result => { | ||||
|                 let items = JSON.parse(result); | ||||
|                 ctrl.items = items; | ||||
|                 filterChange(ctrl.toolbarConfig.filterConfig.appliedFilters); | ||||
|             }); | ||||
|         } | ||||
|  | ||||
|         function useLocalValues() { | ||||
|             let selectedIds = Object.keys(ctrl.selected); | ||||
|             if (selectedIds.length > 0) { | ||||
|                 let promises = []; | ||||
|                 let failedIds = []; | ||||
|                 selectedIds.forEach(id => { | ||||
|                     promises.push( | ||||
|                         entaxyCICDService.executeOperation('fillInRevisionConfigurationWithLocalValues', | ||||
|                             [ctrl.storage, ctrl.application, ctrl.version, ctrl.revision, id]) | ||||
|                         .catch(error => { | ||||
|                             failedIds.push(id); | ||||
|                             EntaxyCICD.log.error(error); | ||||
|                         }) | ||||
|                     ); | ||||
|                 }); | ||||
|                 $q.all(promises).then(result => { | ||||
|                     if (failedIds.length > 0) { | ||||
|                         let result = selectedIds.map(id => { | ||||
|                             return { | ||||
|                                 id: id, | ||||
|                                 failed: failedIds.includes(id) | ||||
|                             }; | ||||
|                         }); | ||||
|                         let tableHtml = Entaxy.createStatusResultTable(result, 'Configuration Id'); | ||||
|                         let mainMessage = 'Some configurations were skipped ' + | ||||
|                             'while setting local values due to errors that have occurred'; | ||||
|                         Entaxy.notificationWithDetails(Entaxy.NOTIFICATION_TYPE.WARNING, mainMessage, tableHtml, | ||||
|                             Entaxy.configuration[Entaxy.CONFIGURATION_KEYS.NOTIFICATION_TIMEOUT_TABLE]); | ||||
|                     } else { | ||||
|                         Entaxy.notificationSuccess('Values of selected configurations were successfully ' + | ||||
|                             'set to values of local configurations'); | ||||
|                     } | ||||
|                     $route.reload(); | ||||
|                 }).catch(error => { | ||||
|                     Entaxy.notificationError(error); | ||||
|                     EntaxyCICD.log.error(error); | ||||
|                 }); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|     EntaxyCICDConfigurationsController.$inject = ['workspace', '$q', 'entaxyCICDService', '$templateCache', '$route']; | ||||
|  | ||||
| })(EntaxyCICD || (EntaxyCICD = {})); | ||||
| @@ -0,0 +1,151 @@ | ||||
| /*- | ||||
|  * ~~~~~~licensing~~~~~~ | ||||
|  * entaxy-cicd-plugin | ||||
|  * ========== | ||||
|  * Copyright (C) 2020 - 2025 EmDev LLC | ||||
|  * ========== | ||||
|  * You may not use this file except in accordance with the License Terms of the Copyright | ||||
|  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property | ||||
|  * rights to the Software and any copies are the property of the Copyright Holder. Unless | ||||
|  * it is explicitly allowed the Copyright Holder, the User is prohibited from using the | ||||
|  * Software for commercial purposes to provide services to third parties. | ||||
|  *  | ||||
|  * The Copyright Holder hereby declares that the Software is provided on an "AS IS". | ||||
|  * Under no circumstances does the Copyright Holder guarantee or promise that the | ||||
|  * Software provided by him will be suitable or not suitable for the specific purposes | ||||
|  * of the User, that the Software will meet all commercial and personal subjective | ||||
|  * expectations of the User, that the Software will work properly, without technical | ||||
|  * errors, quickly and uninterruptedly. | ||||
|  *  | ||||
|  * Under no circumstances shall the Copyright Holder or its Affiliates is not liable | ||||
|  * to the User for any direct or indirect losses of the User, his expenses or actual | ||||
|  * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss | ||||
|  * or damage to data, property, etc. | ||||
|  * ~~~~~~/licensing~~~~~~ | ||||
|  */ | ||||
|  | ||||
| var EntaxyCICD; | ||||
| (function (EntaxyCICD) { | ||||
|     EntaxyCICD._module.component('entaxyCiCdApplicationItems', { | ||||
|         bindings: { | ||||
|             version: '<' | ||||
|         }, | ||||
|         template: | ||||
|         ` | ||||
|           <pf-toolbar class="entaxy-toolbar" config="$ctrl.toolbarConfig"></pf-toolbar> | ||||
|           <pf-table-view class="entaxy-cicd-table" | ||||
|                           config="$ctrl.tableConfig" | ||||
|                           columns="$ctrl.tableColumns" | ||||
|                           page-config="$ctrl.pageConfig" | ||||
|                           items="$ctrl.viewedItems"> | ||||
|           </pf-table-view> | ||||
|         `, | ||||
|         controller: EntaxyCICDApplicationItemsController | ||||
|     }) | ||||
|     .name; | ||||
|  | ||||
|     function EntaxyCICDApplicationItemsController(workspace, $scope, entaxyCICDService) { | ||||
|         'ngInject'; | ||||
|  | ||||
|         let ctrl = this; | ||||
|  | ||||
|         ctrl.tableConfig = { | ||||
|             selectionMatchProp: 'id', | ||||
|             showCheckboxes: false | ||||
|         }; | ||||
|  | ||||
|         ctrl.toolbarConfig = { | ||||
|             filterConfig: { | ||||
|                 fields: [ | ||||
|                     { | ||||
|                         id: 'id', | ||||
|                         title: 'Id', | ||||
|                         placeholder: 'Filter by Id...', | ||||
|                         filterType: 'text' | ||||
|                     }, | ||||
|                     { | ||||
|                         id: 'type', | ||||
|                         title: 'Type', | ||||
|                         placeholder: 'Filter by Type...', | ||||
|                         filterType: 'select', | ||||
|                         filterValues: [] | ||||
|                     }, | ||||
|                     { | ||||
|                         id: 'revisionable', | ||||
|                         title: 'Revisionable', | ||||
|                         placeholder: 'Filter by Revisionable...', | ||||
|                         filterType: 'select', | ||||
|                         filterValues: ['yes', 'no'] | ||||
|                     }, | ||||
|                     { | ||||
|                         id: 'editable', | ||||
|                         title: 'Editable', | ||||
|                         placeholder: 'Filter by Editable...', | ||||
|                         filterType: 'select', | ||||
|                         filterValues: ['yes', 'no'] | ||||
|                     } | ||||
|                 ], | ||||
|                 inlineResults: true, | ||||
|                 appliedFilters: [], | ||||
|                 onFilterChange: filterChange | ||||
|             }, | ||||
|             isTableView: true | ||||
|         }; | ||||
|  | ||||
|         ctrl.tableColumns = [ | ||||
|             { header: 'Id', itemField: 'id' }, | ||||
|             { header: 'Type', itemField: 'type' }, | ||||
|             { header: 'Revisionable', itemField: 'revisionable', | ||||
|                 templateFn: (value) => EntaxyCICD.getStatusTemplate(value) }, | ||||
|             { header: 'Editable', itemField: 'editable', | ||||
|                 templateFn: (value) => EntaxyCICD.getStatusTemplate(value) } | ||||
|         ]; | ||||
|  | ||||
|         ctrl.pageConfig = Entaxy.getStandardPageConfig(); | ||||
|  | ||||
|         function filterChange(filters) { | ||||
|             ctrl.viewedItems = Entaxy.applyFilters(ctrl.items, filters, matchesFilter); | ||||
|             ctrl.toolbarConfig.filterConfig.resultsCount = ctrl.viewedItems.length; | ||||
|         }; | ||||
|  | ||||
|         function matchesFilter(item, filter) { | ||||
|             let match = true; | ||||
|             if (filter.id === 'id') { | ||||
|                 match = item.id.toLowerCase().match(filter.value.toLowerCase()) !== null; | ||||
|             } else if (filter.id === 'type') { | ||||
|                 match = item.type === filter.value; | ||||
|             } else if (filter.id === 'revisionable') { | ||||
|                 match = filter.value === 'yes' ? item.revisionable === true : item.revisionable === false; | ||||
|             } else if (filter.id === 'editable') { | ||||
|                 match = filter.value === 'yes' ? item.editable === true : item.editable === false; | ||||
|             } | ||||
|             return match; | ||||
|         }; | ||||
|  | ||||
|         ctrl.items = []; | ||||
|         ctrl.viewedItems = []; | ||||
|  | ||||
|         ctrl.$onInit = function() { | ||||
|             entaxyCICDService.setTypesToFilterConfig(ctrl.toolbarConfig.filterConfig.fields); | ||||
|         } | ||||
|  | ||||
|         $scope.$watch('$ctrl.version', function () { | ||||
|             populateTable(); | ||||
|         }); | ||||
|  | ||||
|         function populateTable() { | ||||
|  | ||||
|             const storage = EntaxyCICD.getStorage(workspace.selection); | ||||
|             const application = EntaxyCICD.getProjectOrApplication(workspace.selection); | ||||
|  | ||||
|             entaxyCICDService.executeOperation('listApplicationItems', [storage, application, ctrl.version]) | ||||
|             .then(result => { | ||||
|                 let items = JSON.parse(result); | ||||
|                 ctrl.items = items; | ||||
|                 filterChange(ctrl.toolbarConfig.filterConfig.appliedFilters); | ||||
|             }); | ||||
|         } | ||||
|     } | ||||
|     EntaxyCICDApplicationItemsController.$inject = ['workspace', '$scope', 'entaxyCICDService']; | ||||
|  | ||||
| })(EntaxyCICD || (EntaxyCICD = {})); | ||||
| @@ -0,0 +1,95 @@ | ||||
| /*- | ||||
|  * ~~~~~~licensing~~~~~~ | ||||
|  * entaxy-cicd-plugin | ||||
|  * ========== | ||||
|  * Copyright (C) 2020 - 2025 EmDev LLC | ||||
|  * ========== | ||||
|  * You may not use this file except in accordance with the License Terms of the Copyright | ||||
|  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property | ||||
|  * rights to the Software and any copies are the property of the Copyright Holder. Unless | ||||
|  * it is explicitly allowed the Copyright Holder, the User is prohibited from using the | ||||
|  * Software for commercial purposes to provide services to third parties. | ||||
|  *  | ||||
|  * The Copyright Holder hereby declares that the Software is provided on an "AS IS". | ||||
|  * Under no circumstances does the Copyright Holder guarantee or promise that the | ||||
|  * Software provided by him will be suitable or not suitable for the specific purposes | ||||
|  * of the User, that the Software will meet all commercial and personal subjective | ||||
|  * expectations of the User, that the Software will work properly, without technical | ||||
|  * errors, quickly and uninterruptedly. | ||||
|  *  | ||||
|  * Under no circumstances shall the Copyright Holder or its Affiliates is not liable | ||||
|  * to the User for any direct or indirect losses of the User, his expenses or actual | ||||
|  * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss | ||||
|  * or damage to data, property, etc. | ||||
|  * ~~~~~~/licensing~~~~~~ | ||||
|  */ | ||||
|  | ||||
| var EntaxyCICD; | ||||
| (function (EntaxyCICD) { | ||||
|     EntaxyCICD._module.component('entaxyCiCdRevision', { | ||||
|         template: | ||||
|         ` | ||||
|           <div class="entaxy-cicd-zero-revision-note" ng-if="$ctrl.revision === '0'"> | ||||
|             <entaxy-form-field-extra-info type="'info'" message="$ctrl.zeroRevisionNote"></entaxy-form-field-extra-info> | ||||
|           </div> | ||||
|           <div class="entaxy-cicd-header-container"> | ||||
|             <div class="entaxy-cicd-title-with-info-container"> | ||||
|               <span class="first">Application: {{$ctrl.application}}</span> | ||||
|               <span>Version: {{$ctrl.version}}</span> | ||||
|               <span class="lead">Revision: {{$ctrl.revision}}</span> | ||||
|               <span>Revision Status: {{$ctrl.revisionStatus}}</span> | ||||
|             </div> | ||||
|             <div class="entaxy-cicd-header-buttons-container"> | ||||
|               <entaxy-ci-cd-application-management-buttons storage="$ctrl.storage" application="$ctrl.application" | ||||
|                         version="$ctrl.version" revision="$ctrl.revision" revision-status="$ctrl.revisionStatus" | ||||
|                         is-configuration-dirty="$ctrl.isConfigurationDirty"> | ||||
|               </entaxy-ci-cd-application-management-buttons> | ||||
|             </div> | ||||
|           </div> | ||||
|            | ||||
|           <div class="entaxy-cicd-content-container"> | ||||
|             <h2 class="first"> | ||||
|               Configurations | ||||
|             </h2> | ||||
|              | ||||
|             <entaxy-ci-cd-configurations change-selection="$ctrl.changeSelection" | ||||
|                     configured="$ctrl.isConfigured"></entaxy-ci-cd-configurations> | ||||
|              | ||||
|             <div class="entaxy-cicd-configuration-container" ng-if="$ctrl.configuration"> | ||||
|              | ||||
|               <entaxy-ci-cd-configuration configuration-id="$ctrl.configuration" | ||||
|                     configured="$ctrl.isConfigured" is-dirty="$ctrl.isConfigurationDirty"></entaxy-ci-cd-configuration> | ||||
|             </div> | ||||
|           </div> | ||||
|         `, | ||||
|         controller: EntaxyCICDRevisionController | ||||
|     }) | ||||
|         .name; | ||||
|  | ||||
|     function EntaxyCICDRevisionController(workspace) { | ||||
|         'ngInject'; | ||||
|  | ||||
|         let ctrl = this; | ||||
|         ctrl.zeroRevisionNote = 'Revision 0 cannot be configured'; | ||||
|  | ||||
|         ctrl.$onInit = function() { | ||||
|  | ||||
|             ctrl.storage = EntaxyCICD.getStorage(workspace.selection); | ||||
|             ctrl.application = EntaxyCICD.getProjectOrApplication(workspace.selection); | ||||
|             ctrl.version = EntaxyCICD.getVersion(workspace.selection); | ||||
|  | ||||
|             let revisionInfo = EntaxyCICD.getRevisionInfo(workspace.selection); | ||||
|             ctrl.revision = revisionInfo.revision; | ||||
|             ctrl.revisionStatus = revisionInfo.revisionStatus; | ||||
|             ctrl.isConfigured = ctrl.revisionStatus === EntaxyCICD.REVISION_STATUS.CONFIGURED; | ||||
|         } | ||||
|  | ||||
|         ctrl.changeSelection = function (configurationId) { | ||||
|             if (!ctrl.isConfigurationDirty || confirm(Entaxy.CONFIRMATION.UNSAVED_CHANGES)) { | ||||
|                 ctrl.configuration = configurationId; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|     EntaxyCICDRevisionController.$inject = ['workspace']; | ||||
|  | ||||
| })(EntaxyCICD || (EntaxyCICD = {})); | ||||
| @@ -0,0 +1,181 @@ | ||||
| /*- | ||||
|  * ~~~~~~licensing~~~~~~ | ||||
|  * entaxy-cicd-plugin | ||||
|  * ========== | ||||
|  * Copyright (C) 2020 - 2025 EmDev LLC | ||||
|  * ========== | ||||
|  * You may not use this file except in accordance with the License Terms of the Copyright | ||||
|  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property | ||||
|  * rights to the Software and any copies are the property of the Copyright Holder. Unless | ||||
|  * it is explicitly allowed the Copyright Holder, the User is prohibited from using the | ||||
|  * Software for commercial purposes to provide services to third parties. | ||||
|  *  | ||||
|  * The Copyright Holder hereby declares that the Software is provided on an "AS IS". | ||||
|  * Under no circumstances does the Copyright Holder guarantee or promise that the | ||||
|  * Software provided by him will be suitable or not suitable for the specific purposes | ||||
|  * of the User, that the Software will meet all commercial and personal subjective | ||||
|  * expectations of the User, that the Software will work properly, without technical | ||||
|  * errors, quickly and uninterruptedly. | ||||
|  *  | ||||
|  * Under no circumstances shall the Copyright Holder or its Affiliates is not liable | ||||
|  * to the User for any direct or indirect losses of the User, his expenses or actual | ||||
|  * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss | ||||
|  * or damage to data, property, etc. | ||||
|  * ~~~~~~/licensing~~~~~~ | ||||
|  */ | ||||
|  | ||||
| var EntaxyCICD; | ||||
| (function (EntaxyCICD) { | ||||
|     EntaxyCICD._module.component('entaxyCiCdVersionsRevisionsInfo', { | ||||
|         template: | ||||
|         ` | ||||
|           <div class="entaxy-cicd-content-with-title-container"> | ||||
|             <h2>Versions & Revisions</h2> | ||||
|            | ||||
|             <pf-toolbar class="entaxy-toolbar" config="$ctrl.toolbarConfig"></pf-toolbar> | ||||
|             <pf-table-view config="$ctrl.tableConfig" | ||||
|                           columns="$ctrl.tableColumns" | ||||
|                           action-buttons="$ctrl.tableActionButtons" | ||||
|                           page-config="$ctrl.pageConfig" | ||||
|                           items="$ctrl.viewedItems"> | ||||
|             </pf-table-view> | ||||
|           </div> | ||||
|         `, | ||||
|         controller: EntaxyCICDVersionsRevisionsInfoController | ||||
|     }) | ||||
|     .name; | ||||
|  | ||||
|     function EntaxyCICDVersionsRevisionsInfoController(workspace, entaxyCICDService, $q, $templateCache, $location) { | ||||
|         'ngInject'; | ||||
|  | ||||
|         let ctrl = this; | ||||
|  | ||||
|         ctrl.tableConfig = { | ||||
|             selectionMatchProp: 'version', | ||||
|             showCheckboxes: false | ||||
|         }; | ||||
|  | ||||
|         ctrl.toolbarConfig = { | ||||
|             filterConfig: { | ||||
|                 fields: [ | ||||
|                     { | ||||
|                         id: 'version', | ||||
|                         title: 'Version', | ||||
|                         placeholder: 'Filter by Version...', | ||||
|                         filterType: 'text' | ||||
|                     }, | ||||
|                     { | ||||
|                         id: 'installedRevision', | ||||
|                         title: 'Installed Revision Presence', | ||||
|                         placeholder: 'Filter by Installed Revision Presence...', | ||||
|                         filterType: 'select', | ||||
|                         filterValues: ['present', 'not present'] | ||||
|                     } | ||||
|                 ], | ||||
|                 inlineResults: true, | ||||
|                 appliedFilters: [], | ||||
|                 onFilterChange: filterChange | ||||
|             }, | ||||
|             isTableView: true | ||||
|         }; | ||||
|  | ||||
|         ctrl.tableColumns = [ | ||||
|             { | ||||
|                 header: 'Version', | ||||
|                 itemField: 'version', | ||||
|                 htmlTemplate: 'application/version.html', | ||||
|                 colActionFn: (version) => ctrl.changeLocation(version) | ||||
|             }, | ||||
|             { header: 'Last Revision', itemField: 'lastRevision' }, | ||||
|             { header: 'Installed Revision', itemField: 'installedRevision' } | ||||
|         ]; | ||||
|  | ||||
|         $templateCache.put( | ||||
|             'application/version.html', | ||||
|             '<a href="" ng-click="$ctrl.handleColAction(key, value)">{{value}}</a>' | ||||
|         ); | ||||
|  | ||||
|         ctrl.changeLocation = function (version) { | ||||
|             let nid = $location.search().nid; | ||||
|             $location.search('nid', nid + '-' + version); | ||||
|         } | ||||
|  | ||||
|         ctrl.pageConfig = Entaxy.getStandardPageConfig(); | ||||
|  | ||||
|         function filterChange(filters) { | ||||
|             ctrl.viewedItems = Entaxy.applyFilters(ctrl.items, filters, matchesFilter); | ||||
|             ctrl.toolbarConfig.filterConfig.resultsCount = ctrl.viewedItems.length; | ||||
|         }; | ||||
|  | ||||
|         function matchesFilter(item, filter) { | ||||
|             let match = true; | ||||
|             if (filter.id === 'version') { | ||||
|                 match = item.version.match(filter.value) !== null; | ||||
|             } else if (filter.id === 'installedRevision') { | ||||
|                 match = filter.value === 'present' ? item.installedRevision !== '-' : item.installedRevision === '-'; | ||||
|             } | ||||
|             return match; | ||||
|         }; | ||||
|  | ||||
|         ctrl.items = []; | ||||
|         ctrl.viewedItems = []; | ||||
|  | ||||
|         ctrl.$onInit = function() { | ||||
|  | ||||
|             ctrl.storage = EntaxyCICD.getStorage(workspace.selection); | ||||
|  | ||||
|             ctrl.tableActionButtons = [ | ||||
|                 { name: 'Remove Version', title: 'Remove Version', actionFn: removeVersion } | ||||
|             ]; | ||||
|  | ||||
|             populateTable(); | ||||
|         } | ||||
|  | ||||
|         function populateTable() { | ||||
|  | ||||
|             const applicationFolder = workspace.selection; | ||||
|  | ||||
|             let items = []; | ||||
|             let promises = []; | ||||
|             if (applicationFolder.children && applicationFolder.children.length > 0) { | ||||
|                 applicationFolder.children.forEach(versionFolder => { | ||||
|                     promises.push( | ||||
|                         entaxyCICDService.executeOperation('readApplicationVersionLastAndInstalledRevision', | ||||
|                             [ctrl.storage, applicationFolder.title, versionFolder.title]) | ||||
|                         .then(result => { | ||||
|                             let revisionsInfo = JSON.parse(result); | ||||
|                             items.push({ | ||||
|                                 version: versionFolder.title, | ||||
|                                 lastRevision: revisionsInfo.lastRevision, | ||||
|                                 installedRevision: revisionsInfo.installedRevision | ||||
|                             }); | ||||
|                         }) | ||||
|                     ); | ||||
|                 }); | ||||
|             } | ||||
|             $q.all(promises).then(() => { | ||||
|                 ctrl.items = items; | ||||
|                 filterChange(ctrl.toolbarConfig.filterConfig.appliedFilters); | ||||
|             }); | ||||
|         } | ||||
|  | ||||
|         function removeVersion(action, item) { | ||||
|             let application = workspace.selection.title; | ||||
|  | ||||
|             if (ctrl.items.length > 1) { | ||||
|                 let properties = [ctrl.storage, application, item.version]; | ||||
|                 entaxyCICDService.removeItemWithConfirmation(EntaxyCICD.ITEM_TYPE.VERSION, item.version, properties); | ||||
|             } else { | ||||
|                 let properties = [ctrl.storage, application]; | ||||
|                 let message = 'Removing the last version of the application will lead to removing the application. ' + | ||||
|                     'Do you want to proceed?'; | ||||
|                 entaxyCICDService.removeItemWithConfirmation(EntaxyCICD.ITEM_TYPE.APPLICATION, null, properties, | ||||
|                     false, message); | ||||
|             } | ||||
|  | ||||
|         } | ||||
|     } | ||||
|     EntaxyCICDVersionsRevisionsInfoController.$inject = ['workspace', 'entaxyCICDService', '$q', '$templateCache', | ||||
|         '$location']; | ||||
|  | ||||
| })(EntaxyCICD || (EntaxyCICD = {})); | ||||
| @@ -0,0 +1,280 @@ | ||||
| /*- | ||||
|  * ~~~~~~licensing~~~~~~ | ||||
|  * entaxy-cicd-plugin | ||||
|  * ========== | ||||
|  * Copyright (C) 2020 - 2025 EmDev LLC | ||||
|  * ========== | ||||
|  * You may not use this file except in accordance with the License Terms of the Copyright | ||||
|  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property | ||||
|  * rights to the Software and any copies are the property of the Copyright Holder. Unless | ||||
|  * it is explicitly allowed the Copyright Holder, the User is prohibited from using the | ||||
|  * Software for commercial purposes to provide services to third parties. | ||||
|  *  | ||||
|  * The Copyright Holder hereby declares that the Software is provided on an "AS IS". | ||||
|  * Under no circumstances does the Copyright Holder guarantee or promise that the | ||||
|  * Software provided by him will be suitable or not suitable for the specific purposes | ||||
|  * of the User, that the Software will meet all commercial and personal subjective | ||||
|  * expectations of the User, that the Software will work properly, without technical | ||||
|  * errors, quickly and uninterruptedly. | ||||
|  *  | ||||
|  * Under no circumstances shall the Copyright Holder or its Affiliates is not liable | ||||
|  * to the User for any direct or indirect losses of the User, his expenses or actual | ||||
|  * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss | ||||
|  * or damage to data, property, etc. | ||||
|  * ~~~~~~/licensing~~~~~~ | ||||
|  */ | ||||
|  | ||||
| var EntaxyCICD; | ||||
| (function (EntaxyCICD) { | ||||
|     EntaxyCICD._module.component('entaxyCiCdApplicationsTable', { | ||||
|         bindings: { | ||||
|             type: '@', | ||||
|             importFromFile: '<', | ||||
|             importFromRepository: '<', | ||||
|             createProject: '<' | ||||
|         }, | ||||
|         template: | ||||
|         ` | ||||
|           <pf-toolbar class="entaxy-toolbar" config="$ctrl.toolbarConfig"> | ||||
|             <actions> | ||||
|               <span class="dropdown primary-action" uib-dropdown> | ||||
|                 <button class="btn btn-default dropdown-toggle" uib-dropdown-toggle type="button"> | ||||
|                   Import | ||||
|                   <span class="caret"></span> | ||||
|                 </button> | ||||
|                 <ul class="dropdown-menu"> | ||||
|                   <li role="menuitem" ng-click="$ctrl.importFromFile()"> | ||||
|                     <a class="secondary-action">Import From File</a> | ||||
|                   </li> | ||||
|                   <li role="menuitem" ng-click="$ctrl.importFromRepository()"> | ||||
|                     <a class="secondary-action">Import From Repository</a> | ||||
|                   </li> | ||||
|                 </ul> | ||||
|               </span> | ||||
|             </actions> | ||||
|           </pf-toolbar> | ||||
|           <pf-table-view config="$ctrl.tableConfig" | ||||
|                         columns="$ctrl.tableColumns" | ||||
|                         action-buttons="$ctrl.tableActionButtons" | ||||
|                         page-config="$ctrl.pageConfig" | ||||
|                         items="$ctrl.viewedItems"> | ||||
|           </pf-table-view> | ||||
|         `, | ||||
|         controller: EntaxyCICDApplicationsTableController | ||||
|     }) | ||||
|         .name; | ||||
|  | ||||
|     function EntaxyCICDApplicationsTableController(workspace, $uibModal, entaxyCICDService, $templateCache, $location) { | ||||
|         'ngInject'; | ||||
|  | ||||
|         let ctrl = this; | ||||
|  | ||||
|         const isStorageSelected = EntaxyCICD.isStorage(workspace.selection); | ||||
|  | ||||
|         ctrl.tableConfig = { | ||||
|             selectionMatchProp: 'name', | ||||
|             showCheckboxes: false | ||||
|         }; | ||||
|  | ||||
|         ctrl.toolbarConfig = { | ||||
|             filterConfig: { | ||||
|                 fields: [ | ||||
|                     { | ||||
|                         id: 'name', | ||||
|                         title: 'Name', | ||||
|                         placeholder: 'Filter by Name...', | ||||
|                         filterType: 'text' | ||||
|                     } | ||||
|                 ], | ||||
|                 appliedFilters: [], | ||||
|                 onFilterChange: filterChange | ||||
|             }, | ||||
|             isTableView: true | ||||
|         }; | ||||
|  | ||||
|         ctrl.tableColumns = [ | ||||
|             { | ||||
|                 header: 'Name', | ||||
|                 itemField: 'name', | ||||
|                 htmlTemplate: 'applications/table/name.html', | ||||
|                 colActionFn: (name) => ctrl.changeLocation(name) | ||||
|             } | ||||
|         ]; | ||||
|  | ||||
|         $templateCache.put( | ||||
|             'applications/table/name.html', | ||||
|             '<a href="" ng-click="$ctrl.handleColAction(key, value)">{{value}}</a>' | ||||
|         ); | ||||
|  | ||||
|         ctrl.changeLocation = function (name) { | ||||
|             let nid = $location.search().nid; | ||||
|             if (isStorageSelected) { | ||||
|                 $location.search('nid', nid + '-' + name); | ||||
|             } else { | ||||
|                 let item = ctrl.viewedItems.find(viewedItem => viewedItem.name === name); | ||||
|                 $location.search('nid', [nid, item.storage, name].join('-')); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         if (!isStorageSelected) { | ||||
|             ctrl.tableColumns.push({ header: 'Storage', itemField: 'storage' }); | ||||
|  | ||||
|             ctrl.toolbarConfig.filterConfig.fields.push({ | ||||
|                 id: 'storage', | ||||
|                 title: 'Storage', | ||||
|                 placeholder: 'Filter by Storage...', | ||||
|                 filterType: 'select', | ||||
|                 filterValues: EntaxyCICD.getStorages(workspace.selection) | ||||
|             }); | ||||
|         } | ||||
|  | ||||
|         ctrl.pageConfig = Entaxy.getStandardPageConfig(); | ||||
|  | ||||
|         function filterChange(filters) { | ||||
|             ctrl.viewedItems = Entaxy.applyFilters(ctrl.items, filters, matchesFilter); | ||||
|             ctrl.toolbarConfig.filterConfig.resultsCount = ctrl.viewedItems.length; | ||||
|         }; | ||||
|  | ||||
|         function matchesFilter(item, filter) { | ||||
|             let match = true; | ||||
|             if (filter.id === 'name') { | ||||
|                 match = item.name.toLowerCase().match(filter.value.toLowerCase()) !== null; | ||||
|             } else if (filter.id === 'storage') { | ||||
|                 match = item.storage === filter.value; | ||||
|             } | ||||
|             return match; | ||||
|         }; | ||||
|  | ||||
|         ctrl.items = []; | ||||
|         ctrl.viewedItems = []; | ||||
|  | ||||
|         ctrl.$onInit = function() { | ||||
|  | ||||
|             populateTable(); | ||||
|  | ||||
|             if (ctrl.type === EntaxyCICD.ITEM_TYPE.APPLICATION) { | ||||
|                 ctrl.toolbarConfig.actionsConfig = { | ||||
|                     actionsInclude: true | ||||
|                 }; | ||||
|  | ||||
|                 ctrl.tableColumns.push({ | ||||
|                     header: 'Versions & Revisions', | ||||
|                     itemField: 'versionsRevisionsInfo', | ||||
|                     templateFn: (value) => getVersionsRevisionsColumnTemplate(value) | ||||
|                 }); | ||||
|  | ||||
|             } else if (ctrl.type === EntaxyCICD.ITEM_TYPE.PROJECT) { | ||||
|                 let primaryActions = [{name: 'Create ' + ctrl.type, actionFn: () => ctrl.createProject(ctrl.items)}]; | ||||
|  | ||||
|                 ctrl.toolbarConfig.actionsConfig = { | ||||
|                     primaryActions: primaryActions | ||||
|                 }; | ||||
|             } | ||||
|  | ||||
|             ctrl.tableActionButtons = [ | ||||
|                 { name: 'Remove', title: 'Remove ' + ctrl.type, actionFn: removeItem } | ||||
|             ]; | ||||
|         } | ||||
|  | ||||
|         function getVersionsRevisionsColumnTemplate(value) { | ||||
|             const DIV = { | ||||
|                 OPEN: '<div>', | ||||
|                 CLOSE: '</div>' | ||||
|             }; | ||||
|             const CLASS_INSTALLED = 'class="entaxy-cicd-installed"'; | ||||
|             function insert(string, index, substring) { | ||||
|                 return string.slice(0, index) + substring + string.slice(index); | ||||
|             } | ||||
|             const spanOpen = '<span data-toggle="tooltip" title="">'; | ||||
|             const SPAN = { | ||||
|                 OPEN: { | ||||
|                     VERSION: insert(spanOpen, -2, 'Version'), | ||||
|                     LAST_REVISION: insert(spanOpen, -2, 'Last Revision'), | ||||
|                     INSTALLED_REVISION: insert(spanOpen, -2, 'Installed Revision') | ||||
|                 }, | ||||
|                 CLOSE: '</span>' | ||||
|             }; | ||||
|             let result = DIV.OPEN; | ||||
|             value = value.sort(Entaxy.compareBy('version')); | ||||
|             value.forEach(item => { | ||||
|                 const versionOpeningSpan = item.installedRevision !== '-' ? | ||||
|                     insert(SPAN.OPEN.VERSION, 5, ' ' + CLASS_INSTALLED) : | ||||
|                     SPAN.OPEN.VERSION; | ||||
|                 const revisionOpeningSpan = item.installedRevision !== '-' ? | ||||
|                     insert(SPAN.OPEN.INSTALLED_REVISION, 5, ' ' + CLASS_INSTALLED) : | ||||
|                     SPAN.OPEN.INSTALLED_REVISION; | ||||
|  | ||||
|                 result = result + | ||||
|                     DIV.OPEN + | ||||
|                     versionOpeningSpan + item.version + SPAN.CLOSE + | ||||
|                     SPAN.OPEN.LAST_REVISION + item.lastRevision + SPAN.CLOSE + | ||||
|                     revisionOpeningSpan + item.installedRevision + SPAN.CLOSE + | ||||
|                     DIV.CLOSE; | ||||
|             }); | ||||
|             return result + DIV.CLOSE; | ||||
|         } | ||||
|  | ||||
|         function populateTable() { | ||||
|  | ||||
|             let items = []; | ||||
|  | ||||
|             if (isStorageSelected) { | ||||
|                 items = getItemsFromChildren(workspace.selection); | ||||
|             } else { | ||||
|                 let storages = workspace.selection.children; | ||||
|                 if (storages && storages.length > 0) { | ||||
|                     storages.forEach(storage => { | ||||
|                         items = getItemsFromChildren(storage); | ||||
|                     }); | ||||
|                 } | ||||
|             } | ||||
|  | ||||
|             if (ctrl.type === EntaxyCICD.ITEM_TYPE.APPLICATION) { | ||||
|                 items.forEach(item => { | ||||
|                     if (item.versions) { | ||||
|                         item.versionsRevisionsInfo = []; | ||||
|                         item.versions.forEach(version => { | ||||
|                             entaxyCICDService.executeOperation('readApplicationVersionLastAndInstalledRevision', | ||||
|                                 [item.storage, item.name, version]) | ||||
|                             .then(result => { | ||||
|                                 let revisionsInfo = JSON.parse(result); | ||||
|                                 item.versionsRevisionsInfo.push({ | ||||
|                                     version: version, | ||||
|                                     lastRevision: revisionsInfo.lastRevision, | ||||
|                                     installedRevision: revisionsInfo.installedRevision | ||||
|                                 }); | ||||
|                             }); | ||||
|                         }); | ||||
|                     } | ||||
|                 }); | ||||
|             } | ||||
|  | ||||
|             ctrl.items = items; | ||||
|             filterChange(ctrl.toolbarConfig.filterConfig.appliedFilters); | ||||
|         } | ||||
|  | ||||
|         function getItemsFromChildren(selection) { | ||||
|             let items = []; | ||||
|             if (selection.children && selection.children.length > 0) { | ||||
|                 selection.children.forEach(item => { | ||||
|                     items.push({ | ||||
|                         name: item.title, | ||||
|                         storage: selection.title, | ||||
|                         versions: ctrl.type === EntaxyCICD.ITEM_TYPE.APPLICATION | ||||
|                                     && item.children && item.children.length > 0 ? | ||||
|                             item.children.map(child => child.title) : undefined | ||||
|                     }); | ||||
|                 }); | ||||
|             } | ||||
|             return items; | ||||
|         } | ||||
|  | ||||
|         function removeItem(action, item) { | ||||
|             let properties = [item.storage, item.name]; | ||||
|             entaxyCICDService.removeItemWithConfirmation(ctrl.type, item.name, properties, true); | ||||
|         } | ||||
|     } | ||||
|     EntaxyCICDApplicationsTableController.$inject = ['workspace', '$uibModal', 'entaxyCICDService', | ||||
|         '$templateCache', '$location']; | ||||
|  | ||||
| })(EntaxyCICD || (EntaxyCICD = {})); | ||||
| @@ -0,0 +1,51 @@ | ||||
| /*- | ||||
|  * ~~~~~~licensing~~~~~~ | ||||
|  * entaxy-cicd-plugin | ||||
|  * ========== | ||||
|  * Copyright (C) 2020 - 2025 EmDev LLC | ||||
|  * ========== | ||||
|  * You may not use this file except in accordance with the License Terms of the Copyright | ||||
|  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property | ||||
|  * rights to the Software and any copies are the property of the Copyright Holder. Unless | ||||
|  * it is explicitly allowed the Copyright Holder, the User is prohibited from using the | ||||
|  * Software for commercial purposes to provide services to third parties. | ||||
|  *  | ||||
|  * The Copyright Holder hereby declares that the Software is provided on an "AS IS". | ||||
|  * Under no circumstances does the Copyright Holder guarantee or promise that the | ||||
|  * Software provided by him will be suitable or not suitable for the specific purposes | ||||
|  * of the User, that the Software will meet all commercial and personal subjective | ||||
|  * expectations of the User, that the Software will work properly, without technical | ||||
|  * errors, quickly and uninterruptedly. | ||||
|  *  | ||||
|  * Under no circumstances shall the Copyright Holder or its Affiliates is not liable | ||||
|  * to the User for any direct or indirect losses of the User, his expenses or actual | ||||
|  * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss | ||||
|  * or damage to data, property, etc. | ||||
|  * ~~~~~~/licensing~~~~~~ | ||||
|  */ | ||||
|  | ||||
| var EntaxyCICD; | ||||
| (function (EntaxyCICD) { | ||||
|     EntaxyCICD._module.component('entaxyCiCdContents', { | ||||
|         template: | ||||
|         ` | ||||
|           <div class="contents" ng-view ng-if="$ctrl.isReady" style="padding: 0 !important;"></div> | ||||
|         `, | ||||
|         controller: EntaxyCICDContentsController | ||||
|     }) | ||||
|         .name; | ||||
|  | ||||
|     function EntaxyCICDContentsController($scope, $route) { | ||||
|         'ngInject'; | ||||
|  | ||||
|         let ctrl = this; | ||||
|         ctrl.isReady = false; | ||||
|  | ||||
|         $scope.$on('jmxTreeClicked', function () { | ||||
|             ctrl.isReady = true; | ||||
|             $route.reload(); | ||||
|         }); | ||||
|     } | ||||
|     EntaxyCICDContentsController.$inject = ['$scope', '$route']; | ||||
|  | ||||
| })(EntaxyCICD || (EntaxyCICD = {})); | ||||
| @@ -0,0 +1,237 @@ | ||||
| /*- | ||||
|  * ~~~~~~licensing~~~~~~ | ||||
|  * entaxy-cicd-plugin | ||||
|  * ========== | ||||
|  * Copyright (C) 2020 - 2025 EmDev LLC | ||||
|  * ========== | ||||
|  * You may not use this file except in accordance with the License Terms of the Copyright | ||||
|  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property | ||||
|  * rights to the Software and any copies are the property of the Copyright Holder. Unless | ||||
|  * it is explicitly allowed the Copyright Holder, the User is prohibited from using the | ||||
|  * Software for commercial purposes to provide services to third parties. | ||||
|  *  | ||||
|  * The Copyright Holder hereby declares that the Software is provided on an "AS IS". | ||||
|  * Under no circumstances does the Copyright Holder guarantee or promise that the | ||||
|  * Software provided by him will be suitable or not suitable for the specific purposes | ||||
|  * of the User, that the Software will meet all commercial and personal subjective | ||||
|  * expectations of the User, that the Software will work properly, without technical | ||||
|  * errors, quickly and uninterruptedly. | ||||
|  *  | ||||
|  * Under no circumstances shall the Copyright Holder or its Affiliates is not liable | ||||
|  * to the User for any direct or indirect losses of the User, his expenses or actual | ||||
|  * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss | ||||
|  * or damage to data, property, etc. | ||||
|  * ~~~~~~/licensing~~~~~~ | ||||
|  */ | ||||
|  | ||||
| var EntaxyCICD; | ||||
| (function (EntaxyCICD) { | ||||
|     EntaxyCICD.log.debug("loading navigation"); | ||||
|  | ||||
|     EntaxyCICD._module | ||||
|         .config(configureRoutes) | ||||
|         .component('entaxyCiCdNavigation', { | ||||
|             template: `<hawtio-tabs tabs="$ctrl.tabs" on-change="$ctrl.goto(tab)"></hawtio-tabs>`, | ||||
|             controller: EntaxyCICDNavigationController | ||||
|         }) | ||||
|         .name; | ||||
|     EntaxyCICD.log.debug("loaded navigation " + EntaxyCICD.navigationModule); | ||||
|  | ||||
|     function EntaxyCICDNavigationController($scope, $location, workspace, localStorage, jolokia, $rootScope) { | ||||
|         'ngInject'; | ||||
|         let ctrl = this; | ||||
|         this.$location = $location; | ||||
|         let selected = workspace.selection; | ||||
|         entaxyCICDJmxDomain = localStorage['entaxyCICDJmxDomain'] || "ru.entaxy.cicd"; | ||||
|  | ||||
|         $scope.$on('jmxTreeClicked', function (event, selectedNode) { | ||||
|             ctrl.tabs = getTabs(); | ||||
|             let tab; | ||||
|             if (!selected) { | ||||
|                 selected = selectedNode; | ||||
|                 tab = _.find(ctrl.tabs, { path: ctrl.$location.path() }); | ||||
|                 if (!tab) { | ||||
|                     tab = ctrl.tabs[0]; | ||||
|                 } | ||||
|             } else { | ||||
|                 if (JSON.stringify(selected.folderNames) !== JSON.stringify(selectedNode.folderNames)) { | ||||
|                     selected = selectedNode; | ||||
|                     tab = ctrl.tabs[0]; | ||||
|                 } else { | ||||
|                     tab = _.find(ctrl.tabs, {path: ctrl.$location.path()}); | ||||
|                     if (!tab) { | ||||
|                         tab = ctrl.tabs[0]; | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|             ctrl.$location.path(tab.path); | ||||
|         }); | ||||
|  | ||||
|         EntaxyCICDNavigationController.prototype.$onInit = function () { | ||||
|             if (!workspace.selection) { | ||||
|                 this.tabs = []; | ||||
|             } else { | ||||
|                 this.tabs = getTabs(); | ||||
|             } | ||||
|         }; | ||||
|  | ||||
|         EntaxyCICDNavigationController.prototype.goto = function (tab) { | ||||
|             this.$location.path(tab.path); | ||||
|         }; | ||||
|  | ||||
|         function getTabs() { | ||||
|  | ||||
|             var tabs = []; | ||||
|             var enabledRoutes = Object.keys(TAB_CONFIG) | ||||
|                 .map(function (config) { return TAB_CONFIG[config].route; }) | ||||
|                 .filter(function (route) { return _.startsWith(route, '/entaxy-cicd'); }); | ||||
|             if (enabledRoutes.length > 0) { | ||||
|                 if (workspace.getSelectedMBeanName()) { | ||||
|                     if (workspace.hasDomainAndProperties(entaxyCICDJmxDomain, { module: 'projects' })) { | ||||
|                         tabs.push(new Nav.HawtioTab(TAB_CONFIG.projects.title, TAB_CONFIG.projects.route)); | ||||
|                     } else if (workspace.hasDomainAndProperties(entaxyCICDJmxDomain, { module: 'applications' })) { | ||||
|                         tabs.push(new Nav.HawtioTab(TAB_CONFIG.applications.title, TAB_CONFIG.applications.route)); | ||||
|                     } | ||||
|                 } else if (shouldShowProjectsTab()) { | ||||
|                     tabs.push(new Nav.HawtioTab(TAB_CONFIG.projects.title, TAB_CONFIG.projects.route)); | ||||
|                 } else if (shouldShowVersionsTab()) { | ||||
|                     tabs.push(new Nav.HawtioTab(TAB_CONFIG.projectVersions.title, TAB_CONFIG.projectVersions.route)); | ||||
|                     tabs.push(new Nav.HawtioTab(TAB_CONFIG.project.title, TAB_CONFIG.project.route)); | ||||
|                 } else if (shouldShowProjectTab()) { | ||||
|                     tabs.push(new Nav.HawtioTab(TAB_CONFIG.project.title, TAB_CONFIG.project.route)); | ||||
|                 } else if (shouldShowBuildInfoTabs()) { | ||||
|                     tabs.push(new Nav.HawtioTab(TAB_CONFIG.buildInfoItems.title, TAB_CONFIG.buildInfoItems.route)); | ||||
|                     tabs.push(new Nav.HawtioTab(TAB_CONFIG.buildInfoRequirements.title, TAB_CONFIG.buildInfoRequirements.route)); | ||||
|                     tabs.push(new Nav.HawtioTab(TAB_CONFIG.buildInfoComponents.title, TAB_CONFIG.buildInfoComponents.route)); | ||||
|                 } else if (shouldShowApplicationsTab()) { | ||||
|                     tabs.push(new Nav.HawtioTab(TAB_CONFIG.applications.title, TAB_CONFIG.applications.route)); | ||||
|                 } else if (shouldShowVersionsRevisionsTab()) { | ||||
|                     tabs.push(new Nav.HawtioTab(TAB_CONFIG.versionsRevisionsInfo.title, TAB_CONFIG.versionsRevisionsInfo.route)); | ||||
|                     tabs.push(new Nav.HawtioTab(TAB_CONFIG.application.title, TAB_CONFIG.application.route)); | ||||
|                 } else if (shouldShowApplicationTab()) { | ||||
|                     tabs.push(new Nav.HawtioTab(TAB_CONFIG.application.title, TAB_CONFIG.application.route)); | ||||
|                 } else if (shouldShowRevisionTab()) { | ||||
|                     tabs.push(new Nav.HawtioTab(TAB_CONFIG.revision.title, TAB_CONFIG.revision.route)); | ||||
|                     tabs.push(new Nav.HawtioTab(TAB_CONFIG.application.title, TAB_CONFIG.application.route)); | ||||
|                 } | ||||
|             } | ||||
|             return tabs; | ||||
|         } | ||||
|  | ||||
|         function shouldShowProjectsTab() { | ||||
|             let selectionFolderNames = workspace.selection.folderNames; | ||||
|             return selectionFolderNames[1] === 'projects' && | ||||
|                 (selectionFolderNames.length === 2 || selectionFolderNames.length === 3); | ||||
|         } | ||||
|  | ||||
|         function shouldShowVersionsTab() { | ||||
|             let selectionFolderNames = workspace.selection.folderNames; | ||||
|             return selectionFolderNames[1] === 'projects' && selectionFolderNames.length === 4; | ||||
|         } | ||||
|  | ||||
|         function shouldShowProjectTab() { | ||||
|             let selectionFolderNames = workspace.selection.folderNames; | ||||
|             return selectionFolderNames[1] === 'projects' && | ||||
|                 (selectionFolderNames.length === 4 || selectionFolderNames.length === 5); | ||||
|         } | ||||
|  | ||||
|         function shouldShowBuildInfoTabs() { | ||||
|             let selectionFolderNames = workspace.selection.folderNames; | ||||
|             return selectionFolderNames[1] === 'projects' && selectionFolderNames.length === 6; | ||||
|         } | ||||
|  | ||||
|         function shouldShowApplicationsTab() { | ||||
|             let selectionFolderNames = workspace.selection.folderNames; | ||||
|             return selectionFolderNames[1] === 'applications' && | ||||
|                 (selectionFolderNames.length === 2 || selectionFolderNames.length === 3); | ||||
|         } | ||||
|  | ||||
|         function shouldShowApplicationTab() { | ||||
|             let selectionFolderNames = workspace.selection.folderNames; | ||||
|             return selectionFolderNames[1] === 'applications' && selectionFolderNames.length === 5; | ||||
|         } | ||||
|  | ||||
|         function shouldShowVersionsRevisionsTab() { | ||||
|             let selectionFolderNames = workspace.selection.folderNames; | ||||
|             return selectionFolderNames[1] === 'applications' && selectionFolderNames.length === 4; | ||||
|         } | ||||
|  | ||||
|         function shouldShowRevisionTab() { | ||||
|             let selectionFolderNames = workspace.selection.folderNames; | ||||
|             return selectionFolderNames[1] === 'applications' && selectionFolderNames.length === 6; | ||||
|         } | ||||
|  | ||||
| //        global event for entaxy extras | ||||
|         $rootScope.$emit('entaxyCiCdNavigationInited', $scope); | ||||
|     } | ||||
|     EntaxyCICDNavigationController.$inject = ['$scope', '$location', 'workspace', 'localStorage', 'jolokia', '$rootScope'] | ||||
|  | ||||
|     function configureRoutes($routeProvider) { | ||||
|         $routeProvider. | ||||
|         when(TAB_CONFIG.projects.route, | ||||
|             { template: '<entaxy-ci-cd-projects></entaxy-ci-cd-projects>' }). | ||||
|         when(TAB_CONFIG.projectVersions.route, | ||||
|             { template: '<entaxy-ci-cd-project-versions></entaxy-ci-cd-project-versions>' }). | ||||
|         when(TAB_CONFIG.project.route, | ||||
|             { template: '<entaxy-ci-cd-project></entaxy-ci-cd-project>' }). | ||||
|         when(TAB_CONFIG.buildInfoItems.route, | ||||
|             { template: '<entaxy-ci-cd-build-info type="Items"></entaxy-ci-cd-build-info>' }). | ||||
|         when(TAB_CONFIG.buildInfoRequirements.route, | ||||
|             { template: '<entaxy-ci-cd-build-info type="Requirements"></entaxy-ci-cd-build-info>' }). | ||||
|         when(TAB_CONFIG.buildInfoComponents.route, | ||||
|             { template: '<entaxy-ci-cd-build-info type="Components"></entaxy-ci-cd-build-info>' }). | ||||
|         when(TAB_CONFIG.applications.route, | ||||
|             { template: '<entaxy-ci-cd-applications></entaxy-ci-cd-applications>' }). | ||||
|         when(TAB_CONFIG.application.route, | ||||
|             { template: '<entaxy-ci-cd-application></entaxy-ci-cd-application>' }). | ||||
|         when(TAB_CONFIG.versionsRevisionsInfo.route, | ||||
|             { template: '<entaxy-ci-cd-versions-revisions-info></entaxy-ci-cd-versions-revisions-info>' }). | ||||
|         when(TAB_CONFIG.revision.route, | ||||
|             { template: '<entaxy-ci-cd-revision></entaxy-ci-cd-revision>' }); | ||||
|     } | ||||
|     configureRoutes.$inject = ['$routeProvider']; | ||||
|  | ||||
| })(EntaxyCICD || (EntaxyCICD = {})); | ||||
|  | ||||
| let TAB_CONFIG = { | ||||
|     projects: { | ||||
|         title: 'Projects', | ||||
|         route: '/entaxy-cicd/projects' | ||||
|     }, | ||||
|     project: { | ||||
|         title: 'Project', | ||||
|         route: '/entaxy-cicd/project' | ||||
|     }, | ||||
|     projectVersions: { | ||||
|         title: 'Versions', | ||||
|         route: '/entaxy-cicd/project/versions' | ||||
|     }, | ||||
|     buildInfoItems: { | ||||
|         title: 'Items', | ||||
|         route: '/entaxy-cicd/project/build-info/items' | ||||
|     }, | ||||
|     buildInfoRequirements: { | ||||
|         title: 'Requirements', | ||||
|         route: '/entaxy-cicd/project/build-info/requirements' | ||||
|     }, | ||||
|     buildInfoComponents: { | ||||
|         title: 'Components', | ||||
|         route: '/entaxy-cicd/project/build-info/components' | ||||
|     }, | ||||
|     applications: { | ||||
|         title: 'Applications', | ||||
|         route: '/entaxy-cicd/applications' | ||||
|     }, | ||||
|     application: { | ||||
|         title: 'Application', | ||||
|         route: '/entaxy-cicd/application' | ||||
|     }, | ||||
|     versionsRevisionsInfo: { | ||||
|         title: 'Versions & Revisions', | ||||
|         route: '/entaxy-cicd/application/versions-revisions-info' | ||||
|     }, | ||||
|     revision: { | ||||
|         title: 'Revision', | ||||
|         route: '/entaxy-cicd/application/revision' | ||||
|     } | ||||
| }; | ||||
| @@ -0,0 +1,110 @@ | ||||
| /*- | ||||
|  * ~~~~~~licensing~~~~~~ | ||||
|  * entaxy-cicd-plugin | ||||
|  * ========== | ||||
|  * Copyright (C) 2020 - 2025 EmDev LLC | ||||
|  * ========== | ||||
|  * You may not use this file except in accordance with the License Terms of the Copyright | ||||
|  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property | ||||
|  * rights to the Software and any copies are the property of the Copyright Holder. Unless | ||||
|  * it is explicitly allowed the Copyright Holder, the User is prohibited from using the | ||||
|  * Software for commercial purposes to provide services to third parties. | ||||
|  *  | ||||
|  * The Copyright Holder hereby declares that the Software is provided on an "AS IS". | ||||
|  * Under no circumstances does the Copyright Holder guarantee or promise that the | ||||
|  * Software provided by him will be suitable or not suitable for the specific purposes | ||||
|  * of the User, that the Software will meet all commercial and personal subjective | ||||
|  * expectations of the User, that the Software will work properly, without technical | ||||
|  * errors, quickly and uninterruptedly. | ||||
|  *  | ||||
|  * Under no circumstances shall the Copyright Holder or its Affiliates is not liable | ||||
|  * to the User for any direct or indirect losses of the User, his expenses or actual | ||||
|  * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss | ||||
|  * or damage to data, property, etc. | ||||
|  * ~~~~~~/licensing~~~~~~ | ||||
|  */ | ||||
| var EntaxyCICD; | ||||
| (function (EntaxyCICD) { | ||||
|     EntaxyCICD._module.component('entaxyCiCdAddObjectsModal', { | ||||
|         bindings: { | ||||
|             modalInstance: '<', | ||||
|             resolve: '<' | ||||
|         }, | ||||
|         template: | ||||
|         ` | ||||
|           <div class="entaxy-modal-container"> | ||||
|             <div class="modal-header"> | ||||
|               <button type="button" class="close" aria-label="Close" ng-click="$ctrl.cancel()"> | ||||
|                 <span class="pficon pficon-close" aria-hidden="true"></span> | ||||
|               </button> | ||||
|               <h4 class="modal-title">{{$ctrl.modalTitle}}</h4> | ||||
|             </div> | ||||
|              | ||||
|             <div class="modal-body"> | ||||
|               <div ng-if="$ctrl.resolve.objects"> | ||||
|                 <div class="add-objects-message-container"> | ||||
|                   {{$ctrl.message}} | ||||
|                 </div> | ||||
|                 <entaxy-expandable-list items="$ctrl.resolve.objects" use-toolbar="false" show-select-box="true" | ||||
|                       on-check-box-change-fn="$ctrl.changeSelected"> | ||||
|                 </entaxy-expandable-list> | ||||
|               </div> | ||||
|               <entaxy-ci-cd-objects-select change-selected="$ctrl.changeSelected" ng-if="!$ctrl.resolve.objects" | ||||
|                     excluded-object-ids="$ctrl.resolve.excludedObjectIds"></entaxy-ci-cd-objects-select> | ||||
|             </div> | ||||
|             <div class="modal-footer"> | ||||
|               <button type="button" class="btn btn-default" ng-click="$ctrl.cancel()" | ||||
|                     ng-if="$ctrl.includeSkip">Skip</button> | ||||
|               <button type="submit" class="btn btn-primary" ng-click="$ctrl.save()">Add</button> | ||||
|             </div> | ||||
|           </div> | ||||
|         `, | ||||
|         controller: entaxyCICDAddObjectsModalController | ||||
|     }) | ||||
|     .name; | ||||
|  | ||||
|     function entaxyCICDAddObjectsModalController() { | ||||
|  | ||||
|         let ctrl = this; | ||||
|  | ||||
|         ctrl.$onInit = function() { | ||||
|             ctrl.modalTitle = 'Add Objects to the Project: ' + ctrl.resolve.project; | ||||
|  | ||||
|             ctrl.selected = {}; | ||||
|  | ||||
|             if (ctrl.resolve.objects) { | ||||
|                 ctrl.message = 'You may also want to add optional related objects:'; | ||||
|                 ctrl.includeSkip = true; | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         ctrl.changeSelected = function (item) { | ||||
|  | ||||
|             if (ctrl.resolve.objects) { | ||||
|                 if (item.relatedTo && item.relatedTo.length > 1) { | ||||
|                     let relatedToExcludeParent = item.relatedTo.filter(objectId => objectId !== item.parent); | ||||
|                     relatedToExcludeParent.forEach(objectId => { | ||||
|                         let object = ctrl.resolve.objects.find(it => it.name === objectId); | ||||
|                         let relatedObject = object.sublist.find(it => it.name === item.name); | ||||
|                         relatedObject.selected = item.selected; | ||||
|                     }); | ||||
|                 } | ||||
|             } | ||||
|  | ||||
|             if (ctrl.selected[item.fullId]) { | ||||
|                 delete ctrl.selected[item.fullId]; | ||||
|             } else { | ||||
|                 ctrl.selected[item.fullId] = item; | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         ctrl.save = function () { | ||||
|             ctrl.modalInstance.close(ctrl.selected); | ||||
|         } | ||||
|  | ||||
|         ctrl.cancel = function(reason) { | ||||
|             ctrl.modalInstance.dismiss(reason); | ||||
|         } | ||||
|     } | ||||
|  | ||||
| })(EntaxyCICD || (EntaxyCICD = {})); | ||||
| @@ -0,0 +1,171 @@ | ||||
| /*- | ||||
|  * ~~~~~~licensing~~~~~~ | ||||
|  * entaxy-cicd-plugin | ||||
|  * ========== | ||||
|  * Copyright (C) 2020 - 2025 EmDev LLC | ||||
|  * ========== | ||||
|  * You may not use this file except in accordance with the License Terms of the Copyright | ||||
|  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property | ||||
|  * rights to the Software and any copies are the property of the Copyright Holder. Unless | ||||
|  * it is explicitly allowed the Copyright Holder, the User is prohibited from using the | ||||
|  * Software for commercial purposes to provide services to third parties. | ||||
|  *  | ||||
|  * The Copyright Holder hereby declares that the Software is provided on an "AS IS". | ||||
|  * Under no circumstances does the Copyright Holder guarantee or promise that the | ||||
|  * Software provided by him will be suitable or not suitable for the specific purposes | ||||
|  * of the User, that the Software will meet all commercial and personal subjective | ||||
|  * expectations of the User, that the Software will work properly, without technical | ||||
|  * errors, quickly and uninterruptedly. | ||||
|  *  | ||||
|  * Under no circumstances shall the Copyright Holder or its Affiliates is not liable | ||||
|  * to the User for any direct or indirect losses of the User, his expenses or actual | ||||
|  * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss | ||||
|  * or damage to data, property, etc. | ||||
|  * ~~~~~~/licensing~~~~~~ | ||||
|  */ | ||||
| var EntaxyCICD; | ||||
| (function (EntaxyCICD) { | ||||
|     EntaxyCICD._module.component('entaxyCiCdBuildInfo', { | ||||
|         bindings: { | ||||
|             type: '@' | ||||
|         }, | ||||
|         template: | ||||
|         ` | ||||
|           <div class="entaxy-cicd-header-container"> | ||||
|             <div class="entaxy-cicd-title-with-info-container"> | ||||
|               <span class="first lead">Build</span> | ||||
|               <span>Project: {{$ctrl.project}}</span> | ||||
|               <span>Version: {{$ctrl.version}}</span> | ||||
|               <div ng-if="$ctrl.mavenUrl"> | ||||
|                 <span>Maven URL: {{$ctrl.mavenUrl}}</span> | ||||
|                 <entaxy-copy-to-clipboard-button title="Copy maven URL to clipboard" | ||||
|                         text-to-copy="$ctrl.mavenUrl"></entaxy-copy-to-clipboard-button> | ||||
|               </div> | ||||
|             </div> | ||||
|             <div class="entaxy-cicd-header-buttons-container"> | ||||
|               <div class="btn-group" uib-dropdown> | ||||
|                 <button id="single-button" type="button" uib-dropdown-toggle ng-disabled="disabled"> | ||||
|                   Export | ||||
|                   <span class="caret"></span> | ||||
|                 </button> | ||||
|                 <ul class="dropdown-menu dropdown-menu-right" uib-dropdown-menu | ||||
|                         role="menu" aria-labelledby="single-button"> | ||||
|                   <li role="menuitem"><a ng-click="$ctrl.exportToFile()">Export To File</a></li> | ||||
|                   <li role="menuitem"><a ng-click="$ctrl.exportToRepository()">Export To Repository</a></li> | ||||
|                 </ul> | ||||
|               </div> | ||||
|             </div> | ||||
|           </div> | ||||
|            | ||||
|           <div class="entaxy-cicd-content-container"> | ||||
|             <h2 class="first"> | ||||
|               {{ $ctrl.type }} | ||||
|             </h2> | ||||
|              | ||||
|             <entaxy-ci-cd-project-items ng-if="$ctrl.isItems()"></entaxy-ci-cd-project-items> | ||||
|             <entaxy-ci-cd-requirements ng-if="$ctrl.isRequirements()" | ||||
|                     version="$ctrl.version" type="BuiltProject"></entaxy-ci-cd-requirements> | ||||
|             <entaxy-ci-cd-project-components ng-if="$ctrl.isComponents()"></entaxy-ci-cd-project-components> | ||||
|           </div> | ||||
|         `, | ||||
|         controller: entaxyCICDBuildInfoController | ||||
|     }) | ||||
|         .name; | ||||
|  | ||||
|     function entaxyCICDBuildInfoController(workspace, entaxyCICDService, entaxyService, $uibModal) { | ||||
|         'ngInject'; | ||||
|  | ||||
|         let ctrl = this; | ||||
|         const storage = EntaxyCICD.getStorage(workspace.selection); | ||||
|         const TYPE = { | ||||
|             ITEMS: 'Items', | ||||
|             REQUIREMENTS: 'Requirements', | ||||
|             COMPONENTS: 'Components' | ||||
|         } | ||||
|  | ||||
|         ctrl.isItems = function () { | ||||
|             return ctrl.type === TYPE.ITEMS; | ||||
|         } | ||||
|  | ||||
|         ctrl.isRequirements = function () { | ||||
|             return ctrl.type === TYPE.REQUIREMENTS; | ||||
|         } | ||||
|  | ||||
|         ctrl.isComponents = function () { | ||||
|             return ctrl.type === TYPE.COMPONENTS; | ||||
|         } | ||||
|  | ||||
|         ctrl.$onInit = function() { | ||||
|  | ||||
|             ctrl.project = EntaxyCICD.getProjectOrApplication(workspace.selection); | ||||
|             ctrl.version = EntaxyCICD.getVersion(workspace.selection); | ||||
|  | ||||
|             entaxyCICDService.executeOperation('readMavenUrl', [storage, ctrl.project, ctrl.version]) | ||||
|             .then(result => { | ||||
|                 ctrl.mavenUrl = result; | ||||
|             }); | ||||
|         } | ||||
|  | ||||
|         ctrl.exportToFile = function () { | ||||
|             entaxyCICDService.executeOperation('exportToFile', [storage, ctrl.project, ctrl.version]) | ||||
|             .then(result => { | ||||
|                 let fileName = ctrl.project + '-' + ctrl.version + '.jar'; | ||||
|                 entaxyService.downloadFileFromBase64StringContent(result, fileName); | ||||
|             }).catch(error => { | ||||
|                 Entaxy.notificationError(error); | ||||
|                 EntaxyCICD.log.error(error); | ||||
|             }); | ||||
|         } | ||||
|  | ||||
|         ctrl.exportToRepository = function () { | ||||
|             entaxyCICDService.executeOperation('listRepositories', []) | ||||
|             .then(result => { | ||||
|                 let formFields = [ | ||||
|                     { | ||||
|                         label: 'Repository', | ||||
|                         name: 'repository', | ||||
|                         enum: true, | ||||
|                         required: true, | ||||
|                         values: JSON.parse(result), | ||||
|                         setFocused: true | ||||
|                     } | ||||
|                 ]; | ||||
|  | ||||
|                 showExportModal(formFields); | ||||
|             }).catch(error => { | ||||
|                 Entaxy.notificationError(error); | ||||
|             }); | ||||
|         } | ||||
|  | ||||
|         function showExportModal(formFields) { | ||||
|             $uibModal.open({ | ||||
|                 component: 'entaxyCiCdSimpleFieldsModal', | ||||
|                 resolve: { | ||||
|                     modalTitle: () => 'Export Project To Repository', | ||||
|                     formFields: () => formFields | ||||
|                 }, | ||||
|                 backdrop: 'static' | ||||
|             }).result.then((args) => { | ||||
|                 exportToRepository(args[0]); | ||||
|             }, reason => { | ||||
|                 if (reason && reason !== Entaxy.MODAL_CANCEL_REASON.ESCAPE_KEY_PRESS) { | ||||
|                     Entaxy.notificationError(reason); | ||||
|                 } | ||||
|             }); | ||||
|         } | ||||
|  | ||||
|         function exportToRepository(repository) { | ||||
|             entaxyCICDService.executeOperation('exportToRepository', | ||||
|                 [storage, ctrl.project, ctrl.version, repository]) | ||||
|             .then(result => { | ||||
|                 Entaxy.notificationSuccess(result); | ||||
|             }).catch(error => { | ||||
|                 Entaxy.notificationError(error); | ||||
|                 EntaxyCICD.log.error(error); | ||||
|             }); | ||||
|         } | ||||
|  | ||||
|     } | ||||
|     entaxyCICDBuildInfoController.$inject = ['workspace', 'entaxyCICDService', 'entaxyService', '$uibModal']; | ||||
|  | ||||
| })(EntaxyCICD || (EntaxyCICD = {})); | ||||
| @@ -0,0 +1,126 @@ | ||||
| /*- | ||||
|  * ~~~~~~licensing~~~~~~ | ||||
|  * entaxy-cicd-plugin | ||||
|  * ========== | ||||
|  * Copyright (C) 2020 - 2025 EmDev LLC | ||||
|  * ========== | ||||
|  * You may not use this file except in accordance with the License Terms of the Copyright | ||||
|  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property | ||||
|  * rights to the Software and any copies are the property of the Copyright Holder. Unless | ||||
|  * it is explicitly allowed the Copyright Holder, the User is prohibited from using the | ||||
|  * Software for commercial purposes to provide services to third parties. | ||||
|  *  | ||||
|  * The Copyright Holder hereby declares that the Software is provided on an "AS IS". | ||||
|  * Under no circumstances does the Copyright Holder guarantee or promise that the | ||||
|  * Software provided by him will be suitable or not suitable for the specific purposes | ||||
|  * of the User, that the Software will meet all commercial and personal subjective | ||||
|  * expectations of the User, that the Software will work properly, without technical | ||||
|  * errors, quickly and uninterruptedly. | ||||
|  *  | ||||
|  * Under no circumstances shall the Copyright Holder or its Affiliates is not liable | ||||
|  * to the User for any direct or indirect losses of the User, his expenses or actual | ||||
|  * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss | ||||
|  * or damage to data, property, etc. | ||||
|  * ~~~~~~/licensing~~~~~~ | ||||
|  */ | ||||
|  | ||||
| var EntaxyCICD; | ||||
| (function (EntaxyCICD) { | ||||
|     EntaxyCICD._module.component('entaxyCiCdProjectComponents', { | ||||
|         template: | ||||
|         ` | ||||
|           <pf-toolbar class="entaxy-toolbar" config="$ctrl.toolbarConfig"></pf-toolbar> | ||||
|           <pf-table-view config="$ctrl.tableConfig" | ||||
|                           columns="$ctrl.tableColumns" | ||||
|                           page-config="$ctrl.pageConfig" | ||||
|                           items="$ctrl.viewedItems"> | ||||
|           </pf-table-view> | ||||
|         `, | ||||
|         controller: EntaxyCICDProjectComponentsController | ||||
|     }) | ||||
|     .name; | ||||
|  | ||||
|     function EntaxyCICDProjectComponentsController(workspace, entaxyCICDService) { | ||||
|         'ngInject'; | ||||
|  | ||||
|         let ctrl = this; | ||||
|  | ||||
|         ctrl.tableConfig = { | ||||
|             selectionMatchProp: 'id', | ||||
|             showCheckboxes: false | ||||
|         }; | ||||
|  | ||||
|         ctrl.toolbarConfig = { | ||||
|             filterConfig: { | ||||
|                 fields: [ | ||||
|                     { | ||||
|                         id: 'id', | ||||
|                         title: 'Id', | ||||
|                         placeholder: 'Filter by Id...', | ||||
|                         filterType: 'text' | ||||
|                     }, | ||||
|                     { | ||||
|                         id: 'type', | ||||
|                         title: 'Type', | ||||
|                         placeholder: 'Filter by Type...', | ||||
|                         filterType: 'select', | ||||
|                         filterValues: [] | ||||
|                     } | ||||
|                 ], | ||||
|                 inlineResults: true, | ||||
|                 appliedFilters: [], | ||||
|                 onFilterChange: filterChange | ||||
|             }, | ||||
|             isTableView: true | ||||
|         }; | ||||
|  | ||||
|         ctrl.tableColumns = [ | ||||
|             { header: 'Id', itemField: 'id' }, | ||||
|             { header: 'Type', itemField: 'type' }, | ||||
|             { header: 'Priority', itemField: 'priority' } | ||||
|         ]; | ||||
|  | ||||
|         ctrl.pageConfig = Entaxy.getStandardPageConfig(); | ||||
|  | ||||
|         function filterChange(filters) { | ||||
|             ctrl.viewedItems = Entaxy.applyFilters(ctrl.items, filters, matchesFilter); | ||||
|             ctrl.toolbarConfig.filterConfig.resultsCount = ctrl.viewedItems.length; | ||||
|         }; | ||||
|  | ||||
|         function matchesFilter(item, filter) { | ||||
|             let match = true; | ||||
|             if (filter.id === 'id') { | ||||
|                 match = item.id.match(filter.value) !== null; | ||||
|             } else if (filter.id === 'type') { | ||||
|                 match = item.type === filter.value; | ||||
|             } | ||||
|             return match; | ||||
|         }; | ||||
|  | ||||
|         ctrl.items = []; | ||||
|         ctrl.viewedItems = []; | ||||
|  | ||||
|         ctrl.$onInit = function() { | ||||
|  | ||||
|             entaxyCICDService.setTypesToFilterConfig(ctrl.toolbarConfig.filterConfig.fields); | ||||
|  | ||||
|             populateTable(); | ||||
|         } | ||||
|  | ||||
|         function populateTable() { | ||||
|  | ||||
|             const storage = EntaxyCICD.getStorage(workspace.selection); | ||||
|             const project = EntaxyCICD.getProjectOrApplication(workspace.selection); | ||||
|             const version = EntaxyCICD.getVersion(workspace.selection); | ||||
|  | ||||
|             entaxyCICDService.executeOperation('listBuiltProjectComponents', [storage, project, version]) | ||||
|             .then(result => { | ||||
|                 let items = JSON.parse(result); | ||||
|                 ctrl.items = items; | ||||
|                 filterChange(ctrl.toolbarConfig.filterConfig.appliedFilters); | ||||
|             }); | ||||
|         } | ||||
|     } | ||||
|     EntaxyCICDProjectComponentsController.$inject = ['workspace', 'entaxyCICDService']; | ||||
|  | ||||
| })(EntaxyCICD || (EntaxyCICD = {})); | ||||
| @@ -0,0 +1,126 @@ | ||||
| /*- | ||||
|  * ~~~~~~licensing~~~~~~ | ||||
|  * entaxy-cicd-plugin | ||||
|  * ========== | ||||
|  * Copyright (C) 2020 - 2025 EmDev LLC | ||||
|  * ========== | ||||
|  * You may not use this file except in accordance with the License Terms of the Copyright | ||||
|  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property | ||||
|  * rights to the Software and any copies are the property of the Copyright Holder. Unless | ||||
|  * it is explicitly allowed the Copyright Holder, the User is prohibited from using the | ||||
|  * Software for commercial purposes to provide services to third parties. | ||||
|  *  | ||||
|  * The Copyright Holder hereby declares that the Software is provided on an "AS IS". | ||||
|  * Under no circumstances does the Copyright Holder guarantee or promise that the | ||||
|  * Software provided by him will be suitable or not suitable for the specific purposes | ||||
|  * of the User, that the Software will meet all commercial and personal subjective | ||||
|  * expectations of the User, that the Software will work properly, without technical | ||||
|  * errors, quickly and uninterruptedly. | ||||
|  *  | ||||
|  * Under no circumstances shall the Copyright Holder or its Affiliates is not liable | ||||
|  * to the User for any direct or indirect losses of the User, his expenses or actual | ||||
|  * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss | ||||
|  * or damage to data, property, etc. | ||||
|  * ~~~~~~/licensing~~~~~~ | ||||
|  */ | ||||
|  | ||||
| var EntaxyCICD; | ||||
| (function (EntaxyCICD) { | ||||
|     EntaxyCICD._module.component('entaxyCiCdProjectItems', { | ||||
|         template: | ||||
|         ` | ||||
|           <pf-toolbar class="entaxy-toolbar" config="$ctrl.toolbarConfig"></pf-toolbar> | ||||
|           <pf-table-view config="$ctrl.tableConfig" | ||||
|                           columns="$ctrl.tableColumns" | ||||
|                           page-config="$ctrl.pageConfig" | ||||
|                           items="$ctrl.viewedItems"> | ||||
|           </pf-table-view> | ||||
|         `, | ||||
|         controller: EntaxyCICDProjectItemsController | ||||
|     }) | ||||
|     .name; | ||||
|  | ||||
|     function EntaxyCICDProjectItemsController(workspace, entaxyCICDService) { | ||||
|         'ngInject'; | ||||
|  | ||||
|         let ctrl = this; | ||||
|  | ||||
|         ctrl.tableConfig = { | ||||
|             selectionMatchProp: 'id', | ||||
|             showCheckboxes: false | ||||
|         }; | ||||
|  | ||||
|         ctrl.toolbarConfig = { | ||||
|             filterConfig: { | ||||
|                 fields: [ | ||||
|                     { | ||||
|                         id: 'id', | ||||
|                         title: 'Id', | ||||
|                         placeholder: 'Filter by Id...', | ||||
|                         filterType: 'text' | ||||
|                     }, | ||||
|                     { | ||||
|                         id: 'type', | ||||
|                         title: 'Type', | ||||
|                         placeholder: 'Filter by Type...', | ||||
|                         filterType: 'select', | ||||
|                         filterValues: [] | ||||
|                     } | ||||
|                 ], | ||||
|                 inlineResults: true, | ||||
|                 appliedFilters: [], | ||||
|                 onFilterChange: filterChange | ||||
|             }, | ||||
|             isTableView: true | ||||
|         }; | ||||
|  | ||||
|         ctrl.tableColumns = [ | ||||
|             { header: 'Id', itemField: 'id' }, | ||||
|             { header: 'Type', itemField: 'type' }, | ||||
|             { header: 'Component', itemField: 'component' } | ||||
|         ]; | ||||
|  | ||||
|         ctrl.pageConfig = Entaxy.getStandardPageConfig(); | ||||
|  | ||||
|         function filterChange(filters) { | ||||
|             ctrl.viewedItems = Entaxy.applyFilters(ctrl.items, filters, matchesFilter); | ||||
|             ctrl.toolbarConfig.filterConfig.resultsCount = ctrl.viewedItems.length; | ||||
|         }; | ||||
|  | ||||
|         function matchesFilter(item, filter) { | ||||
|             let match = true; | ||||
|             if (filter.id === 'id') { | ||||
|                 match = item.id.match(filter.value) !== null; | ||||
|             } else if (filter.id === 'type') { | ||||
|                 match = item.type === filter.value; | ||||
|             } | ||||
|             return match; | ||||
|         }; | ||||
|  | ||||
|         ctrl.items = []; | ||||
|         ctrl.viewedItems = []; | ||||
|  | ||||
|         ctrl.$onInit = function() { | ||||
|  | ||||
|             entaxyCICDService.setTypesToFilterConfig(ctrl.toolbarConfig.filterConfig.fields); | ||||
|  | ||||
|             populateTable(); | ||||
|         } | ||||
|  | ||||
|         function populateTable() { | ||||
|  | ||||
|             const storage = EntaxyCICD.getStorage(workspace.selection); | ||||
|             const project = EntaxyCICD.getProjectOrApplication(workspace.selection); | ||||
|             const version = EntaxyCICD.getVersion(workspace.selection); | ||||
|  | ||||
|             entaxyCICDService.executeOperation('listBuiltProjectItems', [storage, project, version]) | ||||
|             .then(result => { | ||||
|                 let items = JSON.parse(result); | ||||
|                 ctrl.items = items; | ||||
|                 filterChange(ctrl.toolbarConfig.filterConfig.appliedFilters); | ||||
|             }); | ||||
|         } | ||||
|     } | ||||
|     EntaxyCICDProjectItemsController.$inject = ['workspace', 'entaxyCICDService']; | ||||
|  | ||||
| })(EntaxyCICD || (EntaxyCICD = {})); | ||||
| @@ -0,0 +1,489 @@ | ||||
| /*- | ||||
|  * ~~~~~~licensing~~~~~~ | ||||
|  * entaxy-cicd-plugin | ||||
|  * ========== | ||||
|  * Copyright (C) 2020 - 2025 EmDev LLC | ||||
|  * ========== | ||||
|  * You may not use this file except in accordance with the License Terms of the Copyright | ||||
|  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property | ||||
|  * rights to the Software and any copies are the property of the Copyright Holder. Unless | ||||
|  * it is explicitly allowed the Copyright Holder, the User is prohibited from using the | ||||
|  * Software for commercial purposes to provide services to third parties. | ||||
|  *  | ||||
|  * The Copyright Holder hereby declares that the Software is provided on an "AS IS". | ||||
|  * Under no circumstances does the Copyright Holder guarantee or promise that the | ||||
|  * Software provided by him will be suitable or not suitable for the specific purposes | ||||
|  * of the User, that the Software will meet all commercial and personal subjective | ||||
|  * expectations of the User, that the Software will work properly, without technical | ||||
|  * errors, quickly and uninterruptedly. | ||||
|  *  | ||||
|  * Under no circumstances shall the Copyright Holder or its Affiliates is not liable | ||||
|  * to the User for any direct or indirect losses of the User, his expenses or actual | ||||
|  * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss | ||||
|  * or damage to data, property, etc. | ||||
|  * ~~~~~~/licensing~~~~~~ | ||||
|  */ | ||||
|  | ||||
| var EntaxyCICD; | ||||
| (function (EntaxyCICD) { | ||||
|     EntaxyCICD._module.component('entaxyCiCdObjects', { | ||||
|         bindings: { | ||||
|             storage: '<', | ||||
|             project: '<', | ||||
|             version: '<' | ||||
|         }, | ||||
|         template: | ||||
|         `  | ||||
|           <pf-toolbar class="entaxy-toolbar" config="$ctrl.toolbarConfig"> | ||||
|             <actions> | ||||
|               <button type="button" class="btn btn-default" ng-repeat="action in $ctrl.actions" | ||||
|                     ng-click="action.actionFn()"> | ||||
|                 {{action.name}} | ||||
|               </button> | ||||
|             </actions> | ||||
|           </pf-toolbar> | ||||
|           <div class="entaxy-cicd-objects-table-container"> | ||||
|             <pf-table-view class="entaxy-cicd-table" | ||||
|                           config="$ctrl.tableConfig" | ||||
|                           columns="$ctrl.tableColumns" | ||||
|                           dt-options="$ctrl.dtOptions" | ||||
|                           items="$ctrl.viewedItems"> | ||||
|             </pf-table-view> | ||||
|           </div> | ||||
|         `, | ||||
|         controller: EntaxyCICDObjectsController | ||||
|     }) | ||||
|         .name; | ||||
|  | ||||
|     function EntaxyCICDObjectsController(workspace, $scope, $uibModal, entaxyCICDService, $q, $route) { | ||||
|         'ngInject'; | ||||
|  | ||||
|         let ctrl = this; | ||||
|  | ||||
|         ctrl.tableConfig = { | ||||
|             selectionMatchProp: 'id', | ||||
|             onCheckBoxChange: (item) => changeSelected(item) | ||||
|         }; | ||||
|  | ||||
|         function changeSelected(item) { | ||||
|             if (ctrl.selected[item.id]) { | ||||
|                 delete ctrl.selected[item.id]; | ||||
|             } else { | ||||
|                 ctrl.selected[item.id] = item; | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         ctrl.toolbarConfig = { | ||||
|             filterConfig: { | ||||
|                 fields: [ | ||||
|                     { | ||||
|                         id: 'displayName', | ||||
|                         title: 'Id / Name', | ||||
|                         placeholder: 'Filter by Id or Name...', | ||||
|                         filterType: 'text' | ||||
|                     }, | ||||
|                     { | ||||
|                         id: 'type', | ||||
|                         title: 'Type', | ||||
|                         placeholder: 'Filter by Type...', | ||||
|                         filterType: 'select', | ||||
|                         filterValues: [] | ||||
|                     }, | ||||
|                     { | ||||
|                         id: 'status', | ||||
|                         title: 'Status', | ||||
|                         placeholder: 'Filter by Status...', | ||||
|                         filterType: 'select', | ||||
|                         filterValues: [] | ||||
|                     }, | ||||
|                     { | ||||
|                         id: 'scope', | ||||
|                         title: 'Scope', | ||||
|                         placeholder: 'Filter by Scope...', | ||||
|                         filterType: 'select', | ||||
|                         filterValues: [] | ||||
|                     }, | ||||
|                     { | ||||
|                         id: 'required', | ||||
|                         title: 'Required', | ||||
|                         placeholder: 'Filter by Required...', | ||||
|                         filterType: 'select', | ||||
|                         filterValues: ['yes', 'no'] | ||||
|                     }, | ||||
|                     { | ||||
|                         id: 'ignored', | ||||
|                         title: 'Ignored', | ||||
|                         placeholder: 'Filter by Ignored...', | ||||
|                         filterType: 'select', | ||||
|                         filterValues: ['yes', 'no'] | ||||
|                     } | ||||
|                 ], | ||||
|                 appliedFilters: [], | ||||
|                 onFilterChange: filterChange | ||||
|             }, | ||||
|             isTableView: true | ||||
|         }; | ||||
|  | ||||
|         ctrl.tableColumns = [ | ||||
|             { header: 'Status', itemField: 'status', templateFn: (value) => getObjectStatusTemplate(value) }, | ||||
|             { header: 'Id / Name', itemField: 'displayName' }, | ||||
|             { header: 'Type', itemField: 'type' }, | ||||
|             { header: 'Scope', itemField: 'scope' }, | ||||
|             { header: 'Required', itemField: 'required', | ||||
|                 templateFn: (value) => EntaxyCICD.getStatusTemplate(value) }, | ||||
|             { header: 'Ignored', itemField: 'ignored', | ||||
|                 templateFn: (value) => EntaxyCICD.getStatusTemplate(value) }, | ||||
|             { header: 'Id', itemField: 'id' } | ||||
|         ]; | ||||
|  | ||||
|         function getObjectStatusTemplate(value) { | ||||
|             switch (value) { | ||||
|                 case 'INCLUDED': | ||||
|                     return '<span class="pficon pficon-ok" data-toggle="tooltip" title="Included"></span>'; | ||||
|                 case 'IGNORED': | ||||
|                     return '<span class="pficon pficon-arrow" data-toggle="tooltip" title="Ignored"></span>'; | ||||
|                 case 'REQUIRED': | ||||
|                     return '<span class="pficon pficon-warning-triangle-o" data-toggle="tooltip" title="Required"></span>'; | ||||
|                 case 'GHOST': | ||||
|                     return '<span class="pficon pficon-unknowm" data-toggle="tooltip" title="Ghost"></span>'; | ||||
|                 case 'DELETED': | ||||
|                     return '<span class="pficon pficon-error-circle-o" data-toggle="tooltip" title="Deleted"></span>'; | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         ctrl.dtOptions = { | ||||
|             order: [[1, "desc"]], | ||||
|             columnDefs: [ | ||||
|                 { "targets": [0], "sortable": false }, | ||||
|                 { "targets": [7], "class": "hide" } | ||||
|             ] | ||||
|         }; | ||||
|  | ||||
|         function filterChange(filters) { | ||||
|             ctrl.viewedItems = Entaxy.applyFilters(ctrl.items, filters, matchesFilter); | ||||
|             ctrl.toolbarConfig.filterConfig.resultsCount = ctrl.viewedItems.length; | ||||
|         }; | ||||
|  | ||||
|         function matchesFilter(item, filter) { | ||||
|             let match = true; | ||||
|             if (filter.id === 'status') { | ||||
|                 match = item.status === filter.value; | ||||
|             } else if (filter.id === 'displayName') { | ||||
|                 match = item.displayName.toLowerCase().match(filter.value.toLowerCase()) !== null; | ||||
|             } else if (filter.id === 'type') { | ||||
|                 match = item.type === filter.value; | ||||
|             } else if (filter.id === 'scope') { | ||||
|                 match = item.scope === filter.value; | ||||
|             } else if (filter.id === 'required') { | ||||
|                 match = filter.value === 'yes' ? item.required === true : item.required === false; | ||||
|             } else if (filter.id === 'ignored') { | ||||
|                 match = filter.value === 'yes' ? item.ignored === true : item.ignored === false; | ||||
|             } | ||||
|             return match; | ||||
|         }; | ||||
|  | ||||
|         ctrl.items = []; | ||||
|         ctrl.viewedItems = []; | ||||
|  | ||||
|         ctrl.$onInit = function() { | ||||
|  | ||||
|             ctrl.selected = {}; | ||||
|  | ||||
|             let primaryActions = [ | ||||
|                 { name: 'Add Objects', actionFn: () => ctrl.showAddObjectsModal() }, | ||||
|                 { name: 'Add Resources', actionFn: () => ctrl.showAddResourcesModal() } | ||||
|             ]; | ||||
|  | ||||
|             ctrl.toolbarConfig.actionsConfig = { | ||||
|                 primaryActions: primaryActions, | ||||
|                 actionsInclude: true | ||||
|             }; | ||||
|  | ||||
|             ctrl.actions = [ | ||||
|                 { name: 'Include Selected', actionFn: ctrl.includeSelected }, | ||||
|                 { name: 'Ignore Selected', actionFn: ctrl.ignoreSelected }, | ||||
|                 { name: 'Remove Selected', actionFn: ctrl.removeSelected }, | ||||
|                 { name: 'Add Related', actionFn: ctrl.addRelatedObjects } | ||||
|             ]; | ||||
|  | ||||
|             entaxyCICDService.setTypesToFilterConfig(ctrl.toolbarConfig.filterConfig.fields); | ||||
|  | ||||
|             entaxyCICDService.setScopesToFilterConfig(ctrl.toolbarConfig.filterConfig.fields); | ||||
|  | ||||
|             let filterConfigFieldStatus = ctrl.toolbarConfig.filterConfig.fields.find(field => field.id === 'status'); | ||||
|             entaxyCICDService.executeOperation('readProjectItemStatuses', []) | ||||
|             .then(result => { | ||||
|                 filterConfigFieldStatus.filterValues = JSON.parse(result); | ||||
|             }); | ||||
|         } | ||||
|  | ||||
|         $scope.$watch('$ctrl.version', function () { | ||||
|             populateTable(); | ||||
|         }); | ||||
|  | ||||
|         function populateTable() { | ||||
|             ctrl.selected = {}; | ||||
|             entaxyCICDService.executeOperation('listProjectItems', [ctrl.storage, ctrl.project, ctrl.version]) | ||||
|             .then(result => { | ||||
|                 let items = JSON.parse(result); | ||||
|                 ctrl.items = items.map(item => { | ||||
|                     if (!item.displayName || item.displayName.trim().length == 0) { | ||||
|                         item.displayName = item.id; | ||||
|                     } | ||||
|                     return item; | ||||
|                 }); | ||||
|                 filterChange(ctrl.toolbarConfig.filterConfig.appliedFilters); | ||||
|             }); | ||||
|         } | ||||
|  | ||||
|         ctrl.showAddObjectsModal = function (objects) { | ||||
|             $uibModal.open({ | ||||
|                 component: 'entaxyCiCdAddObjectsModal', | ||||
|                 resolve: { | ||||
|                     project: () => ctrl.project, | ||||
|                     objects: () => objects, | ||||
|                     excludedObjectIds: () => ctrl.items.length > 0 ? ctrl.items.map(item => item.id) : [] | ||||
|                 }, | ||||
|                 size: 'xl', | ||||
|                 backdrop: 'static' | ||||
|             }) | ||||
|             .result.then(objectsMap => { | ||||
|                 addObjects(objectsMap); | ||||
|             }, | ||||
|             reason => { | ||||
|                 if (reason && reason !== Entaxy.MODAL_CANCEL_REASON.ESCAPE_KEY_PRESS) { | ||||
|                     Entaxy.notificationError(reason); | ||||
|                 } | ||||
|             }); | ||||
|         } | ||||
|  | ||||
|         function addObjects(objectsMap) { | ||||
|             let objectsIds = Object.keys(objectsMap); | ||||
|             if (objectsIds.length > 0) { | ||||
|                 let promises = []; | ||||
|                 objectsIds.forEach(objectId => { | ||||
|                     promises.push( | ||||
|                         entaxyCICDService.executeOperation('addObject', | ||||
|                             [ctrl.storage, ctrl.project, ctrl.version, objectId]) | ||||
|                     ); | ||||
|                 }); | ||||
|                 $q.all(promises).then(result => { | ||||
|                     addRelatedObjects(objectsMap, objectsIds, result); | ||||
|  | ||||
|                     Entaxy.notificationSuccess('Operation Succeeded'); | ||||
|                     populateTable(); | ||||
|                 }).catch(error => { | ||||
|                     Entaxy.notificationError(error); | ||||
|                 }); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         function addRelatedObjects(objectsMap, objectsIds, result, showNotification) { | ||||
|             let objectsTree = []; | ||||
|             let relations = {}; | ||||
|             let addedItems = ctrl.items.length > 0 ? ctrl.items.map(item => item.id) : []; | ||||
|             for (let i = 0; i < objectsIds.length; i++) { | ||||
|                 let relatedObjects = JSON.parse(result[i]); | ||||
|                 if (relatedObjects.length > 0) { | ||||
|                     let objectsToAdd = relatedObjects.filter(object => | ||||
|                         !objectsIds.includes(object.fullId) && !addedItems.includes(object.fullId)); | ||||
|  | ||||
|                     if (objectsToAdd.length > 0) { | ||||
|                         let sublist = objectsToAdd.map(object => { | ||||
|                             addRelation(relations, object.fullId, objectsIds[i]); | ||||
|  | ||||
|                             return { | ||||
|                                 name: object.fullId, | ||||
|                                 fullId: object.fullId, | ||||
|                                 displayName: object.displayName, | ||||
|                                 additionalInfo: object.type, | ||||
|                                 parent: objectsIds[i], | ||||
|                                 disableRowExpansion: true | ||||
|                             }; | ||||
|                         }); | ||||
|                         objectsTree.push({ | ||||
|                             name: objectsIds[i], | ||||
|                             displayName: objectsMap[objectsIds[i]].displayName, | ||||
|                             additionalInfo: objectsMap[objectsIds[i]].type, | ||||
|                             isExpanded: true, | ||||
|                             sublist: sublist.sort(Entaxy.compareBy('displayName')) | ||||
|                         }); | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|             if (objectsTree.length > 0) { | ||||
|                 setRelated(relations, objectsTree); | ||||
|                 ctrl.showAddObjectsModal(objectsTree); | ||||
|             } else { | ||||
|                 if (showNotification) { | ||||
|                     Entaxy.notificationInfo('There are no related objects that are not included'); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         function addRelation(relations, relatedObjectId, objectId) { | ||||
|             if (relations[relatedObjectId]) { | ||||
|                 relations[relatedObjectId].push(objectId); | ||||
|             } else { | ||||
|                 relations[relatedObjectId] = [objectId]; | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         function setRelated(relations, objectsTree) { | ||||
|             Object.keys(relations).forEach(key => { | ||||
|                 if (relations[key].length > 1) { | ||||
|                     relations[key].forEach(objectId => { | ||||
|                         let object = objectsTree.find(object => object.name === objectId); | ||||
|                         let relatedObject = object.sublist.find(object => object.name === key); | ||||
|                         relatedObject.relatedTo = relations[key]; | ||||
|                     }) | ||||
|                 } | ||||
|             }); | ||||
|         } | ||||
|  | ||||
|         ctrl.addRelatedObjects = function () { | ||||
|             let objectsIds = Object.keys(ctrl.selected); | ||||
|             if (objectsIds.length == 0) { | ||||
|                 Entaxy.notificationInfo('At least one item should be selected'); | ||||
|                 return; | ||||
|             } | ||||
|  | ||||
|             let objectsMap = {}; | ||||
|             let promises = []; | ||||
|             objectsIds.forEach(objectId => { | ||||
|                 if (ctrl.selected[objectId].type === 'OBJECT') { | ||||
|                     objectsMap[objectId] = { | ||||
|                         displayName: ctrl.selected[objectId].displayName, | ||||
|                         type: ctrl.selected[objectId].runtimeType | ||||
|                     }; | ||||
|                     promises.push( | ||||
|                         entaxyCICDService.executeOperation('getRelatedObjects', [objectId]) | ||||
|                     ); | ||||
|                 } | ||||
|             }); | ||||
|             if (promises.length > 0) { | ||||
|                 $q.all(promises).then(result => { | ||||
|                     addRelatedObjects(objectsMap, Object.keys(objectsMap), result, true); | ||||
|                 }).catch(error => { | ||||
|                     Entaxy.notificationError(error); | ||||
|                 }); | ||||
|             } else { | ||||
|                 Entaxy.notificationInfo('Selected items should have OBJECT type'); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         ctrl.showAddResourcesModal = function () { | ||||
|             $uibModal.open({ | ||||
|                 component: 'entaxyResourceViewerModal', | ||||
|                 resolve: { | ||||
|                     config: { | ||||
|                         resourceProvider: 'schemas', | ||||
|                         folderSelectionEnabled: true, | ||||
|                         multipleSelectionEnabled: true, | ||||
|                         providersSelectionEnabled: true | ||||
|                     } | ||||
|                 }, | ||||
|                 size: 'xl', | ||||
|                 backdrop: 'static' | ||||
|             }) | ||||
|             .result.then(locations => { | ||||
|                 addResources(locations); | ||||
|             }, | ||||
|             reason => { | ||||
|                 if (reason && reason !== Entaxy.MODAL_CANCEL_REASON.ESCAPE_KEY_PRESS) { | ||||
|                     Entaxy.notificationError(reason); | ||||
|                 } | ||||
|             }); | ||||
|         } | ||||
|  | ||||
|         function addResources(locations) { | ||||
|             let promises = []; | ||||
|             let failedResources = []; | ||||
|             locations.forEach(location => { | ||||
|                 promises.push( | ||||
|                     entaxyCICDService.executeOperation('addResource', | ||||
|                         [ctrl.storage, ctrl.project, ctrl.version, location]) | ||||
|                     .catch(error => { | ||||
|                         failedResources.push(location); | ||||
|                         EntaxyCICD.log.error(error); | ||||
|                     }) | ||||
|                 ); | ||||
|             }); | ||||
|             $q.all(promises).then(result => { | ||||
|                 if (failedResources.length > 0) { | ||||
|                     let result = locations.map(location => { | ||||
|                         return { | ||||
|                             id: location, | ||||
|                             failed: failedResources.includes(location) | ||||
|                         }; | ||||
|                     }); | ||||
|                     let tableHtml = Entaxy.createStatusResultTable(result, 'Location'); | ||||
|                     let mainMessage = 'Errors occurred while adding resources'; | ||||
|                     Entaxy.notificationWithDetails(Entaxy.NOTIFICATION_TYPE.WARNING, mainMessage, tableHtml, | ||||
|                         Entaxy.configuration[Entaxy.CONFIGURATION_KEYS.NOTIFICATION_TIMEOUT_TABLE]); | ||||
|                 } else { | ||||
|                     Entaxy.notificationSuccess('Operation Succeeded'); | ||||
|                 } | ||||
|                 $route.reload(); | ||||
|             }).catch(error => { | ||||
|                 Entaxy.notificationError(error); | ||||
|                 EntaxyCICD.log.error(error); | ||||
|             }); | ||||
|         } | ||||
|  | ||||
|         ctrl.includeSelected = function () { | ||||
|             processOperationSelected('addItem', 'Selected items were successfully included into the project'); | ||||
|         } | ||||
|  | ||||
|         ctrl.ignoreSelected = function () { | ||||
|             processOperationSelected('ignoreItem', 'Selected items were successfully ignored from the project'); | ||||
|         } | ||||
|  | ||||
|         ctrl.removeSelected = function () { | ||||
|             const operationName = 'removeItems'; | ||||
|             const successMessage = 'Selected items were successfully removed from the project'; | ||||
|             let selectedIds = Object.keys(ctrl.selected); | ||||
|             if (selectedIds.length > 0) { | ||||
|                 entaxyCICDService | ||||
|                     .executeOperation(operationName, [ctrl.storage, ctrl.project, ctrl.version, selectedIds]) | ||||
|                 .then(result => { | ||||
|                     let unremovedItems = JSON.parse(result); | ||||
|                     if (unremovedItems && Object.keys(unremovedItems).length > 0) { | ||||
|                         let message = 'There are items that cannot be removed ' + | ||||
|                             'since they are required by some of remaining items'; | ||||
|                         let table = EntaxyCICD.createTableFromUnremovedItems(unremovedItems); | ||||
|                         Entaxy.notificationWithDetails(Entaxy.NOTIFICATION_TYPE.INFO, message, table, 30000); | ||||
|                     } else { | ||||
|                         Entaxy.notificationSuccess(successMessage); | ||||
|                     } | ||||
|                     $route.reload(); | ||||
|                 }).catch(error => { | ||||
|                     Entaxy.notificationError(error); | ||||
|                     EntaxyCICD.log.error(error); | ||||
|                 }); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         function processOperationSelected(operationName, successMessage) { | ||||
|             let selectedIds = Object.keys(ctrl.selected); | ||||
|             if (selectedIds.length > 0) { | ||||
|                 let promises = []; | ||||
|                 selectedIds.forEach(id => { | ||||
|                     promises.push( | ||||
|                         entaxyCICDService.executeOperation(operationName, | ||||
|                             [ctrl.storage, ctrl.project, ctrl.version, id]) | ||||
|                     ); | ||||
|                 }); | ||||
|                 $q.all(promises).then(result => { | ||||
|                     Entaxy.notificationSuccess(successMessage ? successMessage : 'Operation succeeded'); | ||||
|                     $route.reload(); | ||||
|                 }).catch(error => { | ||||
|                     Entaxy.notificationError(error); | ||||
|                     EntaxyCICD.log.error(error); | ||||
|                 }); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|     EntaxyCICDObjectsController.$inject = ['workspace', '$scope', '$uibModal', 'entaxyCICDService', '$q', '$route']; | ||||
|  | ||||
| })(EntaxyCICD || (EntaxyCICD = {})); | ||||
| @@ -0,0 +1,127 @@ | ||||
| /*- | ||||
|  * ~~~~~~licensing~~~~~~ | ||||
|  * entaxy-cicd-plugin | ||||
|  * ========== | ||||
|  * Copyright (C) 2020 - 2025 EmDev LLC | ||||
|  * ========== | ||||
|  * You may not use this file except in accordance with the License Terms of the Copyright | ||||
|  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property | ||||
|  * rights to the Software and any copies are the property of the Copyright Holder. Unless | ||||
|  * it is explicitly allowed the Copyright Holder, the User is prohibited from using the | ||||
|  * Software for commercial purposes to provide services to third parties. | ||||
|  *  | ||||
|  * The Copyright Holder hereby declares that the Software is provided on an "AS IS". | ||||
|  * Under no circumstances does the Copyright Holder guarantee or promise that the | ||||
|  * Software provided by him will be suitable or not suitable for the specific purposes | ||||
|  * of the User, that the Software will meet all commercial and personal subjective | ||||
|  * expectations of the User, that the Software will work properly, without technical | ||||
|  * errors, quickly and uninterruptedly. | ||||
|  *  | ||||
|  * Under no circumstances shall the Copyright Holder or its Affiliates is not liable | ||||
|  * to the User for any direct or indirect losses of the User, his expenses or actual | ||||
|  * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss | ||||
|  * or damage to data, property, etc. | ||||
|  * ~~~~~~/licensing~~~~~~ | ||||
|  */ | ||||
|  | ||||
| var EntaxyCICD; | ||||
| (function (EntaxyCICD) { | ||||
|     EntaxyCICD._module.component('entaxyCiCdObjectsSelect', { | ||||
|         bindings: { | ||||
|             changeSelected: '<', | ||||
|             excludedObjectIds: '<' | ||||
|         }, | ||||
|         template: | ||||
|         ` | ||||
|           <pf-toolbar class="entaxy-toolbar" config="$ctrl.toolbarConfig"></pf-toolbar> | ||||
|           <div class="entaxy-cicd-objects-table-container"> | ||||
|             <pf-table-view config="$ctrl.tableConfig" | ||||
|                           columns="$ctrl.tableColumns" | ||||
|                           dt-options="$ctrl.dtOptions" | ||||
|                           items="$ctrl.viewedItems"> | ||||
|             </pf-table-view> | ||||
|           </div> | ||||
|         `, | ||||
|         controller: EntaxyCICDObjectsSelectController | ||||
|     }) | ||||
|     .name; | ||||
|  | ||||
|     function EntaxyCICDObjectsSelectController(workspace, entaxyCICDService) { | ||||
|         'ngInject'; | ||||
|  | ||||
|         let ctrl = this; | ||||
|  | ||||
|         ctrl.tableConfig = { | ||||
|             selectionMatchProp: 'fullId', | ||||
|             onCheckBoxChange: (item) => ctrl.changeSelected(item) | ||||
|         }; | ||||
|  | ||||
|         ctrl.toolbarConfig = { | ||||
|             filterConfig: { | ||||
|                 fields: [ | ||||
|                     { | ||||
|                         id: 'displayName', | ||||
|                         title: 'Name', | ||||
|                         placeholder: 'Filter by Name...', | ||||
|                         filterType: 'text' | ||||
|                     }, | ||||
|                     { | ||||
|                         id: 'type', | ||||
|                         title: 'Type', | ||||
|                         placeholder: 'Filter by Type...', | ||||
|                         filterType: 'text' | ||||
|                     } | ||||
|                 ], | ||||
|                 appliedFilters: [], | ||||
|                 onFilterChange: filterChange | ||||
|             }, | ||||
|             isTableView: true | ||||
|         }; | ||||
|  | ||||
|         ctrl.tableColumns = [ | ||||
|             { header: 'Name', itemField: 'displayName' }, | ||||
|             { header: 'Type', itemField: 'type' }, | ||||
|             { header: 'Full Id', itemField: 'fullId' } | ||||
|         ]; | ||||
|  | ||||
|         ctrl.dtOptions = { | ||||
|             columnDefs: [ | ||||
|                 { "targets": [0], "sortable": false }, | ||||
|                 { "targets": [3], "class": "hide" } | ||||
|             ] | ||||
|         }; | ||||
|  | ||||
|         function filterChange(filters) { | ||||
|             ctrl.viewedItems = Entaxy.applyFilters(ctrl.items, filters, matchesFilter); | ||||
|             ctrl.toolbarConfig.filterConfig.resultsCount = ctrl.viewedItems.length; | ||||
|         }; | ||||
|  | ||||
|         function matchesFilter(item, filter) { | ||||
|             let match = true; | ||||
|             if (filter.id === 'displayName') { | ||||
|                 match = item.displayName.toLowerCase().match(filter.value.toLowerCase()) !== null; | ||||
|             } else if (filter.id === 'type') { | ||||
|                 match = item.type.toLowerCase().match(filter.value.toLowerCase()) !== null; | ||||
|             } | ||||
|             return match; | ||||
|         }; | ||||
|  | ||||
|         ctrl.items = []; | ||||
|         ctrl.viewedItems = []; | ||||
|  | ||||
|         ctrl.$onInit = function() { | ||||
|             populateTable(); | ||||
|         } | ||||
|  | ||||
|         function populateTable() { | ||||
|             entaxyCICDService.executeOperation('listObjects', []) | ||||
|             .then(result => { | ||||
|                 let items = JSON.parse(result); | ||||
|                 ctrl.items = items.filter(item => !ctrl.excludedObjectIds.includes(item.fullId)); | ||||
|                 filterChange(ctrl.toolbarConfig.filterConfig.appliedFilters); | ||||
|             }); | ||||
|         } | ||||
|     } | ||||
|     EntaxyCICDObjectsSelectController.$inject = ['workspace', 'entaxyCICDService']; | ||||
|  | ||||
| })(EntaxyCICD || (EntaxyCICD = {})); | ||||
| @@ -0,0 +1,192 @@ | ||||
| /*- | ||||
|  * ~~~~~~licensing~~~~~~ | ||||
|  * entaxy-cicd-plugin | ||||
|  * ========== | ||||
|  * Copyright (C) 2020 - 2025 EmDev LLC | ||||
|  * ========== | ||||
|  * You may not use this file except in accordance with the License Terms of the Copyright | ||||
|  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property | ||||
|  * rights to the Software and any copies are the property of the Copyright Holder. Unless | ||||
|  * it is explicitly allowed the Copyright Holder, the User is prohibited from using the | ||||
|  * Software for commercial purposes to provide services to third parties. | ||||
|  *  | ||||
|  * The Copyright Holder hereby declares that the Software is provided on an "AS IS". | ||||
|  * Under no circumstances does the Copyright Holder guarantee or promise that the | ||||
|  * Software provided by him will be suitable or not suitable for the specific purposes | ||||
|  * of the User, that the Software will meet all commercial and personal subjective | ||||
|  * expectations of the User, that the Software will work properly, without technical | ||||
|  * errors, quickly and uninterruptedly. | ||||
|  *  | ||||
|  * Under no circumstances shall the Copyright Holder or its Affiliates is not liable | ||||
|  * to the User for any direct or indirect losses of the User, his expenses or actual | ||||
|  * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss | ||||
|  * or damage to data, property, etc. | ||||
|  * ~~~~~~/licensing~~~~~~ | ||||
|  */ | ||||
| var EntaxyCICD; | ||||
| (function (EntaxyCICD) { | ||||
|     EntaxyCICD._module.component('entaxyCiCdProject', { | ||||
|         template: | ||||
|         ` | ||||
|           <div ng-if="$ctrl.versions || $ctrl.isVersionSelected"> | ||||
|             <div class="entaxy-cicd-header-container"> | ||||
|               <div class="entaxy-cicd-title-with-info-container"> | ||||
|                 <span class="first" ng-class="{'lead': !$ctrl.isVersionSelected}">Project: {{$ctrl.project}}</span> | ||||
|                 <span class="lead" ng-if="$ctrl.isVersionSelected">Version: {{$ctrl.version}}</span> | ||||
|                 <div ng-if="!$ctrl.isVersionSelected"> | ||||
|                   <span>Version:</span> | ||||
|                   <entaxy-select-from-enum values="$ctrl.versions" model="$ctrl.version" | ||||
|                             is-empty-included="false"></entaxy-select-from-enum> | ||||
|                              | ||||
|                   <div class="btn-group" uib-dropdown> | ||||
|                     <button id="single-button" type="button" uib-dropdown-toggle ng-disabled="disabled"> | ||||
|                       Add Version | ||||
|                       <span class="caret"></span> | ||||
|                     </button> | ||||
|                     <ul class="dropdown-menu" uib-dropdown-menu role="menu" aria-labelledby="single-button"> | ||||
|                       <li role="menuitem"><a ng-click="$ctrl.addVersionFromScratch()">Add Version From Scratch</a></li> | ||||
|                       <li role="menuitem"><a ng-click="$ctrl.addVersionFromExistent()">Add Version From Existent</a></li> | ||||
|                     </ul> | ||||
|                   </div>        | ||||
|                 </div> | ||||
|               </div> | ||||
|               <div class="entaxy-cicd-header-buttons-container"> | ||||
|                 <button type="button" ng-click="$ctrl.commit()">Commit</button> | ||||
|                 <button type="button" ng-click="$ctrl.build()">Build</button> | ||||
|               </div> | ||||
|             </div> | ||||
|              | ||||
|             <div class="entaxy-cicd-content-container"> | ||||
|               <entaxy-ci-cd-objects storage="$ctrl.storage" project="$ctrl.project" version="$ctrl.version" | ||||
|                         ng-if="$ctrl.version"></entaxy-ci-cd-objects> | ||||
|             </div> | ||||
|           </div>     | ||||
|         `, | ||||
|         controller: entaxyCICDProjectController | ||||
|     }) | ||||
|     .name; | ||||
|  | ||||
|     function entaxyCICDProjectController(workspace, entaxyCICDService, $uibModal) { | ||||
|         'ngInject'; | ||||
|  | ||||
|         let ctrl = this; | ||||
|  | ||||
|         ctrl.$onInit = function() { | ||||
|  | ||||
|             ctrl.storage = EntaxyCICD.getStorage(workspace.selection); | ||||
|             ctrl.project = EntaxyCICD.getProjectOrApplication(workspace.selection); | ||||
|             ctrl.isVersionSelected = EntaxyCICD.isVersion(workspace.selection); | ||||
|  | ||||
|             if (ctrl.isVersionSelected) { | ||||
|                 ctrl.version = workspace.selection.title; | ||||
|             } else { | ||||
|                 populateVersions(); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         function populateVersions() { | ||||
|             ctrl.versions = EntaxyCICD.getVersions(workspace.selection); | ||||
|             if (ctrl.versions.length > 0) { | ||||
|                 ctrl.version = ctrl.versions[ctrl.versions.length - 1]; | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         function getFormFields() { | ||||
|             return [ | ||||
|                 { | ||||
|                     label: 'Current Version', | ||||
|                     name: 'currentVersion', | ||||
|                     type: 'text', | ||||
|                     value: ctrl.version, | ||||
|                     readOnly: true | ||||
|                 }, | ||||
|                 { | ||||
|                     label: 'Created Version', | ||||
|                     name: 'createdVersion', | ||||
|                     type: 'text', | ||||
|                     required: true, | ||||
|                     validation: { | ||||
|                         checkUniqueness: true, | ||||
|                         values: ctrl.versions, | ||||
|                         content: { | ||||
|                             regex: '^([1-9][0-9]*|0)\\.([1-9][0-9]*|0)\\.([1-9][0-9]*|0)$', | ||||
|                             errorMessage: 'Value must match the pattern: X.X.X, where X represents a number' | ||||
|                         } | ||||
|                     }, | ||||
|                     setFocused: true | ||||
|                 } | ||||
|             ]; | ||||
|         } | ||||
|  | ||||
|         ctrl.addVersionFromScratch = function () { | ||||
|             openCreateVersionModal(getFormFields()); | ||||
|         } | ||||
|  | ||||
|         ctrl.addVersionFromExistent = function () { | ||||
|             let formFields = getFormFields(); | ||||
|             formFields.push({ | ||||
|                 label: 'Prototype Version', | ||||
|                 name: 'prototypeVersion', | ||||
|                 enum: true, | ||||
|                 required: true, | ||||
|                 values: ctrl.versions, | ||||
|                 value: ctrl.version | ||||
|             }); | ||||
|             openCreateVersionModal(formFields); | ||||
|         } | ||||
|  | ||||
|         function openCreateVersionModal(formFields) { | ||||
|             $uibModal.open({ | ||||
|                 component: 'entaxyCiCdSimpleFieldsModal', | ||||
|                 resolve: { | ||||
|                     modalTitle: () => 'Create Version', | ||||
|                     formFields: () => formFields | ||||
|                 }, | ||||
|                 backdrop: 'static' | ||||
|             }).result.then((args) => { | ||||
|                 args.shift(); | ||||
|                 createVersion(...args); | ||||
|             }, reason => { | ||||
|                 if (reason && reason !== Entaxy.MODAL_CANCEL_REASON.ESCAPE_KEY_PRESS) { | ||||
|                     Entaxy.notificationError(reason); | ||||
|                 } | ||||
|             }); | ||||
|         } | ||||
|  | ||||
|         function createVersion(createdVersion, prototypeVersion) { | ||||
|             entaxyCICDService.executeOperation('createVersion', | ||||
|                 [ctrl.storage, ctrl.project, createdVersion, prototypeVersion]) | ||||
|             .then(result => { | ||||
|                 Entaxy.notificationSuccess(result); | ||||
|                 entaxyCICDService.treeUpdated(); | ||||
|             }).catch(error => { | ||||
|                 Entaxy.notificationError(error); | ||||
|                 EntaxyCICD.log.error(error); | ||||
|             }); | ||||
|         } | ||||
|  | ||||
|         ctrl.commit = function () { | ||||
|             processOperation('saveProjectVersion'); | ||||
|         } | ||||
|  | ||||
|         ctrl.build = function () { | ||||
|             processOperation('buildProjectVersion'); | ||||
|         } | ||||
|  | ||||
|         function processOperation(operationName) { | ||||
|             entaxyCICDService.executeOperation(operationName, [ctrl.storage, ctrl.project, ctrl.version]) | ||||
|             .then(result => { | ||||
|                 Entaxy.notificationSuccess(result); | ||||
|  | ||||
|                 if (operationName === 'buildProjectVersion') { | ||||
|                     workspace.jmxTreeUpdated(); | ||||
|                 } | ||||
|             }).catch(error => { | ||||
|                 Entaxy.notificationError(error); | ||||
|                 EntaxyCICD.log.error(error); | ||||
|             }); | ||||
|         } | ||||
|     } | ||||
|     entaxyCICDProjectController.$inject = ['workspace', 'entaxyCICDService', '$uibModal']; | ||||
|  | ||||
| })(EntaxyCICD || (EntaxyCICD = {})); | ||||
| @@ -0,0 +1,146 @@ | ||||
| /*- | ||||
|  * ~~~~~~licensing~~~~~~ | ||||
|  * entaxy-cicd-plugin | ||||
|  * ========== | ||||
|  * Copyright (C) 2020 - 2025 EmDev LLC | ||||
|  * ========== | ||||
|  * You may not use this file except in accordance with the License Terms of the Copyright | ||||
|  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property | ||||
|  * rights to the Software and any copies are the property of the Copyright Holder. Unless | ||||
|  * it is explicitly allowed the Copyright Holder, the User is prohibited from using the | ||||
|  * Software for commercial purposes to provide services to third parties. | ||||
|  *  | ||||
|  * The Copyright Holder hereby declares that the Software is provided on an "AS IS". | ||||
|  * Under no circumstances does the Copyright Holder guarantee or promise that the | ||||
|  * Software provided by him will be suitable or not suitable for the specific purposes | ||||
|  * of the User, that the Software will meet all commercial and personal subjective | ||||
|  * expectations of the User, that the Software will work properly, without technical | ||||
|  * errors, quickly and uninterruptedly. | ||||
|  *  | ||||
|  * Under no circumstances shall the Copyright Holder or its Affiliates is not liable | ||||
|  * to the User for any direct or indirect losses of the User, his expenses or actual | ||||
|  * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss | ||||
|  * or damage to data, property, etc. | ||||
|  * ~~~~~~/licensing~~~~~~ | ||||
|  */ | ||||
|  | ||||
| var EntaxyCICD; | ||||
| (function (EntaxyCICD) { | ||||
|     EntaxyCICD._module.component('entaxyCiCdProjects', { | ||||
|         template: | ||||
|         ` | ||||
|           <div class="entaxy-cicd-content-with-title-container"> | ||||
|             <h2> | ||||
|               Projects | ||||
|             </h2> | ||||
|  | ||||
|             <entaxy-ci-cd-applications-table type="Project" create-project="$ctrl.showCreateProjectModal"> | ||||
|             </entaxy-ci-cd-applications-table> | ||||
|           </div> | ||||
|         `, | ||||
|         controller: EntaxyCICDProjectsController | ||||
|     }) | ||||
|     .name; | ||||
|  | ||||
|     function EntaxyCICDProjectsController(workspace, $uibModal, entaxyCICDService, $scope, $route) { | ||||
|         'ngInject'; | ||||
|  | ||||
|         let ctrl = this; | ||||
|  | ||||
|         const isStorageSelected = EntaxyCICD.isStorage(workspace.selection); | ||||
|  | ||||
|         ctrl.$onInit = function() { | ||||
|         } | ||||
|  | ||||
|         ctrl.showCreateProjectModal = function(items) { | ||||
|             $uibModal.open({ | ||||
|                 component: 'entaxyCiCdSimpleFieldsModal', | ||||
|                 resolve: { | ||||
|                     modalTitle: () => 'Create Project', | ||||
|                     formFields: () => getFormFields(items) | ||||
|                 }, | ||||
|                 backdrop: 'static' | ||||
|             }) | ||||
|             .result.then(args => { | ||||
|                 createProject(args); | ||||
|             }, | ||||
|             reason => { | ||||
|                 if (reason && reason !== Entaxy.MODAL_CANCEL_REASON.ESCAPE_KEY_PRESS) { | ||||
|                     Entaxy.notificationError(reason); | ||||
|                 } | ||||
|             }); | ||||
|         } | ||||
|  | ||||
|         function getFormFields(items) { | ||||
|             return [ | ||||
|                 { | ||||
|                     name: 'name', | ||||
|                     label: 'Name', | ||||
|                     type: 'text', | ||||
|                     required: true, | ||||
|                     validation: { | ||||
|                         checkUniqueness: true, | ||||
|                         values: items.map(project => project.name), | ||||
|                         content: { | ||||
|                             regex: '^[a-zA-Z0-9-_]+$', | ||||
|                             errorMessage: 'Value must contain only latin letters, numbers, hyphens and underscores' | ||||
|                         }, | ||||
|                         length: { | ||||
|                             min: 3 | ||||
|                         } | ||||
|                     }, | ||||
|                     setFocused: true | ||||
|                 }, | ||||
|                 { | ||||
|                     name: 'group', | ||||
|                     label: 'Group', | ||||
|                     type: 'text', | ||||
|                     validation: { | ||||
|                         content: { | ||||
|                             regex: '^[a-zA-Z0-9-_]*$', | ||||
|                             errorMessage: 'Value must contain only latin letters, numbers, hyphens and underscores' | ||||
|                         } | ||||
|                     }, | ||||
|                 }, | ||||
|                 { | ||||
|                     name: 'storage', | ||||
|                     label: 'Storage', | ||||
|                     type: 'string', | ||||
|                     value: isStorageSelected ? workspace.selection.title : undefined, | ||||
|                     enum: isStorageSelected ? undefined : true, | ||||
|                     values: isStorageSelected ? undefined : workspace.selection.children.map(child => child.title), | ||||
|                     required: true, | ||||
|                     readOnly: isStorageSelected ? true : undefined | ||||
|                 }, | ||||
|                 { | ||||
|                     name: 'version', | ||||
|                     label: 'Version', | ||||
|                     type: 'string', | ||||
|                     value: '1.0.0', | ||||
|                     required: true, | ||||
|                     validation: { | ||||
|                         content: { | ||||
|                             regex: '^([1-9][0-9]*|0)\.([1-9][0-9]*|0)\.([1-9][0-9]*|0)$', | ||||
|                             errorMessage: 'Value must match the pattern: X.X.X, where X represents the number' | ||||
|                         } | ||||
|                     } | ||||
|                 } | ||||
|             ]; | ||||
|         } | ||||
|  | ||||
|         function createProject(args) { | ||||
|             let projectName = args[1] ? args[1] + '/' + args[0] : args[0]; | ||||
|             entaxyCICDService.executeOperation('createProject', [projectName, args[2], args[3]]) | ||||
|             .then(result => { | ||||
|                 Entaxy.notificationSuccess(result); | ||||
|                 entaxyCICDService.treeUpdated(); | ||||
|             }) | ||||
|             .catch(error => { | ||||
|                 Entaxy.notificationError(error); | ||||
|                 EntaxyCICD.log.error(error); | ||||
|             }); | ||||
|         } | ||||
|     } | ||||
|     EntaxyCICDProjectsController.$inject = ['workspace', '$uibModal', 'entaxyCICDService', '$scope', '$route']; | ||||
|  | ||||
| })(EntaxyCICD || (EntaxyCICD = {})); | ||||
| @@ -0,0 +1,246 @@ | ||||
| /*- | ||||
|  * ~~~~~~licensing~~~~~~ | ||||
|  * entaxy-cicd-plugin | ||||
|  * ========== | ||||
|  * Copyright (C) 2020 - 2025 EmDev LLC | ||||
|  * ========== | ||||
|  * You may not use this file except in accordance with the License Terms of the Copyright | ||||
|  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property | ||||
|  * rights to the Software and any copies are the property of the Copyright Holder. Unless | ||||
|  * it is explicitly allowed the Copyright Holder, the User is prohibited from using the | ||||
|  * Software for commercial purposes to provide services to third parties. | ||||
|  *  | ||||
|  * The Copyright Holder hereby declares that the Software is provided on an "AS IS". | ||||
|  * Under no circumstances does the Copyright Holder guarantee or promise that the | ||||
|  * Software provided by him will be suitable or not suitable for the specific purposes | ||||
|  * of the User, that the Software will meet all commercial and personal subjective | ||||
|  * expectations of the User, that the Software will work properly, without technical | ||||
|  * errors, quickly and uninterruptedly. | ||||
|  *  | ||||
|  * Under no circumstances shall the Copyright Holder or its Affiliates is not liable | ||||
|  * to the User for any direct or indirect losses of the User, his expenses or actual | ||||
|  * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss | ||||
|  * or damage to data, property, etc. | ||||
|  * ~~~~~~/licensing~~~~~~ | ||||
|  */ | ||||
| var EntaxyCICD; | ||||
| (function (EntaxyCICD) { | ||||
|     EntaxyCICD._module.component('entaxyCiCdProjectVersions', { | ||||
|         template: | ||||
|         ` | ||||
|           <div class="entaxy-cicd-content-with-title-container"> | ||||
|             <h2>{{$ctrl.title}}</h2> | ||||
|  | ||||
|             <pf-toolbar class="entaxy-toolbar" config="$ctrl.toolbarConfig"> | ||||
|               <actions> | ||||
|                 <span class="dropdown primary-action" uib-dropdown> | ||||
|                   <button class="dropdown-toggle" uib-dropdown-toggle type="button"> | ||||
|                     Add Version | ||||
|                     <span class="caret"></span> | ||||
|                   </button> | ||||
|                   <ul class="dropdown-menu"> | ||||
|                     <li role="menuitem" ng-click="$ctrl.addVersionFromScratch()"> | ||||
|                       <a class="secondary-action">Add Version From Scratch</a> | ||||
|                     </li> | ||||
|                     <li role="menuitem" ng-click="$ctrl.addVersionFromExistent()"> | ||||
|                       <a class="secondary-action">Add Version From Existent</a> | ||||
|                     </li> | ||||
|                   </ul> | ||||
|                 </span> | ||||
|               </actions> | ||||
|             </pf-toolbar> | ||||
|             <pf-table-view class="entaxy-cicd-table" | ||||
|                           config="$ctrl.tableConfig" | ||||
|                           columns="$ctrl.tableColumns" | ||||
|                           action-buttons="$ctrl.tableActionButtons" | ||||
|                           page-config="$ctrl.pageConfig" | ||||
|                           items="$ctrl.viewedItems"> | ||||
|             </pf-table-view>   | ||||
|           </div> | ||||
|         `, | ||||
|         controller: entaxyCICDProjectVersionsController | ||||
|     }) | ||||
|         .name; | ||||
|  | ||||
|     function entaxyCICDProjectVersionsController($scope, workspace, entaxyCICDService, $uibModal, $templateCache, | ||||
|                                                  $location) { | ||||
|         'ngInject'; | ||||
|  | ||||
|         let ctrl = this; | ||||
|  | ||||
|         ctrl.tableConfig = { | ||||
|             selectionMatchProp: 'name', | ||||
|             showCheckboxes: false | ||||
|         }; | ||||
|  | ||||
|         ctrl.toolbarConfig = { | ||||
|             filterConfig: { | ||||
|                 fields: [ | ||||
|                     { | ||||
|                         id: 'name', | ||||
|                         title: 'Name', | ||||
|                         placeholder: 'Filter by Name...', | ||||
|                         filterType: 'text' | ||||
|                     }, | ||||
|                     { | ||||
|                         id: 'isBuilt', | ||||
|                         title: 'Build Available', | ||||
|                         placeholder: 'Filter by Built Availability...', | ||||
|                         filterType: 'select', | ||||
|                         filterValues: ['yes', 'no'] | ||||
|                     } | ||||
|                 ], | ||||
|                 appliedFilters: [], | ||||
|                 onFilterChange: filterChange | ||||
|             }, | ||||
|             actionsConfig: { | ||||
|                 actionsInclude: true | ||||
|             }, | ||||
|             isTableView: true | ||||
|         }; | ||||
|  | ||||
|         ctrl.tableColumns = [ | ||||
|             { | ||||
|                 header: 'Name', | ||||
|                 itemField: 'name', | ||||
|                 htmlTemplate: 'project/version/name.html', | ||||
|                 colActionFn: (name) => ctrl.changeLocation(name) | ||||
|             }, | ||||
|             { header: 'Build Available', itemField: 'isBuilt', | ||||
|                 templateFn: (value) => EntaxyCICD.getStatusTemplate(value) } | ||||
|         ]; | ||||
|  | ||||
|         $templateCache.put( | ||||
|             'project/version/name.html', | ||||
|             '<a href="" ng-click="$ctrl.handleColAction(key, value)">{{value}}</a>' | ||||
|         ); | ||||
|  | ||||
|         ctrl.changeLocation = function (name) { | ||||
|             let nid = $location.search().nid; | ||||
|             $location.search('nid', nid + '-' + name); | ||||
|         } | ||||
|  | ||||
|         ctrl.pageConfig = Entaxy.getStandardPageConfig(); | ||||
|  | ||||
|         function filterChange(filters) { | ||||
|             ctrl.viewedItems = Entaxy.applyFilters(ctrl.items, filters, matchesFilter); | ||||
|             ctrl.toolbarConfig.filterConfig.resultsCount = ctrl.viewedItems.length; | ||||
|         }; | ||||
|  | ||||
|         function matchesFilter(item, filter) { | ||||
|             let match = true; | ||||
|             if (filter.id === 'name') { | ||||
|                 match = item.name.toLowerCase().match(filter.value.toLowerCase()) !== null; | ||||
|             } else if (filter.id === 'isBuilt') { | ||||
|                 match = filter.value === 'yes' ? item.isBuilt === true : item.isBuilt === false; | ||||
|             } | ||||
|             return match; | ||||
|         }; | ||||
|  | ||||
|         ctrl.$onInit = function() { | ||||
|  | ||||
|             ctrl.storage = EntaxyCICD.getStorage(workspace.selection); | ||||
|             ctrl.project = workspace.selection.title; | ||||
|  | ||||
|             ctrl.title = 'Versions'; | ||||
|  | ||||
|             ctrl.tableActionButtons = [ | ||||
|                 { name: 'Remove', title: 'Remove Version', actionFn: removeVersion } | ||||
|             ]; | ||||
|  | ||||
|             populateTable(); | ||||
|         } | ||||
|  | ||||
|         ctrl.items = []; | ||||
|         ctrl.viewedItems = []; | ||||
|  | ||||
|         function populateTable() { | ||||
|             let selectedProject = workspace.selection; | ||||
|             if (selectedProject.children && selectedProject.children.length > 0) { | ||||
|                 let versions = []; | ||||
|                 selectedProject.children.forEach(version => { | ||||
|                     versions.push({ | ||||
|                         name: version.title, | ||||
|                         isBuilt: version.children && version.children.length === 1 ? true : false | ||||
|                     }); | ||||
|                 }); | ||||
|  | ||||
|                 ctrl.items = versions; | ||||
|                 filterChange(ctrl.toolbarConfig.filterConfig.appliedFilters); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         function getFormFields() { | ||||
|             return [ | ||||
|                 { | ||||
|                     label: 'Created Version', | ||||
|                     name: 'createdVersion', | ||||
|                     type: 'text', | ||||
|                     required: true, | ||||
|                     validation: { | ||||
|                         checkUniqueness: true, | ||||
|                         values: ctrl.items.map(version => version.name), | ||||
|                         content: { | ||||
|                             regex: '^([1-9][0-9]*|0)\\.([1-9][0-9]*|0)\\.([1-9][0-9]*|0)$', | ||||
|                             errorMessage: 'Value must match the pattern: X.X.X, where X represents a number' | ||||
|                         } | ||||
|                     }, | ||||
|                     setFocused: true | ||||
|                 } | ||||
|             ]; | ||||
|         } | ||||
|  | ||||
|         ctrl.addVersionFromScratch = function () { | ||||
|             openCreateVersionModal(getFormFields()); | ||||
|         } | ||||
|  | ||||
|         ctrl.addVersionFromExistent = function () { | ||||
|             let formFields = getFormFields(); | ||||
|             formFields.push({ | ||||
|                 label: 'Prototype Version', | ||||
|                 name: 'prototypeVersion', | ||||
|                 enum: true, | ||||
|                 required: true, | ||||
|                 values: ctrl.items.map(version => version.name) | ||||
|             }); | ||||
|             openCreateVersionModal(formFields); | ||||
|         } | ||||
|  | ||||
|         function openCreateVersionModal(formFields) { | ||||
|             $uibModal.open({ | ||||
|                 component: 'entaxyCiCdSimpleFieldsModal', | ||||
|                 resolve: { | ||||
|                     modalTitle: () => 'Create Version', | ||||
|                     formFields: () => formFields | ||||
|                 }, | ||||
|                 backdrop: 'static' | ||||
|             }).result.then((args) => { | ||||
|                 createVersion(...args); | ||||
|             }, reason => { | ||||
|                 if (reason && reason !== Entaxy.MODAL_CANCEL_REASON.ESCAPE_KEY_PRESS) { | ||||
|                     Entaxy.notificationError(reason); | ||||
|                 } | ||||
|             }); | ||||
|         } | ||||
|  | ||||
|         function createVersion(createdVersion, prototypeVersion) { | ||||
|             entaxyCICDService.executeOperation('createVersion', | ||||
|                 [ctrl.storage, ctrl.project, createdVersion, prototypeVersion]) | ||||
|             .then(result => { | ||||
|                 Entaxy.notificationSuccess(result); | ||||
|                 entaxyCICDService.treeUpdated(); | ||||
|             }).catch(error => { | ||||
|                 Entaxy.notificationError(error); | ||||
|                 EntaxyCICD.log.error(error); | ||||
|             }); | ||||
|         } | ||||
|  | ||||
|         function removeVersion(action, item) { | ||||
|             let properties = [ctrl.storage, ctrl.project, item.name]; | ||||
|             entaxyCICDService.removeItemWithConfirmation(EntaxyCICD.ITEM_TYPE.VERSION, item.name, properties); | ||||
|         } | ||||
|     } | ||||
|     entaxyCICDProjectVersionsController.$inject = ['$scope', 'workspace', 'entaxyCICDService', '$uibModal', | ||||
|         '$templateCache', '$location']; | ||||
|  | ||||
| })(EntaxyCICD || (EntaxyCICD = {})); | ||||
| @@ -0,0 +1,153 @@ | ||||
| /*- | ||||
|  * ~~~~~~licensing~~~~~~ | ||||
|  * entaxy-cicd-plugin | ||||
|  * ========== | ||||
|  * Copyright (C) 2020 - 2025 EmDev LLC | ||||
|  * ========== | ||||
|  * You may not use this file except in accordance with the License Terms of the Copyright | ||||
|  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property | ||||
|  * rights to the Software and any copies are the property of the Copyright Holder. Unless | ||||
|  * it is explicitly allowed the Copyright Holder, the User is prohibited from using the | ||||
|  * Software for commercial purposes to provide services to third parties. | ||||
|  *  | ||||
|  * The Copyright Holder hereby declares that the Software is provided on an "AS IS". | ||||
|  * Under no circumstances does the Copyright Holder guarantee or promise that the | ||||
|  * Software provided by him will be suitable or not suitable for the specific purposes | ||||
|  * of the User, that the Software will meet all commercial and personal subjective | ||||
|  * expectations of the User, that the Software will work properly, without technical | ||||
|  * errors, quickly and uninterruptedly. | ||||
|  *  | ||||
|  * Under no circumstances shall the Copyright Holder or its Affiliates is not liable | ||||
|  * to the User for any direct or indirect losses of the User, his expenses or actual | ||||
|  * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss | ||||
|  * or damage to data, property, etc. | ||||
|  * ~~~~~~/licensing~~~~~~ | ||||
|  */ | ||||
|  | ||||
| var EntaxyCICD; | ||||
| (function (EntaxyCICD) { | ||||
|     EntaxyCICD._module.component('entaxyCiCdRequirements', { | ||||
|         bindings: { | ||||
|             version: '<', | ||||
|             type: '@' | ||||
|         }, | ||||
|         template: | ||||
|         ` | ||||
|           <pf-toolbar class="entaxy-toolbar" config="$ctrl.toolbarConfig"></pf-toolbar> | ||||
|           <pf-table-view config="$ctrl.tableConfig" | ||||
|                           columns="$ctrl.tableColumns" | ||||
|                           page-config="$ctrl.pageConfig" | ||||
|                           items="$ctrl.viewedItems"> | ||||
|           </pf-table-view> | ||||
|         `, | ||||
|         controller: EntaxyCICDRequirementsController | ||||
|     }) | ||||
|     .name; | ||||
|  | ||||
|     function EntaxyCICDRequirementsController(workspace, $scope, $uibModal, entaxyCICDService) { | ||||
|         'ngInject'; | ||||
|  | ||||
|         let ctrl = this; | ||||
|  | ||||
|         ctrl.tableConfig = { | ||||
|             selectionMatchProp: 'id', | ||||
|             showCheckboxes: false | ||||
|         }; | ||||
|  | ||||
|         ctrl.toolbarConfig = { | ||||
|             filterConfig: { | ||||
|                 fields: [ | ||||
|                     { | ||||
|                         id: 'id', | ||||
|                         title: 'Id', | ||||
|                         placeholder: 'Filter by Id...', | ||||
|                         filterType: 'text' | ||||
|                     }, | ||||
|                     { | ||||
|                         id: 'type', | ||||
|                         title: 'Type', | ||||
|                         placeholder: 'Filter by Type...', | ||||
|                         filterType: 'select', | ||||
|                         filterValues: [] | ||||
|                     }, | ||||
|                     { | ||||
|                         id: 'scope', | ||||
|                         title: 'Scope', | ||||
|                         placeholder: 'Filter by Scope...', | ||||
|                         filterType: 'select', | ||||
|                         filterValues: [] | ||||
|                     }, | ||||
|                     { | ||||
|                         id: 'status', | ||||
|                         title: 'Status', | ||||
|                         placeholder: 'Filter by Status...', | ||||
|                         filterType: 'select', | ||||
|                         filterValues: ['yes', 'no'] | ||||
|                     } | ||||
|                 ], | ||||
|                 inlineResults: true, | ||||
|                 appliedFilters: [], | ||||
|                 onFilterChange: filterChange | ||||
|             }, | ||||
|             isTableView: true | ||||
|         }; | ||||
|  | ||||
|         ctrl.tableColumns = [ | ||||
|             { header: 'Id', itemField: 'id' }, | ||||
|             { header: 'Type', itemField: 'type' }, | ||||
|             { header: 'Scope', itemField: 'scope' }, | ||||
|             { header: 'Status', itemField: 'status', templateFn: (value) => EntaxyCICD.getStatusTemplate(value) } | ||||
|         ]; | ||||
|  | ||||
|         ctrl.pageConfig = Entaxy.getStandardPageConfig(); | ||||
|  | ||||
|         function filterChange(filters) { | ||||
|             ctrl.viewedItems = Entaxy.applyFilters(ctrl.items, filters, matchesFilter); | ||||
|             ctrl.toolbarConfig.filterConfig.resultsCount = ctrl.viewedItems.length; | ||||
|         }; | ||||
|  | ||||
|         function matchesFilter(item, filter) { | ||||
|             let match = true; | ||||
|             if (filter.id === 'id') { | ||||
|                 match = item.id.toLowerCase().match(filter.value.toLowerCase()) !== null; | ||||
|             } else if (filter.id === 'type') { | ||||
|                 match = item.type === filter.value; | ||||
|             } else if (filter.id === 'scope') { | ||||
|                 match = item.scope === filter.value; | ||||
|             } else if (filter.id === 'status') { | ||||
|                 match = filter.value === 'yes' ? item.status === true : item.status === false; | ||||
|             } | ||||
|             return match; | ||||
|         }; | ||||
|  | ||||
|         ctrl.items = []; | ||||
|         ctrl.viewedItems = []; | ||||
|  | ||||
|         ctrl.$onInit = function() { | ||||
|  | ||||
|             entaxyCICDService.setTypesToFilterConfig(ctrl.toolbarConfig.filterConfig.fields); | ||||
|  | ||||
|             entaxyCICDService.setScopesToFilterConfig(ctrl.toolbarConfig.filterConfig.fields); | ||||
|         } | ||||
|  | ||||
|         $scope.$watch('$ctrl.version', function () { | ||||
|             populateTable(); | ||||
|         }); | ||||
|  | ||||
|         function populateTable() { | ||||
|  | ||||
|             const storage = EntaxyCICD.getStorage(workspace.selection); | ||||
|             const application = EntaxyCICD.getProjectOrApplication(workspace.selection); | ||||
|             let operationName = 'list' + ctrl.type + 'Requirements'; | ||||
|  | ||||
|             entaxyCICDService.executeOperation(operationName, [storage, application, ctrl.version]) | ||||
|             .then(result => { | ||||
|                 let items = JSON.parse(result); | ||||
|                 ctrl.items = items; | ||||
|                 filterChange(ctrl.toolbarConfig.filterConfig.appliedFilters); | ||||
|             }); | ||||
|         } | ||||
|     } | ||||
|     EntaxyCICDRequirementsController.$inject = ['workspace', '$scope', '$uibModal', 'entaxyCICDService']; | ||||
|  | ||||
| })(EntaxyCICD || (EntaxyCICD = {})); | ||||
| @@ -0,0 +1,147 @@ | ||||
| /*- | ||||
|  * ~~~~~~licensing~~~~~~ | ||||
|  * entaxy-management-plugin | ||||
|  * ========== | ||||
|  * Copyright (C) 2020 - 2025 EmDev LLC | ||||
|  * ========== | ||||
|  * You may not use this file except in accordance with the License Terms of the Copyright | ||||
|  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property | ||||
|  * rights to the Software and any copies are the property of the Copyright Holder. Unless | ||||
|  * it is explicitly allowed the Copyright Holder, the User is prohibited from using the | ||||
|  * Software for commercial purposes to provide services to third parties. | ||||
|  *  | ||||
|  * The Copyright Holder hereby declares that the Software is provided on an "AS IS". | ||||
|  * Under no circumstances does the Copyright Holder guarantee or promise that the | ||||
|  * Software provided by him will be suitable or not suitable for the specific purposes | ||||
|  * of the User, that the Software will meet all commercial and personal subjective | ||||
|  * expectations of the User, that the Software will work properly, without technical | ||||
|  * errors, quickly and uninterruptedly. | ||||
|  *  | ||||
|  * Under no circumstances shall the Copyright Holder or its Affiliates is not liable | ||||
|  * to the User for any direct or indirect losses of the User, his expenses or actual | ||||
|  * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss | ||||
|  * or damage to data, property, etc. | ||||
|  * ~~~~~~/licensing~~~~~~ | ||||
|  */ | ||||
| var EntaxyCICD; | ||||
| (function (EntaxyCICD) { | ||||
|     EntaxyCICD._module.component('entaxyCiCdSimpleFieldsModal', { | ||||
|         bindings: { | ||||
|             modalInstance: '<', | ||||
|             resolve: '<' | ||||
|         }, | ||||
|         template: | ||||
|         ` | ||||
|           <div class="entaxy-modal-container simple-modal-content"> | ||||
|             <div class="modal-header"> | ||||
|               <button type="button" class="close" aria-label="Close" ng-click="$ctrl.cancel()"> | ||||
|                 <span class="pficon pficon-close" aria-hidden="true"></span> | ||||
|               </button> | ||||
|               <h4 class="modal-title">{{$ctrl.resolve.modalTitle}}</h4> | ||||
|             </div> | ||||
|             <div class="modal-body"> | ||||
|               <form name="entaxyObjectForm" class="form-horizontal"> | ||||
|                 <div class="form-group" ng-repeat="formField in $ctrl.formFields" | ||||
|                         ng-class="{'has-error': $ctrl.errors[formField.name]}" ng-if="!formField.isHidden"> | ||||
|                   <div class="col-sm-3 label-col"> | ||||
|                     <label class="control-label" ng-class="{'required-pf': formField.required}" for="{{formField.name}}"> | ||||
|                       {{formField.label}} | ||||
|                     </label> | ||||
|                     <button type="button" class="btn btn-link label-description-popover" | ||||
|                             popover-placement="auto top-left" popover-trigger="'outsideClick'" | ||||
|                             uib-popover="{{formField.description}}" ng-if="formField.description"> | ||||
|                       <span class="pficon pficon-help"></span> | ||||
|                     </button> | ||||
|                   </div> | ||||
|                   <div class="col-sm-8"> | ||||
|                     <input type="{{formField.type}}" id="{{formField.name}}" class="form-control" | ||||
|                             ng-model="formField.value" ng-readonly="formField.readOnly" | ||||
|                             ng-if="!formField.enum && !formField.resource" set-focused="formField.setFocused"> | ||||
|                     <entaxy-select-from-enum id="{{formField.name}}" values="formField.values" | ||||
|                             model="formField.value" readonly="formField.readOnly" is-empty-included="false" | ||||
|                             ng-if="formField.enum" set-focused="formField.setFocused"></entaxy-select-from-enum> | ||||
|                     <entaxy-resource-input id="{{formField.name}}" name="{{formField.name}}" model="formField.value" | ||||
|                             ng-if="formField.resource"></entaxy-resource-input> | ||||
|                     <span class="help-block" ng-show="$ctrl.errors[formField.name]"> | ||||
|                       {{$ctrl.errors[formField.name]}} | ||||
|                     </span> | ||||
|                   </div> | ||||
|                 </div> | ||||
|               </form> | ||||
|             </div> | ||||
|             <div class="modal-footer"> | ||||
|               <button type="submit" class="btn btn-primary" ng-click="$ctrl.save()">Save</button> | ||||
|             </div> | ||||
|           </div> | ||||
|         `, | ||||
|         controller: entaxyCICDSimpleFieldsModalController | ||||
|     }) | ||||
|         .name; | ||||
|  | ||||
|     function entaxyCICDSimpleFieldsModalController($scope, $uibModal, entaxyService, entaxyHotkeysService) { | ||||
|         'ngInject'; | ||||
|  | ||||
|         let ctrl = this; | ||||
|  | ||||
|         ctrl.$onInit = function() { | ||||
|             entaxyHotkeysService.setHotkeys($scope, getHotkeysConfigs()); | ||||
|  | ||||
|             ctrl.formFields = ctrl.resolve.formFields; | ||||
|             if (!ctrl.formFields || ctrl.formFields.length === 0) { | ||||
|                 ctrl.cancel('Fields can not be found'); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         ctrl.cancel = function(reason) { | ||||
|             ctrl.modalInstance.dismiss(reason); | ||||
|         } | ||||
|  | ||||
|         ctrl.save = function() { | ||||
|             ctrl.errors = validate(); | ||||
|             if (Object.keys(ctrl.errors).length === 0) { | ||||
|                 let args = ctrl.formFields.map(formField => formField.value); | ||||
|                 ctrl.modalInstance.close(args); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         function validate() { | ||||
|             let errors = {}; | ||||
|  | ||||
|             ctrl.formFields.forEach(formField => { | ||||
|                 if (formField.required && (formField.value === undefined || | ||||
|                         (!formField.resource && formField.value.trim().length === 0))) { | ||||
|                     errors[formField.name] = Entaxy.ERROR_MESSAGE.EMPTY; | ||||
|                 } | ||||
|  | ||||
|                 if (!errors[formField.name] && formField.validation) { | ||||
|                     let validation = { ...formField.validation }; | ||||
|                     delete validation.checkUniqueness; | ||||
|                     delete validation.values; | ||||
|  | ||||
|                     entaxyService.validateByRules(formField, validation, errors); | ||||
|                 } | ||||
|  | ||||
|                 if (!errors[formField.name] && formField.validation && formField.validation.checkUniqueness | ||||
|                         && formField.validation.values.includes(formField.value)) { | ||||
|                     errors[formField.name] = Entaxy.ERROR_MESSAGE.UNIQUE; | ||||
|                 } | ||||
|             }); | ||||
|  | ||||
|             return errors; | ||||
|         } | ||||
|  | ||||
|         function getHotkeysConfigs() { | ||||
|             return [ | ||||
|                 { | ||||
|                     ...Entaxy.getSaveHotkeyDescription(), | ||||
|                     callback: function (event) { | ||||
|                         event.preventDefault(); | ||||
|                         ctrl.save(); | ||||
|                     } | ||||
|                 } | ||||
|             ]; | ||||
|         } | ||||
|     } | ||||
|     entaxyCICDSimpleFieldsModalController.$inject = ['$scope', '$uibModal', 'entaxyService', 'entaxyHotkeysService']; | ||||
|  | ||||
| })(EntaxyCICD || (EntaxyCICD = {})); | ||||
| @@ -0,0 +1,263 @@ | ||||
| /*- | ||||
|  * ~~~~~~licensing~~~~~~ | ||||
|  * entaxy-cicd-plugin | ||||
|  * ========== | ||||
|  * Copyright (C) 2020 - 2025 EmDev LLC | ||||
|  * ========== | ||||
|  * You may not use this file except in accordance with the License Terms of the Copyright | ||||
|  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property | ||||
|  * rights to the Software and any copies are the property of the Copyright Holder. Unless | ||||
|  * it is explicitly allowed the Copyright Holder, the User is prohibited from using the | ||||
|  * Software for commercial purposes to provide services to third parties. | ||||
|  *  | ||||
|  * The Copyright Holder hereby declares that the Software is provided on an "AS IS". | ||||
|  * Under no circumstances does the Copyright Holder guarantee or promise that the | ||||
|  * Software provided by him will be suitable or not suitable for the specific purposes | ||||
|  * of the User, that the Software will meet all commercial and personal subjective | ||||
|  * expectations of the User, that the Software will work properly, without technical | ||||
|  * errors, quickly and uninterruptedly. | ||||
|  *  | ||||
|  * Under no circumstances shall the Copyright Holder or its Affiliates is not liable | ||||
|  * to the User for any direct or indirect losses of the User, his expenses or actual | ||||
|  * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss | ||||
|  * or damage to data, property, etc. | ||||
|  * ~~~~~~/licensing~~~~~~ | ||||
|  */ | ||||
|  | ||||
| var EntaxyCICD; | ||||
| (function (EntaxyCICD) { | ||||
|     EntaxyCICD._module.component('entaxyCiCdTreeHeader', { | ||||
|         template: | ||||
|         ` | ||||
|           <div class="tree-nav-sidebar-header"> | ||||
|             <form role="form" class="search-pf has-button"> | ||||
|               <div class="form-group has-clear"> | ||||
|                 <div class="search-pf-input-group"> | ||||
|                   <label for="input-search" class="sr-only">Search Tree:</label> | ||||
|                   <input id="input-search" type="search" class="form-control" placeholder="Search tree:" | ||||
|                           ng-model="$ctrl.filter"> | ||||
|                   <button type="button" class="clear" aria-hidden="true" | ||||
|                           ng-hide="$ctrl.filter.length === 0" | ||||
|                           ng-click="$ctrl.filter = ''"> | ||||
|                     <span class="pficon pficon-close"></span> | ||||
|                   </button> | ||||
|                 </div> | ||||
|               </div> | ||||
|               <div class="form-group tree-nav-buttons"> | ||||
|                 <span class="badge" ng-class="{positive: $ctrl.result.length > 0}" | ||||
|                         ng-show="$ctrl.filter.length > 0"> | ||||
|                   {{$ctrl.result.length}} | ||||
|                 </span> | ||||
|                 <i class="fa fa-plus-square-o" title="Expand All" ng-click="$ctrl.expandAll()"></i> | ||||
|                 <i class="fa fa-minus-square-o" title="Collapse All" ng-click="$ctrl.contractAll()"></i> | ||||
|               </div> | ||||
|             </form> | ||||
|           </div> | ||||
|         `, | ||||
|         controller: EntaxyCICDTreeHeaderController | ||||
|     }).component('entaxyCiCdTree', { | ||||
|         template: | ||||
|         ` | ||||
|           <div class="tree-nav-sidebar-content"> | ||||
|             <div id="entaxycicdtree" class="treeview-pf-hover treeview-pf-select"></div> | ||||
|           </div> | ||||
|         `, | ||||
|         controller: EntaxyCICDTreeController | ||||
|     }) | ||||
|     .name; | ||||
|     entaxyCICDTreeElementId = '#entaxycicdtree'; | ||||
|     EntaxyCICD.log.debug("loaded tree" + EntaxyCICD.treeModule); | ||||
|  | ||||
|     function EntaxyCICDTreeHeaderController($scope, $element) { | ||||
|         'ngInject'; | ||||
|         EntaxyCICD.log.debug("EntaxyCICDTreeHeaderController "); | ||||
|         this.$scope = $scope; | ||||
|         this.$element = $element; | ||||
|         this.filter = ''; | ||||
|         this.result = []; | ||||
|         // it's not possible to declare classes to the component host tag in AngularJS | ||||
|         $element.addClass('tree-nav-sidebar-header'); | ||||
|  | ||||
|         EntaxyCICDTreeHeaderController.prototype.$onInit = function () { | ||||
|             EntaxyCICD.log.debug("EntaxyCICDTreeHeaderController init"); | ||||
|             var _this = this; | ||||
|             this.$scope.$watch(angular.bind(this, function () { return _this.filter; }), function (filter, previous) { | ||||
|                 if (filter !== previous) { | ||||
|                     _this.search(filter); | ||||
|                 } | ||||
|             }); | ||||
|         }; | ||||
|  | ||||
|         EntaxyCICDTreeHeaderController.prototype.search = function (filter) { | ||||
|             EntaxyCICD.log.debug("EntaxyCICDTreeHeaderController search"); | ||||
|             var _this = this; | ||||
|             var doSearch = function (filter) { | ||||
|                 var result = _this.tree().search(filter, { | ||||
|                     ignoreCase: true, | ||||
|                     exactMatch: false, | ||||
|                     revealResults: true | ||||
|                 }); | ||||
|                 _this.result.length = 0; | ||||
|                 (_a = _this.result).push.apply(_a, result); | ||||
|                 Core.$apply(_this.$scope); | ||||
|                 var _a; | ||||
|             }; | ||||
|             _.debounce(doSearch, 300, { leading: false, trailing: true })(filter); | ||||
|         }; | ||||
|  | ||||
|         EntaxyCICDTreeHeaderController.prototype.tree = function () { | ||||
|             EntaxyCICD.log.debug("EntaxyCICDTreeHeaderController tree"); | ||||
|             return $(entaxyCICDTreeElementId).treeview(true); | ||||
|         }; | ||||
|  | ||||
|         EntaxyCICDTreeHeaderController.prototype.expandAll = function () { | ||||
|             EntaxyCICD.log.debug("EntaxyCICDTreeHeaderController expand"); | ||||
|             return this.tree() | ||||
|                 .expandNode(this.tree().getNodes(), { levels: HawtioTree.getMaxTreeLevel(this.tree()), silent: true }); | ||||
|         }; | ||||
|  | ||||
|         EntaxyCICDTreeHeaderController.prototype.contractAll = function () { | ||||
|             EntaxyCICD.log.debug("EntaxyCICDTreeHeaderController contract"); | ||||
|             return this.tree() | ||||
|                 .collapseNode(this.tree().getNodes(), { ignoreChildren: true, silent: true }); | ||||
|         }; | ||||
|     } | ||||
|     EntaxyCICDTreeHeaderController.$inject = ['$scope', '$element']; | ||||
|  | ||||
|     function EntaxyCICDTreeController($scope, $location, workspace, $element, operationsService, $q) { | ||||
|         'ngInject'; | ||||
|         this.$scope = $scope; | ||||
|         this.$location = $location; | ||||
|         this.workspace = workspace; | ||||
|         this.$element = $element; | ||||
|         // it's not possible to declare classes to the component host tag in AngularJS | ||||
|         $element.addClass('tree-nav-sidebar-content'); | ||||
|         EntaxyCICD.log.debug("EntaxyCICDTreeController "); | ||||
|         var entaxyCICDJmxDomain = localStorage['entaxyCICDJmxDomain'] || "ru.entaxy.cicd"; | ||||
|  | ||||
|         EntaxyCICDTreeController.prototype.$onInit = function () { | ||||
|             EntaxyCICD.log.debug("EntaxyCICDTreeController onInit"); | ||||
|             var _this = this; | ||||
|             this.$scope.$on('$destroy', function () { return _this.removeTree(); }); | ||||
|             this.$scope.$on('$routeChangeStart', function () { | ||||
|                 return Jmx.updateTreeSelectionFromURL(_this.$location, $(entaxyCICDTreeElementId)); | ||||
|             }); | ||||
|             this.$scope.$on('jmxTreeUpdated', function (event, opts) { | ||||
|                 let updateSelectionNode = opts ? opts.updateSelectionNode : false; | ||||
|                 return _this.populateTree(updateSelectionNode); | ||||
|             }); | ||||
|             this.populateTree(); | ||||
|         }; | ||||
|         EntaxyCICDTreeController.prototype.updateSelectionFromURL = function () { | ||||
|             Jmx.updateTreeSelectionFromURLAndAutoSelect(this.$location, $(entaxyCICDTreeElementId), null, true); | ||||
|         }; | ||||
|         EntaxyCICDTreeController.prototype.populateTree = function (updateSelectionNode) { | ||||
|  | ||||
|             let tree = this.workspace.tree; | ||||
|  | ||||
|             if (tree) { | ||||
|                 let domain = tree.get(entaxyCICDJmxDomain); | ||||
|  | ||||
|                 if (domain && domain.children && domain.children.length > 0) { | ||||
|                     let promises = []; | ||||
|                     domain.children.forEach(child => { | ||||
|                         child.class = createClassName(child.title); | ||||
|                         promises.push( | ||||
|                             operationsService.executeOperation(child.objectName, {name: 'readAsTree'}, []) | ||||
|                             .then(result => { | ||||
|                                 let nodes = JSON.parse(result); | ||||
|  | ||||
|                                 let folderNames = child.key.split('-'); | ||||
|                                 folderNames.shift(); | ||||
|                                 let cicdTree = createTree(nodes, child.key, folderNames); | ||||
|                                 cicdTree.forEach(cicdChild => { | ||||
|                                     cicdChild.parent = child; | ||||
|                                 }); | ||||
|                                 child.children = cicdTree; | ||||
|                             }) | ||||
|                         ); | ||||
|                     }); | ||||
|  | ||||
|                     $q.all(promises).then(() => { | ||||
|                         this.removeTree(); | ||||
|                         Jmx.enableTree(this.$scope, this.$location, this.workspace, | ||||
|                             $(entaxyCICDTreeElementId), domain.children); | ||||
|                         this.updateSelectionFromURL(); | ||||
|                         if (updateSelectionNode) { | ||||
|                             workspace.updateSelectionNode(workspace.selection); | ||||
|                         } | ||||
|                     }); | ||||
|                 } | ||||
|             } | ||||
|         }; | ||||
|         function createTree(children, keyPrefix, folderNames) { | ||||
|             let folders = []; | ||||
|             if (children && children.length > 0) { | ||||
|                 children.forEach(child => { | ||||
|                     let folder = new Jmx.Folder(child.title); | ||||
|                     let index = child.title.indexOf('['); | ||||
|                     if (index > 0) { | ||||
|                         folder.key = keyPrefix + '-' + child.title.slice(0, index - 1).toLowerCase(); | ||||
|                     } else { | ||||
|                         folder.key = keyPrefix + '-' + child.title.toLowerCase(); | ||||
|                     } | ||||
|                     let folderNamesCopy = folderNames.map(folderName => folderName); | ||||
|                     folderNamesCopy.push(index > 0 ? child.title.slice(0, index - 1) : child.title); | ||||
|                     folder.folderNames = folderNamesCopy; | ||||
|                     addClass(folder); | ||||
|                     folder.tooltip = folder.title; | ||||
|                     folder.domain = entaxyCICDJmxDomain; | ||||
|                     folder.children = createTree(child.children, folder.key, folderNamesCopy); | ||||
|                     if (folder.children && folder.children.length > 0) { | ||||
|                         folder.children.forEach(child => { | ||||
|                             child.parent = folder; | ||||
|                         }) | ||||
|                     } | ||||
|                     folder.sortChildren(); | ||||
|                     folders.push(folder); | ||||
|                 }); | ||||
|             } | ||||
|             return folders; | ||||
|         } | ||||
|         function addClass(folder) { | ||||
|             switch (folder.folderNames.length) { | ||||
|                 case 3: | ||||
|                     folder.class = createClassName('storages'); | ||||
|                     break; | ||||
|                 case 4: | ||||
|                     folder.class = createClassName(folder.folderNames[1]); | ||||
|                     break; | ||||
|                 case 5: | ||||
|                     folder.class = createClassName('versions'); | ||||
|                     break; | ||||
|                 case 6: | ||||
|                     folder.class = createClassName(folder.folderNames[1] === 'applications' ? | ||||
|                         'revisions' : 'build-info'); | ||||
|                     break; | ||||
|             } | ||||
|         } | ||||
|         function createClassName(folderName) { | ||||
|             return 'entaxy-cicd-' + folderName + '-icon'; | ||||
|         } | ||||
|         EntaxyCICDTreeController.prototype.removeTree = function () { | ||||
|             var tree = $(entaxyCICDTreeElementId).treeview(true); | ||||
|             // There is no exposed API to check whether the tree has already been initialized, | ||||
|             // so let's just check if the methods are present | ||||
|             if (tree.clearSearch) { | ||||
|                 tree.clearSearch(); | ||||
|                 // Bootstrap tree view leaks the node elements into the data structure | ||||
|                 // so let's clean this up when the user leaves the view | ||||
|                 var cleanTreeFolder_1 = function (node) { | ||||
|                     delete node['$el']; | ||||
|                     if (node.nodes) | ||||
|                         node.nodes.forEach(cleanTreeFolder_1); | ||||
|                 }; | ||||
|                 cleanTreeFolder_1(this.workspace.tree); | ||||
|                 // Then call the tree clean-up method | ||||
|                 tree.remove(); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|     EntaxyCICDTreeController.$inject = ['$scope', '$location', 'workspace', '$element', 'operationsService', '$q']; | ||||
|  | ||||
| })(EntaxyCICD || (EntaxyCICD = {})); | ||||
| @@ -0,0 +1,155 @@ | ||||
| /*- | ||||
|  * ~~~~~~licensing~~~~~~ | ||||
|  * entaxy-cicd-plugin | ||||
|  * ========== | ||||
|  * Copyright (C) 2020 - 2025 EmDev LLC | ||||
|  * ========== | ||||
|  * You may not use this file except in accordance with the License Terms of the Copyright | ||||
|  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property | ||||
|  * rights to the Software and any copies are the property of the Copyright Holder. Unless | ||||
|  * it is explicitly allowed the Copyright Holder, the User is prohibited from using the | ||||
|  * Software for commercial purposes to provide services to third parties. | ||||
|  *  | ||||
|  * The Copyright Holder hereby declares that the Software is provided on an "AS IS". | ||||
|  * Under no circumstances does the Copyright Holder guarantee or promise that the | ||||
|  * Software provided by him will be suitable or not suitable for the specific purposes | ||||
|  * of the User, that the Software will meet all commercial and personal subjective | ||||
|  * expectations of the User, that the Software will work properly, without technical | ||||
|  * errors, quickly and uninterruptedly. | ||||
|  *  | ||||
|  * Under no circumstances shall the Copyright Holder or its Affiliates is not liable | ||||
|  * to the User for any direct or indirect losses of the User, his expenses or actual | ||||
|  * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss | ||||
|  * or damage to data, property, etc. | ||||
|  * ~~~~~~/licensing~~~~~~ | ||||
|  */ | ||||
|  | ||||
| var EntaxyCICD; | ||||
| (function (EntaxyCICD) { | ||||
|  | ||||
|     const REVISION_STATUS = { | ||||
|         CONFIGURED: 'CONFIGURED', | ||||
|         DEPLOYED: 'DEPLOYED', | ||||
|         INSTALLED: 'INSTALLED', | ||||
|         UNINSTALLED: 'UNINSTALLED' | ||||
|     } | ||||
|     EntaxyCICD.REVISION_STATUS = REVISION_STATUS; | ||||
|  | ||||
|     const ITEM_TYPE = { | ||||
|         APPLICATION: 'Application', | ||||
|         PROJECT: 'Project', | ||||
|         VERSION: 'Version' | ||||
|     } | ||||
|     EntaxyCICD.ITEM_TYPE = ITEM_TYPE; | ||||
|  | ||||
|     function isStorage(selection) { | ||||
|         return selection.folderNames && selection.folderNames.length === 3; | ||||
|     } | ||||
|     EntaxyCICD.isStorage = isStorage; | ||||
|  | ||||
|     function getStorage(selection) { | ||||
|         if (selection.folderNames) { | ||||
|             switch (selection.folderNames.length) { | ||||
|                 case 3: | ||||
|                     return selection.title; | ||||
|                 case 4: | ||||
|                     return selection.parent.title; | ||||
|                 case 5: | ||||
|                     return selection.parent.parent.title; | ||||
|                 case 6: | ||||
|                     return selection.parent.parent.parent.title; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|     EntaxyCICD.getStorage = getStorage; | ||||
|  | ||||
|     function getStorages(selection) { | ||||
|         return selection.children && selection.children.length > 0 ? selection.children.map(child => child.title) : []; | ||||
|     } | ||||
|     EntaxyCICD.getStorages = getStorages; | ||||
|  | ||||
|     function getProjectOrApplication(selection) { | ||||
|         if (selection.folderNames) { | ||||
|             switch (selection.folderNames.length) { | ||||
|                 case 4: | ||||
|                     return selection.title; | ||||
|                 case 5: | ||||
|                     return selection.parent.title; | ||||
|                 case 6: | ||||
|                     return selection.parent.parent.title; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|     EntaxyCICD.getProjectOrApplication = getProjectOrApplication; | ||||
|  | ||||
|     function isVersion(selection) { | ||||
|         return selection.folderNames && selection.folderNames.length === 5; | ||||
|     } | ||||
|     EntaxyCICD.isVersion = isVersion; | ||||
|  | ||||
|     function getVersion(selection) { | ||||
|         if (selection.folderNames) { | ||||
|             switch (selection.folderNames.length) { | ||||
|                 case 5: | ||||
|                     return selection.title; | ||||
|                 case 6: | ||||
|                     return selection.parent.title; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|     EntaxyCICD.getVersion = getVersion; | ||||
|  | ||||
|     function getVersions(selection) { | ||||
|         return selection.children && selection.children.length > 0 ? selection.children.map(child => child.title) : []; | ||||
|     } | ||||
|     EntaxyCICD.getVersions = getVersions; | ||||
|  | ||||
|     function isRevision(selection) { | ||||
|         return selection.folderNames && selection.folderNames.length === 6; | ||||
|     } | ||||
|     EntaxyCICD.isRevision = isRevision; | ||||
|  | ||||
|     function getRevisionInfo(selection) { | ||||
|         let splitTitle = selection.title.split(' '); | ||||
|         return { | ||||
|             revision: splitTitle[0], | ||||
|             revisionStatus: splitTitle[1].replace(/\[|]/g, '') | ||||
|         }; | ||||
|     } | ||||
|     EntaxyCICD.getRevisionInfo = getRevisionInfo; | ||||
|  | ||||
|     function getStatusTemplate(value) { | ||||
|         if (value) { | ||||
|             return '<span class="pficon pficon-ok"></span>' | ||||
|         } else { | ||||
|             return '<span class="pficon pficon-error-circle-o blue"></span>'; | ||||
|         } | ||||
|     } | ||||
|     EntaxyCICD.getStatusTemplate = getStatusTemplate; | ||||
|  | ||||
|     function capitalize(string) { | ||||
|         return string.charAt(0).toUpperCase() + string.slice(1); | ||||
|     } | ||||
|     EntaxyCICD.capitalize = capitalize; | ||||
|  | ||||
|     function createTableFromUnremovedItems(unremovedItemsInfo) { | ||||
|         let tableHtml = `<table class="entaxy-cicd-unremoved-info-table">`; | ||||
|         tableHtml += ` | ||||
|             <tr> | ||||
|                 <th>Item</th> | ||||
|                 <th>Required By</th> | ||||
|             </tr> | ||||
|         `; | ||||
|         Object.entries(unremovedItemsInfo).forEach(([itemId, listRequiredBy]) => { | ||||
|             tableHtml += `<tr><td>` + itemId + `</td><td>`; | ||||
|             listRequiredBy.forEach(requiredBy => { | ||||
|                 tableHtml += requiredBy + '\n'; | ||||
|             }); | ||||
|             tableHtml += `</td></tr>`; | ||||
|         }); | ||||
|         tableHtml += `</table>`; | ||||
|         return tableHtml; | ||||
|     } | ||||
|     EntaxyCICD.createTableFromUnremovedItems = createTableFromUnremovedItems; | ||||
|  | ||||
| })(EntaxyCICD || (EntaxyCICD = {})); | ||||
| @@ -0,0 +1,93 @@ | ||||
| /*- | ||||
|  * ~~~~~~licensing~~~~~~ | ||||
|  * entaxy-management-plugin | ||||
|  * ========== | ||||
|  * Copyright (C) 2020 - 2025 EmDev LLC | ||||
|  * ========== | ||||
|  * You may not use this file except in accordance with the License Terms of the Copyright | ||||
|  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property | ||||
|  * rights to the Software and any copies are the property of the Copyright Holder. Unless | ||||
|  * it is explicitly allowed the Copyright Holder, the User is prohibited from using the | ||||
|  * Software for commercial purposes to provide services to third parties. | ||||
|  *  | ||||
|  * The Copyright Holder hereby declares that the Software is provided on an "AS IS". | ||||
|  * Under no circumstances does the Copyright Holder guarantee or promise that the | ||||
|  * Software provided by him will be suitable or not suitable for the specific purposes | ||||
|  * of the User, that the Software will meet all commercial and personal subjective | ||||
|  * expectations of the User, that the Software will work properly, without technical | ||||
|  * errors, quickly and uninterruptedly. | ||||
|  *  | ||||
|  * Under no circumstances shall the Copyright Holder or its Affiliates is not liable | ||||
|  * to the User for any direct or indirect losses of the User, his expenses or actual | ||||
|  * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss | ||||
|  * or damage to data, property, etc. | ||||
|  * ~~~~~~/licensing~~~~~~ | ||||
|  */ | ||||
| /** | ||||
|  * The main entry point for the Simple module | ||||
|  */ | ||||
| var EntaxyCICD = (function (EntaxyCICD) { | ||||
|  | ||||
|     /** | ||||
|      * The name of this plugin | ||||
|      */ | ||||
|     EntaxyCICD.pluginName = 'entaxy-cicd'; | ||||
|  | ||||
|     /** | ||||
|      * This plugin's logger instance | ||||
|      */ | ||||
|     EntaxyCICD.log = Logger.get('entaxy-cicd'); | ||||
|  | ||||
|     /** | ||||
|      * The top level path of this plugin on the server | ||||
|      */ | ||||
|     EntaxyCICD.contextPath = "/entaxy-cicd/"; | ||||
|  | ||||
|     EntaxyCICD.log.info("loading entaxy cicd plugin") | ||||
|     EntaxyCICD._module = angular.module(EntaxyCICD.pluginName, [ | ||||
|         'angularResizable' | ||||
|     ]) | ||||
|     .component('entaxyCiCd', { | ||||
|         template: | ||||
|         ` | ||||
|             <div class="tree-nav-layout"> | ||||
|                 <div class="sidebar-pf sidebar-pf-left" resizable r-directions="['right']"> | ||||
|                   <entaxy-ci-cd-tree-header></entaxy-ci-cd-tree-header> | ||||
|                   <entaxy-ci-cd-tree></entaxy-ci-cd-tree> | ||||
|                 </div> | ||||
|                 <div class="tree-nav-main"> | ||||
|                   <entaxy-ci-cd-navigation></entaxy-ci-cd-navigation> | ||||
|                   <entaxy-ci-cd-contents></entaxy-ci-cd-contents> | ||||
|                 </div> | ||||
|            </div> | ||||
|         ` | ||||
|     }) | ||||
|     .run(configurePlugin); | ||||
|  | ||||
|     function configurePlugin(mainNavService, workspace, helpRegistry, preferencesRegistry, localStorage) { | ||||
|  | ||||
|         var entaxyCICDJmxDomain = localStorage['entaxyCICDJmxDomain'] || "ru.entaxy.cicd"; | ||||
|         mainNavService.addItem({ | ||||
|             title: 'Entaxy CI/CD', | ||||
|             basePath: '/entaxy-cicd', | ||||
|             template: '<entaxy-ci-cd></entaxy-ci-cd>', | ||||
|             isValid: function () { return workspace.treeContainsDomainAndProperties(entaxyCICDJmxDomain); }, | ||||
|             rank: 2 | ||||
|         }); | ||||
|  | ||||
|         // clean up local storage upon logout | ||||
|         /*        preLogoutTasks.addTask('CleanupArtemisCredentials', function () { | ||||
|                     Artemis.log.debug("Clean up Artemis credentials in local storage"); | ||||
|                     localStorage.removeItem('artemisUserName'); | ||||
|                     localStorage.removeItem('artemisPassword'); | ||||
|                 }); */ | ||||
|     } | ||||
|     configurePlugin.$inject = ['mainNavService', 'workspace', 'helpRegistry', 'preferencesRegistry', 'localStorage']; | ||||
|  | ||||
|     return EntaxyCICD; | ||||
|  | ||||
| })(EntaxyCICD || {}); | ||||
|  | ||||
| // tell the Hawtio plugin loader about our plugin so it can be | ||||
| // bootstrapped with the rest of AngularJS | ||||
| hawtioPluginLoader.addModule(EntaxyCICD.pluginName); | ||||
| @@ -0,0 +1,125 @@ | ||||
| /*- | ||||
|  * ~~~~~~licensing~~~~~~ | ||||
|  * entaxy-cicd-plugin | ||||
|  * ========== | ||||
|  * Copyright (C) 2020 - 2025 EmDev LLC | ||||
|  * ========== | ||||
|  * You may not use this file except in accordance with the License Terms of the Copyright | ||||
|  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property | ||||
|  * rights to the Software and any copies are the property of the Copyright Holder. Unless | ||||
|  * it is explicitly allowed the Copyright Holder, the User is prohibited from using the | ||||
|  * Software for commercial purposes to provide services to third parties. | ||||
|  *  | ||||
|  * The Copyright Holder hereby declares that the Software is provided on an "AS IS". | ||||
|  * Under no circumstances does the Copyright Holder guarantee or promise that the | ||||
|  * Software provided by him will be suitable or not suitable for the specific purposes | ||||
|  * of the User, that the Software will meet all commercial and personal subjective | ||||
|  * expectations of the User, that the Software will work properly, without technical | ||||
|  * errors, quickly and uninterruptedly. | ||||
|  *  | ||||
|  * Under no circumstances shall the Copyright Holder or its Affiliates is not liable | ||||
|  * to the User for any direct or indirect losses of the User, his expenses or actual | ||||
|  * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss | ||||
|  * or damage to data, property, etc. | ||||
|  * ~~~~~~/licensing~~~~~~ | ||||
|  */ | ||||
|  | ||||
| var EntaxyCICD; | ||||
| (function (EntaxyCICD) { | ||||
|     EntaxyCICD._module.factory('entaxyCICDService', ['$q', 'workspace', 'jolokia', 'jolokiaService', 'operationsService', | ||||
|         '$uibModal', 'entaxyService', | ||||
|         function($q, workspace, jolokia, jolokiaService, operationsService, $uibModal, entaxyService) { | ||||
|  | ||||
|             const entaxyCICDJmxDomain = localStorage['entaxyCICDJmxDomain'] || "ru.entaxy.cicd"; | ||||
|  | ||||
|             return { | ||||
|                 executeOperation: function (operationName, properties) { | ||||
|                     return executeOperation(operationName, properties); | ||||
|                 }, | ||||
|                 treeUpdated: function () { | ||||
|                     return treeUpdated(); | ||||
|                 }, | ||||
|                 setTypesToFilterConfig: function (filterFields) { | ||||
|                     return setValuesToFilterConfig(filterFields, 'type', 'readApplicationItemTypes'); | ||||
|                 }, | ||||
|                 setScopesToFilterConfig: function (filterFields) { | ||||
|                     return setValuesToFilterConfig(filterFields, 'scope', 'readApplicationItemScopes'); | ||||
|                 }, | ||||
|                 removeItemWithConfirmation: function (itemType, itemName, properties, updateSelectionNode, message) { | ||||
|                     return removeItemWithConfirmation(itemType, itemName, properties, updateSelectionNode, message); | ||||
|                 } | ||||
|             }; | ||||
|  | ||||
|             function executeOperation(operationName, properties) { | ||||
|                 let mbeanName = getCICDMBeanName(); | ||||
|                 let operation = { name : operationName }; | ||||
|  | ||||
|                 if (mbeanName) { | ||||
|                     return operationsService.executeOperation(mbeanName, operation, properties); | ||||
|                 } else { | ||||
|                     return $q.reject("Cannot find mbean for CI/CD"); | ||||
|                 } | ||||
|             } | ||||
|  | ||||
|             function treeUpdated () { | ||||
|                 let rootScope = workspace.$rootScope; | ||||
|                 if (rootScope) { | ||||
|                     Core.$apply(rootScope); | ||||
|                     rootScope.$broadcast(Jmx.TreeEvent.Updated, { updateSelectionNode: true }); | ||||
|                 } | ||||
|             } | ||||
|  | ||||
|             function setValuesToFilterConfig(filterFields, fieldId, operationName) { | ||||
|                 let mbean = workspace.findMBeanWithProperties(entaxyCICDJmxDomain, { module: 'applications' }); | ||||
|                 let operation = { name: operationName }; | ||||
|  | ||||
|                 operationsService.executeOperation(mbean.objectName, operation, []) | ||||
|                 .then(result => { | ||||
|                     let toolbarConfigTypeField = filterFields.find(field => field.id === fieldId); | ||||
|                     toolbarConfigTypeField.filterValues = JSON.parse(result); | ||||
|                 }); | ||||
|             } | ||||
|  | ||||
|             function removeItemWithConfirmation(itemType, itemName, properties, updateSelectionNode, message) { | ||||
|                 let title = 'Confirm Removing'; | ||||
|                 if (!message) { | ||||
|                     message = 'Do you want to remove the ' + itemType.toLowerCase() + ' ' + itemName + '?'; | ||||
|                 } | ||||
|  | ||||
|                 entaxyService.openConfirmationWindow(title, message).then(() => { | ||||
|                     executeOperation('remove' + itemType, properties) | ||||
|                     .then(result => { | ||||
|                         Entaxy.notificationSuccess(result); | ||||
|                         if (updateSelectionNode) { | ||||
|                             treeUpdated(); | ||||
|                         } else { | ||||
|                             workspace.jmxTreeUpdated(); | ||||
|                         } | ||||
|                     }) | ||||
|                     .catch(error => { | ||||
|                         Entaxy.notificationError(error); | ||||
|                         EntaxyCICD.log.error(error); | ||||
|                     }); | ||||
|                 }); | ||||
|             } | ||||
|  | ||||
|             function getCICDMBeanName() { | ||||
|                 if (!workspace.hasDomainAndProperties(entaxyCICDJmxDomain)) { | ||||
|                     return; | ||||
|                 } | ||||
|  | ||||
|                 let tree = workspace.tree; | ||||
|                 if (tree) { | ||||
|                     let domain = tree.get(entaxyCICDJmxDomain); | ||||
|                     if (domain && domain.children) { | ||||
|                         for (let i = 0; i < domain.children.length; i++) { | ||||
|                             if (domain.children[i].folderNames[1] === workspace.selection.folderNames[1]) { | ||||
|                                 return domain.children[i].objectName; | ||||
|                             } | ||||
|                         } | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|     ]) | ||||
| })(EntaxyCICD || (EntaxyCICD = {})); | ||||
| @@ -3,7 +3,7 @@ | ||||
|   <parent> | ||||
|     <groupId>ru.entaxy.esb.ui</groupId> | ||||
|     <artifactId>entaxy-hawtio</artifactId> | ||||
|     <version>1.10.0</version> | ||||
|     <version>1.11.0</version> | ||||
|   </parent> | ||||
|   <groupId>ru.entaxy.esb.ui.hawtio</groupId> | ||||
|   <artifactId>entaxy-h2-plugin</artifactId> | ||||
|   | ||||
| @@ -2,7 +2,7 @@ | ||||
|  * ~~~~~~licensing~~~~~~ | ||||
|  * entaxy-management-plugin | ||||
|  * ========== | ||||
|  * Copyright (C) 2020 - 2024 EmDev LLC | ||||
|  * Copyright (C) 2020 - 2025 EmDev LLC | ||||
|  * ========== | ||||
|  * You may not use this file except in accordance with the License Terms of the Copyright | ||||
|  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property | ||||
|   | ||||
| @@ -3,7 +3,7 @@ | ||||
|   ~~~~~~licensing~~~~~~ | ||||
|   entaxy-management-plugin | ||||
|   ========== | ||||
|   Copyright (C) 2020 - 2024 EmDev LLC | ||||
|   Copyright (C) 2020 - 2025 EmDev LLC | ||||
|   ========== | ||||
|   You may not use this file except in accordance with the License Terms of the Copyright | ||||
|   Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property | ||||
|   | ||||
| @@ -3,7 +3,7 @@ | ||||
|   ~~~~~~licensing~~~~~~ | ||||
|   entaxy-management-plugin | ||||
|   ========== | ||||
|   Copyright (C) 2020 - 2024 EmDev LLC | ||||
|   Copyright (C) 2020 - 2025 EmDev LLC | ||||
|   ========== | ||||
|   You may not use this file except in accordance with the License Terms of the Copyright | ||||
|   Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property | ||||
|   | ||||
| @@ -2,7 +2,7 @@ | ||||
|   ~~~~~~licensing~~~~~~ | ||||
|   entaxy-management-plugin | ||||
|   ========== | ||||
|   Copyright (C) 2020 - 2024 EmDev LLC | ||||
|   Copyright (C) 2020 - 2025 EmDev LLC | ||||
|   ========== | ||||
|   You may not use this file except in accordance with the License Terms of the Copyright | ||||
|   Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property | ||||
|   | ||||
| @@ -2,7 +2,7 @@ | ||||
|   ~~~~~~licensing~~~~~~ | ||||
|   entaxy-management-plugin | ||||
|   ========== | ||||
|   Copyright (C) 2020 - 2024 EmDev LLC | ||||
|   Copyright (C) 2020 - 2025 EmDev LLC | ||||
|   ========== | ||||
|   You may not use this file except in accordance with the License Terms of the Copyright | ||||
|   Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property | ||||
|   | ||||
| @@ -2,7 +2,7 @@ | ||||
|   ~~~~~~licensing~~~~~~ | ||||
|   entaxy-management-plugin | ||||
|   ========== | ||||
|   Copyright (C) 2020 - 2024 EmDev LLC | ||||
|   Copyright (C) 2020 - 2025 EmDev LLC | ||||
|   ========== | ||||
|   You may not use this file except in accordance with the License Terms of the Copyright | ||||
|   Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property | ||||
|   | ||||
| @@ -2,7 +2,7 @@ | ||||
|  * ~~~~~~licensing~~~~~~ | ||||
|  * entaxy-h2-plugin | ||||
|  * ========== | ||||
|  * Copyright (C) 2020 - 2024 EmDev LLC | ||||
|  * Copyright (C) 2020 - 2025 EmDev LLC | ||||
|  * ========== | ||||
|  * You may not use this file except in accordance with the License Terms of the Copyright | ||||
|  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property | ||||
|   | ||||
| @@ -2,7 +2,7 @@ | ||||
|  * ~~~~~~licensing~~~~~~ | ||||
|  * entaxy-management-plugin | ||||
|  * ========== | ||||
|  * Copyright (C) 2020 - 2024 EmDev LLC | ||||
|  * Copyright (C) 2020 - 2025 EmDev LLC | ||||
|  * ========== | ||||
|  * You may not use this file except in accordance with the License Terms of the Copyright | ||||
|  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property | ||||
|   | ||||
| @@ -2,7 +2,7 @@ | ||||
|  * ~~~~~~licensing~~~~~~ | ||||
|  * entaxy-management-plugin | ||||
|  * ========== | ||||
|  * Copyright (C) 2020 - 2024 EmDev LLC | ||||
|  * Copyright (C) 2020 - 2025 EmDev LLC | ||||
|  * ========== | ||||
|  * You may not use this file except in accordance with the License Terms of the Copyright | ||||
|  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property | ||||
|   | ||||
| @@ -2,7 +2,7 @@ | ||||
|  * ~~~~~~licensing~~~~~~ | ||||
|  * entaxy-management-plugin | ||||
|  * ========== | ||||
|  * Copyright (C) 2020 - 2024 EmDev LLC | ||||
|  * Copyright (C) 2020 - 2025 EmDev LLC | ||||
|  * ========== | ||||
|  * You may not use this file except in accordance with the License Terms of the Copyright | ||||
|  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property | ||||
|   | ||||
| @@ -3,7 +3,7 @@ | ||||
|   <parent> | ||||
|     <groupId>ru.entaxy.esb.ui</groupId> | ||||
|     <artifactId>entaxy-hawtio</artifactId> | ||||
|     <version>1.10.0</version> | ||||
|     <version>1.11.0</version> | ||||
|   </parent> | ||||
|   <groupId>ru.entaxy.esb.ui.hawtio</groupId> | ||||
|   <artifactId>entaxy-management-plugin</artifactId> | ||||
|   | ||||
| @@ -2,7 +2,7 @@ | ||||
|  * ~~~~~~licensing~~~~~~ | ||||
|  * entaxy-management-plugin | ||||
|  * ========== | ||||
|  * Copyright (C) 2020 - 2024 EmDev LLC | ||||
|  * Copyright (C) 2020 - 2025 EmDev LLC | ||||
|  * ========== | ||||
|  * You may not use this file except in accordance with the License Terms of the Copyright | ||||
|  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property | ||||
|   | ||||