This is an automated email from the ASF dual-hosted git repository.

joergrade pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/isis.git

commit bd837ed31bcac04b9d4534f7d062dea987c0cf17
Author: Jörg Rade <[email protected]>
AuthorDate: Wed Oct 20 18:08:48 2021 +0200

    ISIS-2348 Replay User Events (3/3): EventState.USER_ACTION added, kvision 
upgrade to 5.4.0, coroutines used for replay delay
---
 incubator/clients/kroviz/gradle.properties         |  8 ++-
 .../kroviz/core/aggregator/AggregatorWithLayout.kt |  2 +-
 .../kroviz/core/aggregator/SystemAggregator.kt     |  2 +-
 .../isis/client/kroviz/core/event/EventStore.kt    | 11 +++-
 .../isis/client/kroviz/core/event/LogEntry.kt      |  7 +--
 .../isis/client/kroviz/core/event/ReplayCommand.kt | 59 +++++++++++++---------
 .../apache/isis/client/kroviz/ui/core/RoMenuBar.kt |  3 --
 .../apache/isis/client/kroviz/utils/IconManager.kt |  2 +-
 8 files changed, 56 insertions(+), 38 deletions(-)

diff --git a/incubator/clients/kroviz/gradle.properties 
b/incubator/clients/kroviz/gradle.properties
index 5df73f1..716e43f 100644
--- a/incubator/clients/kroviz/gradle.properties
+++ b/incubator/clients/kroviz/gradle.properties
@@ -19,7 +19,11 @@
 javaVersion=1.8
 #Plugins
 systemProp.kotlinVersion=1.5.31
-serializationVersion=1.2.2
+serializationVersion=1.3.0
 #Dependencies
-systemProp.kvisionVersion=5.2.0
+systemProp.kvisionVersion=5.4.0
+coroutinesVersion=1.5.2
+
+kotlin.mpp.stability.nowarn=true
 kotlin.js.compiler=legacy
+org.gradle.jvmargs=-Xmx2g
diff --git 
a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/aggregator/AggregatorWithLayout.kt
 
b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/aggregator/AggregatorWithLayout.kt
index 434fa1b..31a362f 100644
--- 
a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/aggregator/AggregatorWithLayout.kt
+++ 
b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/aggregator/AggregatorWithLayout.kt
@@ -19,7 +19,7 @@ abstract class AggregatorWithLayout : BaseAggregator() {
     }
 
     protected fun handleLayout(layout: Layout, dm: DisplayModelWithLayout, 
referrer: String) {
-        console.log("[CA.handleLayout] ISIS-2846")
+        console.log("[CA.handleLayout] TODO ISIS-2846")
         console.log(layout)
         if (dm.layout == null) {
             dm.addLayout(layout)
diff --git 
a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/aggregator/SystemAggregator.kt
 
b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/aggregator/SystemAggregator.kt
index d6dc960..3314056 100644
--- 
a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/aggregator/SystemAggregator.kt
+++ 
b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/aggregator/SystemAggregator.kt
@@ -49,7 +49,7 @@ class SystemAggregator() : BaseAggregator() {
                         else -> log(logEntry)
                     }
                 } else {
-                    console.log("[SA.update] no blob/image")
+                    console.log("[SA.update] TODO ISIS-2768 no blob/image due 
to CORS")
                 }
             }
         }
diff --git 
a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/event/EventStore.kt
 
b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/event/EventStore.kt
index e9b9f3e..75f6bec 100644
--- 
a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/event/EventStore.kt
+++ 
b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/event/EventStore.kt
@@ -48,11 +48,11 @@ object EventStore {
         }
     }
 
