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",
