client, explorer: Rearrange/add tx screen columns

This commit is contained in:
Andras Slemmer 2016-09-12 13:42:31 +01:00
parent 041c33a167
commit 01d879772d
4 changed files with 60 additions and 44 deletions

View File

@ -16,8 +16,8 @@ import java.util.UUID
interface GatheredTransactionData { interface GatheredTransactionData {
val fiberId: ObservableValue<Long?> val fiberId: ObservableValue<Long?>
val uuid: ObservableValue<UUID?> val uuid: ObservableValue<UUID?>
val protocolName: ObservableValue<String?>
val protocolStatus: ObservableValue<ProtocolStatus?> val protocolStatus: ObservableValue<ProtocolStatus?>
val stateMachineStatus: ObservableValue<StateMachineStatus?>
val transaction: ObservableValue<LedgerTransaction?> val transaction: ObservableValue<LedgerTransaction?>
val status: ObservableValue<TransactionCreateStatus?> val status: ObservableValue<TransactionCreateStatus?>
val lastUpdate: ObservableValue<Instant> val lastUpdate: ObservableValue<Instant>
@ -30,17 +30,19 @@ sealed class TransactionCreateStatus(val message: String?) {
override fun toString(): String = message ?: javaClass.simpleName override fun toString(): String = message ?: javaClass.simpleName
} }
sealed class ProtocolStatus(val status: String?) { data class ProtocolStatus(
object Added: ProtocolStatus(null) val status: String
object Removed: ProtocolStatus(null) )
class InProgress(status: String): ProtocolStatus(status) sealed class StateMachineStatus(val stateMachineName: String) {
override fun toString(): String = status ?: javaClass.simpleName class Added(stateMachineName: String): StateMachineStatus(stateMachineName)
class Removed(stateMachineName: String): StateMachineStatus(stateMachineName)
override fun toString(): String = "${javaClass.simpleName}($stateMachineName)"
} }
data class GatheredTransactionDataWritable( data class GatheredTransactionDataWritable(
override val fiberId: SimpleObjectProperty<Long?> = SimpleObjectProperty(null), override val fiberId: SimpleObjectProperty<Long?> = SimpleObjectProperty(null),
override val uuid: SimpleObjectProperty<UUID?> = SimpleObjectProperty(null), override val uuid: SimpleObjectProperty<UUID?> = SimpleObjectProperty(null),
override val protocolName: SimpleObjectProperty<String?> = SimpleObjectProperty(null), override val stateMachineStatus: SimpleObjectProperty<StateMachineStatus?> = SimpleObjectProperty(null),
override val protocolStatus: SimpleObjectProperty<ProtocolStatus?> = SimpleObjectProperty(null), override val protocolStatus: SimpleObjectProperty<ProtocolStatus?> = SimpleObjectProperty(null),
override val transaction: SimpleObjectProperty<LedgerTransaction?> = SimpleObjectProperty(null), override val transaction: SimpleObjectProperty<LedgerTransaction?> = SimpleObjectProperty(null),
override val status: SimpleObjectProperty<TransactionCreateStatus?> = SimpleObjectProperty(null), override val status: SimpleObjectProperty<TransactionCreateStatus?> = SimpleObjectProperty(null),
@ -81,10 +83,9 @@ class GatheredTransactionDataModel {
fiberId = serviceToClientEvent.fiberId, fiberId = serviceToClientEvent.fiberId,
lastUpdate = serviceToClientEvent.time, lastUpdate = serviceToClientEvent.time,
tweak = { tweak = {
protocolName.set(serviceToClientEvent.label) stateMachineStatus.set(when (serviceToClientEvent.addOrRemove) {
protocolStatus.set(when (serviceToClientEvent.addOrRemove) { AddOrRemove.ADD -> StateMachineStatus.Added(serviceToClientEvent.label)
AddOrRemove.ADD -> ProtocolStatus.Added AddOrRemove.REMOVE -> StateMachineStatus.Removed(serviceToClientEvent.label)
AddOrRemove.REMOVE -> ProtocolStatus.Removed
}) })
} }
) )
@ -94,7 +95,7 @@ class GatheredTransactionDataModel {
fiberId = serviceToClientEvent.fiberId, fiberId = serviceToClientEvent.fiberId,
lastUpdate = serviceToClientEvent.time, lastUpdate = serviceToClientEvent.time,
tweak = { tweak = {
protocolStatus.set(ProtocolStatus.InProgress(serviceToClientEvent.message)) protocolStatus.set(ProtocolStatus(serviceToClientEvent.message))
} }
) )
} }

