| <!-- |
| ~ Licensed to the Apache Software Foundation (ASF) under one or more |
| ~ contributor license agreements. See the NOTICE file distributed with |
| ~ this work for additional information regarding copyright ownership. |
| ~ The ASF licenses this file to You under the Apache License, Version 2.0 |
| ~ (the "License"); you may not use this file except in compliance with |
| ~ the License. You may obtain a copy of the License at |
| ~ |
| ~ http://www.apache.org/licenses/LICENSE-2.0 |
| ~ |
| ~ Unless required by applicable law or agreed to in writing, software |
| ~ distributed under the License is distributed on an "AS IS" BASIS, |
| ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| ~ See the License for the specific language governing permissions and |
| ~ limitations under the License. |
| --> |
| |
| <!DOCTYPE html> |
| <html xmlns:layout="http://www.w3.org/1999/xhtml" xmlns:th="http://www.w3.org/1999/xhtml" |
| layout:decorate="~{fragments/main_layout}"> |
| <head> |
| <title>Alpha Admin - Transactions Details</title> |
| </head> |
| <body> |
| <div layout:fragment="content" class="container-fluid"> |
| <h1 class="h3 mb-4 text-gray-800" th:text="'Transaction [' + ${globalTxId} + '] Details'"></h1> |
| <div class="row"> |
| <div class="col-xl-8 col-lg-7"> |
| <div class="card shadow mb-4"> |
| <div class="card-header py-3 d-flex flex-row align-items-center justify-content-between"> |
| <h6 class="m-0 font-weight-bold text-primary">Events</h6> |
| </div> |
| <div class="card-body"> |
| <div class="events" th:each="event,stat : ${events}"> |
| <div th:class="${event.type}=='TxAbortedEvent' or ${event.type}=='TxCompensateAckFailedEvent' or ${event.type}=='SagaAbortedEvent' ? 'row text-danger' : 'row'"> |
| <div class="col-xl-6 col-lg-6"> |
| <div><i class="fas fa-envelope"></i> <span th:class="${event.type}=='TxAbortedEvent' or ${event.type}=='TxCompensateAckFailedEvent' or ${event.type}=='SagaAbortedEvent' ? 'small text-danger' : 'small text-success'" th:text="${event.type}"></span></div> |
| <div><i class="fas fa-bell"></i> <span class="small" th:text="${event.serviceName} + '(' + ${event.instanceId} + ')'"></span></div> |
| <div><i class="fas fa-mars-stroke"></i> <span class="small" th:text="${event.parentTxId}"></span></div> |
| <div><i class="fas fa-transgender"></i> <span class="small" th:text="${event.localTxId}"></span></div> |
| </div> |
| <div class="col-xl-6 col-lg-6"> |
| <div><i class="fas fa-calendar"></i> <span class="small" th:text="${event.createTime}"></span></div> |
| <div th:if="${event.type}==SagaStartedEvent"><i class="fas fa-clock"></i> <span class="small" th:text="${event.timeout}+'ms'"></span></div> |
| <div th:if="${event.type}==TxStartedEvent"><i class="fas fa-undo"></i> <span class="small" th:text="${event.reverseRetries} + '(delay ' + ${event.retryDelayInMilliseconds} + 'ms, timeout ' + ${event.reverseTimeout} + 's)'"></span></div> |
| <div th:if="${event.type}==TxStartedEvent"><i class="fas fa-redo"></i> <span class="small" th:text="${event.forwardRetries} + '(delay ' + ${event.retryDelayInMilliseconds} + 'ms, timeout ' + ${event.forwardTimeout} + 's)'"></span></div> |
| <div th:if="${event.type}==TxStartedEvent or ${event.type}==TxAbortedEvent or ${event.type}==TxCompensateAckFailedEvent or ${event.type}=='SagaAbortedEvent'" class="position-absolute" style="bottom: 0px; right: 15px;"> |
| <i name="event_more" class="fas fa-caret-square-down" style="cursor:pointer" th:target="'div-more-'+${stat.index}"></i> |
| </div> |
| </div> |
| </div> |
| |
| <!-- TxStartedEvent more --> |
| <div th:id="'div-more-'+${stat.index}" th:if="${event.type}==TxStartedEvent" class="d-none" style="padding-top: 10px"> |
| <div class="card border-primary"> |
| <div class="card-header small border-primary bg-primary text-white">Compensation Method</div> |
| <div class="card-body"> |
| <span class="small" th:text="${event.compensationMethod}"></span> |
| </div> |
| </div> |
| </div> |
| |
| <!-- TxAbortedEvent more --> |
| <div th:id="'div-more-'+${stat.index}" th:if="${event.type}==TxAbortedEvent or ${event.type}==TxCompensateAckFailedEvent or ${event.type}==SagaAbortedEvent" class="d-none" style="padding-top: 10px"> |
| <div class="card border-danger"> |
| <div class="card-header small border-danger bg-danger text-white">Exception Stack</div> |
| <div class="card-body"> |
| <span class="small" style="white-space: pre-line" th:text="${event.exception}"></span> |
| </div> |
| </div> |
| </div> |
| <hr th:if="${!stat.last}"/> |
| </div> |
| <div class="events"> |
| <hr/> |
| <div th:if="${state}=='SUSPENDED'" class="row text-danger"> |
| <div class="col-xl-12 col-lg-12"> |
| <div><span class="small" th:text="'Suspended Type: ' + ${suspendedType} + ' - ' + ${endTime}"></span></div> |
| </div> |
| </div> |
| </div> |
| </div> |
| </div> |
| </div> |
| |
| <!-- Top Chart --> |
| <div class="col-xl-4 col-lg-5"> |
| <div class="card shadow mb-4"> |
| <div class="card-header py-3 d-flex flex-row align-items-center justify-content-between"> |
| <h6 class="m-0 font-weight-bold text-primary">Sub Transactions</h6> |
| </div> |
| <!-- Card Body --> |
| <div class="card-body"> |
| <div class="subTransactions" th:each="subTransaction, stat: ${subTransactions}"> |
| <div><i class="fas fa-transgender"></i> <span class="small" th:text="${subTransaction.localTxId}"></span></div> |
| <div><i class="fas fa-calendar"></i> <span class="small" th:text="${subTransaction.beginTime}"></span></div> |
| <div><i class="fas fa-calendar"></i> <span class="small" th:text="${subTransaction.endTime}"></span></div> |
| <div><i class="fas fa-bullhorn"></i> <span class="small" th:text="${subTransaction.state}"></span></div> |
| <div><i class="fas fa-clock"></i> <span class="small" th:text="${subTransaction.durationTime}+' ms'"></span></div> |
| <hr th:if="${!stat.last}"/> |
| </div> |
| </div> |
| </div> |
| </div> |
| </div> |
| </div> |
| <div layout:fragment="scripts"> |
| <script th:src="@{/js/alpha-transaction-details.js}"></script> |
| </div> |
| </body> |
| </html> |