-    fun start(reSpec: ResourceSpecification,
+    fun start(rs: ResourceSpecification,
               method: String,
               body: String = "",
               aggregator: BaseAggregator? = null): LogEntry {
-        val entry = LogEntry(reSpec, method, request = body)
+        val entry = LogEntry(rs = rs, method = method, request = body)
         if (aggregator != null) {
             entry.addAggregator(aggregator)
         }
@@ -83,6 +83,13 @@ object EventStore {
         }
     }
 
+    fun addUserAction(aggregator: BaseAggregator, obj: TObject) {
+        val entry = LogEntry(title = obj.title, aggregator = aggregator)
+        entry.obj = obj
+        entry.state = EventState.USER_ACTION
+        log(entry)
+    }
+
     fun end(reSpec: ResourceSpecification, response: String): LogEntry? {
         val entry: LogEntry? = findBy(reSpec)
         if (entry != null) {
diff --git 
a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/event/LogEntry.kt
 
b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/event/LogEntry.kt
index d922f87..e589375 100644
--- 
a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/event/LogEntry.kt
+++ 
b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/event/LogEntry.kt
@@ -42,6 +42,7 @@ enum class EventState(val id: String, val iconName: String, 
val style: ButtonSty
     SUCCESS_XML("SUCCESS_XML", "fas fa-code", ButtonStyle.SUCCESS),
     SUCCESS_IMG("SUCCESS_IMG", "fas fa-image", ButtonStyle.SUCCESS),
     VIEW("VIEW", "fas fa-eye", ButtonStyle.INFO),
+    USER_ACTION("ACTION", "fas fa-user-times", ButtonStyle.INFO),
     DUPLICATE("DUPLICATE", "fas fa-copy", ButtonStyle.OUTLINESUCCESS),
     CLOSED("CLOSED", "fas fa-eye-slash", ButtonStyle.OUTLINEINFO),
     RELOAD("RELOAD", "fas fa-retweet", ButtonStyle.OUTLINEWARNING),
@@ -74,7 +75,7 @@ data class LogEntry(
         state = EventState.RUNNING
         title = url
         requestLength = request?.length
-                ?: 0 // ?. is required, otherwise Tabulator.js/EventLogTable 
shows no entries
+            ?: 0 // ?. is required, otherwise Tabulator.js/EventLogTable shows 
no entries
     }
 
     @Contextual
@@ -234,8 +235,8 @@ data class LogEntry(
     fun addAggregator(aggregator: BaseAggregator) {
         aggregators.add(aggregator)
         if ((aggregators.size > 1) && ((aggregator is ObjectAggregator) || 
(aggregator is CollectionAggregator))) {
-            console.log("[LE.addAggregator] last one just added")
-//            console.log(aggregators)
+            console.log("[LE.addAggregator] 2nd/3rd/etc. Object/Collection")
+            console.log(aggregator)
             //          throw Throwable("[LE.addAggregator] not implemented 
yet")
         }
         nOfAggregators = aggregators.size
diff --git 
a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/event/ReplayCommand.kt
 
b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/event/ReplayCommand.kt
index 4d09ac8..c598162 100644
--- 
a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/event/ReplayCommand.kt
+++ 
b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/event/ReplayCommand.kt
@@ -18,11 +18,18 @@
  */
 package org.apache.isis.client.kroviz.core.event
 
-import org.apache.isis.client.kroviz.core.aggregator.AggregatorWithLayout
+import kotlinx.browser.window
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.asCoroutineDispatcher
+import kotlinx.coroutines.delay
+import kotlinx.coroutines.launch
 import org.apache.isis.client.kroviz.main
 import org.apache.isis.client.kroviz.to.Link
-import org.apache.isis.client.kroviz.to.Relation
 import org.apache.isis.client.kroviz.to.Represention
+import org.apache.isis.client.kroviz.to.TObject
+import kotlin.js.Date
+
+val AppScope = CoroutineScope(window.asCoroutineDispatcher())
 
 class ReplayCommand {
 
@@ -36,53 +43,55 @@ class ReplayCommand {
     }
 
     private fun replay(userActions: List<LogEntry>) {
-        console.log("[ReplayCommand.replay]")
+        var previous: Date? = null
         userActions.forEach {
-            val link = Link(href = it.url)
-            console.log(link)
-            ResourceProxy().fetch(link, null, it.subType)
+            if (it.state == EventState.USER_ACTION) {
+                var offset: Double = 0.toDouble()
+                if (previous != null) {
+                    offset = it.createdAt.getTime().minus(previous!!.getTime())
+                }
+                val obj = it.obj as TObject
+                AppScope.launch {
+                    delay(offset.toLong()) // non-blocking delay for 1 second 
(default time unit is ms)
+                    ResourceProxy().load(obj)
+                }
+            } else {
+                val link = Link(href = it.url)
+                ResourceProxy().fetch(link, null, it.subType)
+            }
+            previous = it.createdAt
         }
     }
 
     private fun filterUserActions(events: List<LogEntry>): List<LogEntry> {
-        console.log("[ReplayCommand.filterUserActions]")
-        val userActions = events.filter {
+        return events.filter {
             (it.type == Represention.HOMEPAGE.type) ||
                     it.type == Represention.OBJECT_ACTION.type ||
-                    it.type == Relation.OBJECT_LAYOUT.type ||
-                    it.hasDisplayModel()
+                    it.state == EventState.USER_ACTION
         }
-        console.log(userActions)
-        console.log(userActions.size)
-        return userActions
     }
 
     private fun copyEvents(inputList: List<LogEntry>): List<LogEntry> {
-        console.log("[ReplayCommand.copyEvents]")
         val outputList = mutableListOf<LogEntry>()
         inputList.forEach {
             outputList.add(copyEvent(it))
         }
-        console.log(outputList)
-        console.log(outputList.size)
         return outputList
     }
 
     private fun copyEvent(input: LogEntry): LogEntry {
         val resourceSpecification = ResourceSpecification(input.url, 
input.subType)
         val output = LogEntry(
-            resourceSpecification,
-            input.title,
-            input.request,
-            input.createdAt
+            rs = resourceSpecification,
+            method = input.method,
+            request = input.request,
+            createdAt = input.createdAt
         )
+        output.title = input.title
         output.type = input.type
+        output.obj = input.obj
+        output.state = input.state
         return output
     }
 
-    private fun LogEntry.hasDisplayModel(): Boolean {
-        return (this.nOfAggregators > 0) &&
-                (this.getAggregator() is AggregatorWithLayout)
-    }
-
 }
\ No newline at end of file
diff --git 
a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/core/RoMenuBar.kt
 
b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/core/RoMenuBar.kt
index b8715a5..228ad69 100644
--- 
a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/core/RoMenuBar.kt
+++ 
b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/core/RoMenuBar.kt
@@ -120,9 +120,6 @@ class RoMenuBar : SimplePanel() {
             buildMenuEntry(aboutTitle, "Info", { UiManager.add(aboutTitle, 
About().open()) })
         )
 
-        console.log("[RMB.buildMainMenu]")
-        console.log(mainMenu)
-        console.log(mainMenu.getChildren())
         return mainMenu
     }
 
diff --git 
a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/utils/IconManager.kt
 
b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/utils/IconManager.kt
index 5887c7e..6058f67 100644
--- 
a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/utils/IconManager.kt
+++ 
b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/utils/IconManager.kt
@@ -79,7 +79,7 @@ object IconManager {
             "Primitives" to "hashtag",
             "Prototyping" to "object-group",
             "Queen" to "chess-queen",
-            "Replay" to "share",
+            "Replay" to "fast-forward",
             "Run" to "rocket",
             "Save" to "file",
             "Security" to "lock",

Reply via email to