View File

@ -6,7 +6,6 @@ import com.r3corda.contracts.asset.Cash
import com.r3corda.core.contracts.Amount import com.r3corda.core.contracts.Amount
import com.r3corda.core.contracts.CommandData import com.r3corda.core.contracts.CommandData
import com.r3corda.core.contracts.withoutIssuer import com.r3corda.core.contracts.withoutIssuer
import com.r3corda.core.transactions.SignedTransaction
import com.r3corda.core.contracts.* import com.r3corda.core.contracts.*
import com.r3corda.core.crypto.Party import com.r3corda.core.crypto.Party
import com.r3corda.core.crypto.toStringShort import com.r3corda.core.crypto.toStringShort
@ -46,10 +45,11 @@ class TransactionViewer: View() {
// Top half (transactions table) // Top half (transactions table)
private val transactionViewTable: TableView<ViewerNode> by fxid("TransactionViewTable") private val transactionViewTable: TableView<ViewerNode> by fxid("TransactionViewTable")
private val transactionViewTransactionId: TableColumn<ViewerNode, String> by fxid("TransactionViewTransactionId") private val transactionViewFiberId: TableColumn<ViewerNode, String> by fxid("TransactionViewFiberId")
private val transactionViewOriginator: TableColumn<ViewerNode, String> by fxid("TransactionViewOriginator") private val transactionViewClientUuid: TableColumn<ViewerNode, String> by fxid("TransactionViewClientUuid")
private val transactionViewTransactionStatus: TableColumn<ViewerNode, Pair<TransactionCreateStatus?, ProtocolStatus?>> by fxid("TransactionViewTransactionStatus") private val transactionViewTransactionStatus: TableColumn<ViewerNode, TransactionCreateStatus?> by fxid("TransactionViewTransactionStatus")
private val transactionViewStatusUpdated: TableColumn<ViewerNode, Instant> by fxid("TransactionViewStatusUpdated") private val transactionViewProtocolStatus: TableColumn<ViewerNode, String> by fxid("TransactionViewProtocolStatus")
private val transactionViewStateMachineStatus: TableColumn<ViewerNode, StateMachineStatus?> by fxid("TransactionViewStateMachineStatus")
private val transactionViewCommandTypes: TableColumn<ViewerNode, String> by fxid("TransactionViewCommandTypes") private val transactionViewCommandTypes: TableColumn<ViewerNode, String> by fxid("TransactionViewCommandTypes")
private val transactionViewTotalValueEquiv: TableColumn<ViewerNode, AmountDiff<Currency>> by fxid("TransactionViewTotalValueEquiv") private val transactionViewTotalValueEquiv: TableColumn<ViewerNode, AmountDiff<Currency>> by fxid("TransactionViewTotalValueEquiv")
@ -94,7 +94,9 @@ class TransactionViewer: View() {
data class ViewerNode( data class ViewerNode(
val transactionId: ObservableValue<Pair<Long?, UUID?>>, val transactionId: ObservableValue<Pair<Long?, UUID?>>,
val originator: ObservableValue<String>, val originator: ObservableValue<String>,
val transactionStatus: ObservableValue<Pair<TransactionCreateStatus?, ProtocolStatus?>>, val transactionStatus: ObservableValue<TransactionCreateStatus?>,
val stateMachineStatus: ObservableValue<StateMachineStatus?>,
val protocolStatus: ObservableValue<ProtocolStatus?>,
val statusUpdated: ObservableValue<Instant>, val statusUpdated: ObservableValue<Instant>,
val commandTypes: ObservableValue<Collection<Class<CommandData>>>, val commandTypes: ObservableValue<Collection<Class<CommandData>>>,
val totalValueEquiv: ObservableValue<AmountDiff<Currency>?>, val totalValueEquiv: ObservableValue<AmountDiff<Currency>?>,
@ -117,9 +119,9 @@ class TransactionViewer: View() {
"Us" "Us"
} }
}, },
transactionStatus = EasyBind.combine(it.status, it.protocolStatus) { status, protocolStatus -> transactionStatus = it.status,
Pair(status, protocolStatus) protocolStatus = it.protocolStatus,
}, stateMachineStatus = it.stateMachineStatus,
statusUpdated = it.lastUpdate, statusUpdated = it.lastUpdate,
commandTypes = EasyBind.map(it.transaction) { commandTypes = EasyBind.map(it.transaction) {
val commands = mutableSetOf<Class<CommandData>>() val commands = mutableSetOf<Class<CommandData>>()
@ -282,23 +284,15 @@ class TransactionViewer: View() {
Math.floor(tableWidthWithoutPaddingAndBorder.toDouble() / transactionViewTable.columns.size).toInt() Math.floor(tableWidthWithoutPaddingAndBorder.toDouble() / transactionViewTable.columns.size).toInt()
} }
transactionViewTransactionId.setCellValueFactory { transactionViewFiberId.setCellValueFactory { EasyBind.map (it.value.transactionId) { "${it.first ?: ""}" } }
EasyBind.map(it.value.transactionId) { transactionViewClientUuid.setCellValueFactory { EasyBind.map (it.value.transactionId) { "${it.second ?: ""}" } }
val (fiberId, uuid) = it transactionViewProtocolStatus.setCellValueFactory { EasyBind.map(it.value.protocolStatus) { "${it ?: ""}" } }
if (fiberId == null && uuid == null) {
"???"
} else {
(uuid?.toString() ?: "") + (fiberId?.let { "[$it]" } ?: "")
}
}
}
transactionViewOriginator.setCellValueFactory { it.value.originator }
transactionViewTransactionStatus.setCellValueFactory { it.value.transactionStatus } transactionViewTransactionStatus.setCellValueFactory { it.value.transactionStatus }
transactionViewTransactionStatus.setCellFactory { transactionViewTransactionStatus.setCellFactory {
object : TableCell<ViewerNode, Pair<TransactionCreateStatus?, ProtocolStatus?>>() { object : TableCell<ViewerNode, TransactionCreateStatus?>() {
val label = Label() val label = Label()
override fun updateItem( override fun updateItem(
value: Pair<TransactionCreateStatus?, ProtocolStatus?>?, value: TransactionCreateStatus?,
empty: Boolean empty: Boolean
) { ) {
super.updateItem(value, empty) super.updateItem(value, empty)
@ -307,23 +301,43 @@ class TransactionViewer: View() {
text = null text = null
} else { } else {
graphic = label graphic = label
val backgroundFill = when (value.first) { val backgroundFill = when (value) {
is TransactionCreateStatus.Started -> BackgroundFill(Color.TRANSPARENT, CornerRadii.EMPTY, Insets.EMPTY) is TransactionCreateStatus.Started -> BackgroundFill(Color.TRANSPARENT, CornerRadii.EMPTY, Insets.EMPTY)
is TransactionCreateStatus.Failed -> BackgroundFill(Color.SALMON, CornerRadii.EMPTY, Insets.EMPTY) is TransactionCreateStatus.Failed -> BackgroundFill(Color.SALMON, CornerRadii.EMPTY, Insets.EMPTY)
null -> BackgroundFill(Color.TRANSPARENT, CornerRadii.EMPTY, Insets.EMPTY) null -> BackgroundFill(Color.TRANSPARENT, CornerRadii.EMPTY, Insets.EMPTY)
} }
label.background = Background(backgroundFill) label.background = Background(backgroundFill)
label.text = if (value.first == null && value.second == null) { label.text = "$value"
"???"
} else {
(value.first?.toString() ?: "") + (value.second?.let { "[${it.toString()}]" } ?: "")
} }
} }
} }
} }
transactionViewStateMachineStatus.setCellValueFactory { it.value.stateMachineStatus }
transactionViewStateMachineStatus.setCellFactory {
object : TableCell<ViewerNode, StateMachineStatus?>() {
val label = Label()
override fun updateItem(
value: StateMachineStatus?,
empty: Boolean
) {
super.updateItem(value, empty)
if (value == null || empty) {
graphic = null
text = null
} else {
graphic = label
val backgroundFill = when (value) {
is StateMachineStatus.Added -> BackgroundFill(Color.LIGHTYELLOW, CornerRadii.EMPTY, Insets.EMPTY)
is StateMachineStatus.Removed -> BackgroundFill(Color.TRANSPARENT, CornerRadii.EMPTY, Insets.EMPTY)
null -> BackgroundFill(Color.TRANSPARENT, CornerRadii.EMPTY, Insets.EMPTY)
}
label.background = Background(backgroundFill)
label.text = "$value"
}
}
}
} }
transactionViewStatusUpdated.setCellValueFactory { it.value.statusUpdated }
transactionViewCommandTypes.setCellValueFactory { transactionViewCommandTypes.setCellValueFactory {
EasyBind.map(it.value.commandTypes) { it.map { it.simpleName }.joinToString(",") } EasyBind.map(it.value.commandTypes) { it.map { it.simpleName }.joinToString(",") }
} }

View File

@ -44,10 +44,11 @@
<items> <items>
<TableView fx:id="TransactionViewTable" prefHeight="200.0" prefWidth="200.0"> <TableView fx:id="TransactionViewTable" prefHeight="200.0" prefWidth="200.0">
<columns> <columns>
<TableColumn fx:id="TransactionViewTransactionId" prefWidth="187.0" text="Transaction ID" /> <TableColumn fx:id="TransactionViewFiberId" prefWidth="187.0" text="Fiber ID" />
<TableColumn fx:id="TransactionViewOriginator" prefWidth="174.0" text="Originator" /> <TableColumn fx:id="TransactionViewClientUuid" prefWidth="75.0" text="Client UUID" />
<TableColumn fx:id="TransactionViewTransactionStatus" prefWidth="75.0" text="Transaction status" /> <TableColumn fx:id="TransactionViewTransactionStatus" prefWidth="75.0" text="Transaction status" />
<TableColumn fx:id="TransactionViewStatusUpdated" prefWidth="75.0" text="Status updated" /> <TableColumn fx:id="TransactionViewProtocolStatus" prefWidth="75.0" text="Protocol status" />
<TableColumn fx:id="TransactionViewStateMachineStatus" prefWidth="75.0" text="SM Status" />
<TableColumn fx:id="TransactionViewCommandTypes" prefWidth="75.0" text="Command type(s)" /> <TableColumn fx:id="TransactionViewCommandTypes" prefWidth="75.0" text="Command type(s)" />
<TableColumn fx:id="TransactionViewTotalValueEquiv" prefWidth="75.0" styleClass="monetary-value" text="Total value (USD equiv)" /> <TableColumn fx:id="TransactionViewTotalValueEquiv" prefWidth="75.0" styleClass="monetary-value" text="Total value (USD equiv)" />
</columns> </columns>

View File

@ -26,7 +26,7 @@ sealed class ServiceToClientEvent(val time: Instant) {
val label: String, val label: String,
val addOrRemove: AddOrRemove val addOrRemove: AddOrRemove
) : ServiceToClientEvent(time) { ) : ServiceToClientEvent(time) {
override fun toString() = "StateMachine(${addOrRemove.name})" override fun toString() = "StateMachine($label, ${addOrRemove.name})"
} }
class Progress(time: Instant, val fiberId: Long, val message: String) : ServiceToClientEvent(time) { class Progress(time: Instant, val fiberId: Long, val message: String) : ServiceToClientEvent(time) {
override fun toString() = "Progress($message)" override fun toString() = "Progress($message)"