Skip to content

Commit 314c0b3

Browse files
authored
Merge pull request #1366 from square/wenli/visualizer-ui-improvements
Workflow visualizer UI improvement
2 parents 286060d + aed9dab commit 314c0b3

File tree

12 files changed

+418
-135
lines changed

12 files changed

+418
-135
lines changed

workflow-trace-viewer/api/workflow-trace-viewer.api

Lines changed: 7 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -14,33 +14,13 @@ public final class com/squareup/workflow1/traceviewer/MainKt {
1414
public static synthetic fun main ([Ljava/lang/String;)V
1515
}
1616

17-
public final class com/squareup/workflow1/traceviewer/model/Node {
18-
public static final field $stable I
19-
public fun <init> (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/util/List;)V
20-
public synthetic fun <init> (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/util/List;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
21-
public fun equals (Ljava/lang/Object;)Z
22-
public final fun getChildren ()Ljava/util/List;
23-
public final fun getId ()Ljava/lang/String;
24-
public final fun getName ()Ljava/lang/String;
25-
public final fun getParent ()Ljava/lang/String;
26-
public final fun getParentId ()Ljava/lang/String;
27-
public final fun getProps ()Ljava/lang/Object;
28-
public final fun getRenderings ()Ljava/lang/Object;
29-
public final fun getState ()Ljava/lang/Object;
30-
public fun hashCode ()I
31-
public fun toString ()Ljava/lang/String;
32-
}
33-
34-
public final class com/squareup/workflow1/traceviewer/ui/FrameSelectTabKt {
35-
public static final fun FrameSelectTab (Ljava/util/List;ILkotlin/jvm/functions/Function1;Landroidx/compose/ui/Modifier;Landroidx/compose/runtime/Composer;II)V
36-
}
37-
38-
public final class com/squareup/workflow1/traceviewer/ui/WorkflowInfoPanelKt {
39-
public static final fun RightInfoPanel (Lcom/squareup/workflow1/traceviewer/model/Node;Landroidx/compose/ui/Modifier;Landroidx/compose/runtime/Composer;II)V
40-
}
41-
42-
public final class com/squareup/workflow1/traceviewer/ui/WorkflowTreeKt {
43-
public static final fun RenderDiagram (Lio/github/vinceglb/filekit/PlatformFile;ILkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Landroidx/compose/ui/Modifier;Landroidx/compose/runtime/Composer;II)V
17+
public final class com/squareup/workflow1/traceviewer/ui/ComposableSingletons$WorkflowInfoPanelKt {
18+
public static final field INSTANCE Lcom/squareup/workflow1/traceviewer/ui/ComposableSingletons$WorkflowInfoPanelKt;
19+
public static field lambda-1 Lkotlin/jvm/functions/Function3;
20+
public static field lambda-2 Lkotlin/jvm/functions/Function3;
21+
public fun <init> ()V
22+
public final fun getLambda-1$wf1_workflow_trace_viewer ()Lkotlin/jvm/functions/Function3;
23+
public final fun getLambda-2$wf1_workflow_trace_viewer ()Lkotlin/jvm/functions/Function3;
4424
}
4525

4626
public final class com/squareup/workflow1/traceviewer/util/ComposableSingletons$UploadFileKt {
@@ -52,26 +32,6 @@ public final class com/squareup/workflow1/traceviewer/util/ComposableSingletons$
5232

5333
public final class com/squareup/workflow1/traceviewer/util/JsonParserKt {
5434
public static final field ROOT_ID Ljava/lang/String;
55-
public static final fun parseTrace (Lio/github/vinceglb/filekit/PlatformFile;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
56-
}
57-
58-
public abstract interface class com/squareup/workflow1/traceviewer/util/ParseResult {
59-
}
60-
61-
public final class com/squareup/workflow1/traceviewer/util/ParseResult$Failure : com/squareup/workflow1/traceviewer/util/ParseResult {
62-
public static final field $stable I
63-
public fun <init> (Ljava/lang/Throwable;)V
64-
public final fun getError ()Ljava/lang/Throwable;
65-
}
66-
67-
public final class com/squareup/workflow1/traceviewer/util/ParseResult$Success : com/squareup/workflow1/traceviewer/util/ParseResult {
68-
public static final field $stable I
69-
public fun <init> (Ljava/util/List;)V
70-
public final fun getTrace ()Ljava/util/List;
71-
}
72-
73-
public final class com/squareup/workflow1/traceviewer/util/SandboxBackgroundKt {
74-
public static final fun SandboxBackground (Landroidx/compose/ui/Modifier;Lkotlin/jvm/functions/Function2;Landroidx/compose/runtime/Composer;II)V
7535
}
7636

7737
public final class com/squareup/workflow1/traceviewer/util/UploadFileKt {

workflow-trace-viewer/build.gradle.kts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,12 @@ kotlin {
2727
implementation(libs.filekit.dialogs.compose)
2828
}
2929
}
30+
jvmTest {
31+
dependencies {
32+
implementation(kotlin("test"))
33+
implementation(kotlin("test-junit5"))
34+
}
35+
}
3036
}
3137
}
3238

@@ -50,3 +56,7 @@ compose {
5056
}
5157
}
5258
}
59+
60+
tasks.named<Test>("jvmTest") {
61+
useJUnitPlatform()
62+
}

workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/App.kt

Lines changed: 36 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,19 @@ package com.squareup.workflow1.traceviewer
22

33
import androidx.compose.foundation.layout.Box
44
import androidx.compose.runtime.Composable
5+
import androidx.compose.runtime.LaunchedEffect
56
import androidx.compose.runtime.getValue
7+
import androidx.compose.runtime.mutableFloatStateOf
68
import androidx.compose.runtime.mutableIntStateOf
79
import androidx.compose.runtime.mutableStateOf
810
import androidx.compose.runtime.remember
911
import androidx.compose.runtime.setValue
12+
import androidx.compose.runtime.snapshotFlow
1013
import androidx.compose.ui.Alignment
1114
import androidx.compose.ui.Modifier
15+
import androidx.compose.ui.geometry.Offset
1216
import com.squareup.workflow1.traceviewer.model.Node
17+
import com.squareup.workflow1.traceviewer.model.NodeUpdate
1318
import com.squareup.workflow1.traceviewer.ui.FrameSelectTab
1419
import com.squareup.workflow1.traceviewer.ui.RenderDiagram
1520
import com.squareup.workflow1.traceviewer.ui.RightInfoPanel
@@ -25,21 +30,32 @@ public fun App(
2530
modifier: Modifier = Modifier
2631
) {
2732
var selectedTraceFile by remember { mutableStateOf<PlatformFile?>(null) }
28-
var selectedNode by remember { mutableStateOf<Node?>(null) }
33+
var selectedNode by remember { mutableStateOf<NodeUpdate?>(null) }
2934
var workflowFrames by remember { mutableStateOf<List<Node>>(emptyList()) }
3035
var frameIndex by remember { mutableIntStateOf(0) }
36+
val sandboxState = remember { SandboxState() }
37+
38+
LaunchedEffect(sandboxState) {
39+
snapshotFlow { frameIndex }.collect {
40+
sandboxState.reset()
41+
}
42+
}
3143

3244
Box(
3345
modifier = modifier
3446
) {
3547
// Main content
3648
if (selectedTraceFile != null) {
37-
SandboxBackground {
49+
SandboxBackground(
50+
sandboxState = sandboxState,
51+
) {
3852
RenderDiagram(
3953
traceFile = selectedTraceFile!!,
4054
frameInd = frameIndex,
4155
onFileParse = { workflowFrames = it },
42-
onNodeSelect = { selectedNode = it }
56+
onNodeSelect = { node, prevNode ->
57+
selectedNode = NodeUpdate(node, prevNode)
58+
}
4359
)
4460
}
4561
}
@@ -51,16 +67,31 @@ public fun App(
5167
modifier = Modifier.align(Alignment.TopCenter)
5268
)
5369

54-
RightInfoPanel(selectedNode)
70+
RightInfoPanel(
71+
selectedNode = selectedNode,
72+
modifier = Modifier
73+
.align(Alignment.TopEnd)
74+
)
5575

5676
// The states are reset when a new file is selected.
5777
UploadFile(
58-
onFileSelect = {
78+
resetOnFileSelect = {
5979
selectedTraceFile = it
6080
selectedNode = null
6181
frameIndex = 0
82+
workflowFrames = emptyList()
6283
},
6384
modifier = Modifier.align(Alignment.BottomStart)
6485
)
6586
}
6687
}
88+
89+
internal class SandboxState {
90+
var offset by mutableStateOf(Offset.Zero)
91+
var scale by mutableFloatStateOf(1f)
92+
93+
fun reset() {
94+
offset = Offset.Zero
95+
scale = 1f
96+
}
97+
}

workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/model/Node.kt

Lines changed: 32 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,26 +7,52 @@ package com.squareup.workflow1.traceviewer.model
77
*
88
* TBD what more metadata should be involved with each node, e.g. (props, states, # of render passes)
99
*/
10-
public class Node(
10+
internal data class Node(
1111
val name: String,
1212
val id: String,
1313
val parent: String,
1414
val parentId: String,
15-
val props: Any? = null,
16-
val state: Any? = null,
17-
val renderings: Any? = null,
18-
val children: List<Node>,
15+
val props: String,
16+
val state: String,
17+
val rendering: String = "",
18+
@Transient val children: LinkedHashMap<String, Node> = LinkedHashMap()
1919
) {
20+
2021
override fun toString(): String {
21-
return "Node(name='$name', parent='$parent', children=${children.size})"
22+
return "Node(name='$name', parent='$parent', children=$children)"
2223
}
2324

2425
override fun equals(other: Any?): Boolean {
2526
if (this === other) return true
2627
if (other !is Node) return false
2728
return this.id == other.id
2829
}
30+
2931
override fun hashCode(): Int {
3032
return id.hashCode()
3133
}
34+
35+
companion object {
36+
fun getNodeField(node: Node, field: String): String {
37+
return when (field.lowercase()) {
38+
"name" -> node.name
39+
"id" -> node.id
40+
"parent" -> node.parent
41+
"parentid" -> node.parentId
42+
"props" -> node.props
43+
"state" -> node.state
44+
"rendering" -> node.rendering
45+
"children" -> node.children.toString()
46+
else -> throw IllegalArgumentException("Unknown field: $field")
47+
}
48+
}
49+
}
50+
}
51+
52+
internal fun Node.addChild(child: Node): Node {
53+
return copy(children = LinkedHashMap(this.children.plus(child.id to child)))
54+
}
55+
56+
internal fun Node.replaceChild(child: Node): Node {
57+
return addChild(child)
3258
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package com.squareup.workflow1.traceviewer.model
2+
3+
/**
4+
* Represents the difference between the current and previous state of a node in the workflow trace.
5+
* This will be what is passed as a state between UI to display the diff.
6+
*
7+
* If it's the first node in the frame, [previous] will be null and there is no difference to show.
8+
*/
9+
internal class NodeUpdate(
10+
val current: Node,
11+
val previous: Node?,
12+
)

workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/FrameSelectTab.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ import com.squareup.workflow1.traceviewer.model.Node
1818
* A trace tab selector that allows devs to switch between different states within the provided trace.
1919
*/
2020
@Composable
21-
public fun FrameSelectTab(
21+
internal fun FrameSelectTab(
2222
frames: List<Node>,
2323
currentIndex: Int,
2424
onIndexChange: (Int) -> Unit,

0 commit comments

Comments
 (0)