You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by jo...@apache.org on 2021/05/10 07:11:47 UTC

[isis] 10/12: uuid passed on to RoTab

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

joergrade pushed a commit to branch ISIS-2505_Catch_Up_With_Demo_Examples
in repository https://gitbox.apache.org/repos/asf/isis.git

commit 8077f5495c6bf73d826440074ab7469acfefabfe
Author: Jörg Rade <jo...@kuehne-nagel.com>
AuthorDate: Fri May 7 12:59:06 2021 +0200

    uuid passed on to RoTab
---
 .../isis/client/kroviz/core/event/EventStore.kt    | 24 ++++++++++-----
 .../isis/client/kroviz/core/event/LogEntry.kt      |  2 ++
 .../apache/isis/client/kroviz/ui/core/RoView.kt    |  7 +++--
 .../apache/isis/client/kroviz/ui/core/UiManager.kt | 24 +++++++++------
 .../isis/client/kroviz/ui/dialog/DiagramDialog.kt  | 36 ++++++++++------------
 .../isis/client/kroviz/ui/kv/override/RoTab.kt     | 36 +++++++++++++++++-----
 .../client/kroviz/ui/kv/override/RoTabPanel.kt     | 11 +++++--
 .../client/kroviz/utils/ScalableVectorGraphic.kt   |  2 +-
 .../org/apache/isis/client/kroviz/utils/UUID.kt    |  6 +++-
 .../client/kroviz/core/event/EventStoreTest.kt     |  4 +--
 10 files changed, 101 insertions(+), 51 deletions(-)

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 31ec377..128d4e3 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
@@ -18,13 +18,14 @@
  */
 package org.apache.isis.client.kroviz.core.event
 
+import io.kvision.panel.SimplePanel
+import io.kvision.state.observableListOf
 import org.apache.isis.client.kroviz.core.aggregator.BaseAggregator
+import org.apache.isis.client.kroviz.core.aggregator.SvgDispatcher
 import org.apache.isis.client.kroviz.to.TObject
 import org.apache.isis.client.kroviz.to.mb.Menubars
 import org.apache.isis.client.kroviz.ui.core.UiManager
-import io.kvision.panel.SimplePanel
-import io.kvision.state.observableListOf
-import org.apache.isis.client.kroviz.core.aggregator.SvgDispatcher
+import org.apache.isis.client.kroviz.utils.ScalableVectorGraphic
 import org.apache.isis.client.kroviz.utils.UUID
 
 /**
@@ -65,9 +66,10 @@ object EventStore {
         updateStatus(entry)
     }
 
-    fun addView(title: String, aggregator: BaseAggregator, panel: SimplePanel) {
+    fun addView(title: String, aggregator: BaseAggregator, panel: SimplePanel, obj: Any?) {
         val entry = LogEntry(title = title, aggregator = aggregator)
         entry.obj = panel
+ //       entry.obj = obj
         log(entry)
         updateStatus(entry)
     }
@@ -128,9 +130,17 @@ object EventStore {
         return log.firstOrNull { it.getAggregator() == aggregator }
     }
 
-    fun findBy(uuid: UUID): LogEntry {
-        return log.first { it.getAggregator() is SvgDispatcher
-                && (it.getAggregator() as SvgDispatcher).callBack == uuid }
+    fun findByDispatcher(uuid: UUID): LogEntry {
+        return log.first {
+            it.getAggregator() is SvgDispatcher
+                    && (it.getAggregator() as SvgDispatcher).callBack == uuid
+        }
+    }
+
+    fun findByView(uuid: UUID): LogEntry? {
+        return log.firstOrNull() {
+            (it.obj is ScalableVectorGraphic) && ((it.obj as ScalableVectorGraphic).uuid == uuid)
+        }
     }
 
     fun findMenuBars(): LogEntry? {
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 44046af..6b51b47 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
@@ -25,7 +25,9 @@ import org.apache.isis.client.kroviz.core.aggregator.BaseAggregator
 import org.apache.isis.client.kroviz.to.TransferObject
 import org.apache.isis.client.kroviz.ui.core.Constants
 import org.apache.isis.client.kroviz.ui.core.UiManager
+import org.apache.isis.client.kroviz.utils.UUID
 import org.apache.isis.client.kroviz.utils.Utils.removeHexCode
+import org.apache.isis.client.kroviz.utils.XmlHelper
 import kotlin.js.Date
 
 // use color codes from css instead?
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/core/RoView.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/core/RoView.kt
index 802d1c9..fc21346 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/core/RoView.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/core/RoView.kt
@@ -24,6 +24,7 @@ import io.kvision.core.Component
 import io.kvision.core.addBsBorder
 import io.kvision.panel.SimplePanel
 import org.apache.isis.client.kroviz.ui.kv.override.RoTabPanel
+import org.apache.isis.client.kroviz.utils.UUID
 
 /**
  * Area between menu bar at the top and the status bar at the bottom.
@@ -36,7 +37,8 @@ object RoView {
 
     fun addTab(
             title: String,
-            panel: Component) {
+            panel: Component,
+            uuid: UUID?) {
         panel.addBsBorder(BsBorder.BORDER)
         val index = tabPanel.findTab(title)
         if (index != null) {
@@ -53,7 +55,8 @@ object RoView {
                 panel,
                 icon,
                 image = null,
-                closable = true)
+                closable = true,
+                uuid = uuid)
         tabPanel.activeIndex = tabCount
         tabCount += 1
     }
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/core/UiManager.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/core/UiManager.kt
index f9f7b81..6ca4ec1 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/core/UiManager.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/core/UiManager.kt
@@ -18,6 +18,10 @@
  */
 package org.apache.isis.client.kroviz.ui.core
 
+import io.kvision.core.Widget
+import io.kvision.dropdown.ContextMenu
+import io.kvision.panel.SimplePanel
+import io.kvision.utils.ESC_KEY
 import kotlinx.browser.window
 import org.apache.isis.client.kroviz.core.Session
 import org.apache.isis.client.kroviz.core.aggregator.BaseAggregator
@@ -31,12 +35,10 @@ import org.apache.isis.client.kroviz.core.model.ObjectDM
 import org.apache.isis.client.kroviz.to.Relation
 import org.apache.isis.client.kroviz.to.TObject
 import org.apache.isis.client.kroviz.to.mb.Menubars
+import org.apache.isis.client.kroviz.utils.ScalableVectorGraphic
+import org.apache.isis.client.kroviz.utils.UUID
 import org.apache.isis.client.kroviz.utils.Utils
 import org.w3c.dom.events.KeyboardEvent
-import io.kvision.core.Widget
-import io.kvision.dropdown.ContextMenu
-import io.kvision.panel.SimplePanel
-import io.kvision.utils.ESC_KEY
 
 /**
  * Single point of contact for view components consisting of:
@@ -49,7 +51,7 @@ object UiManager {
 
     private var session: Session? = null
     private val popups = mutableListOf<Widget>()
-    private val settings = mutableMapOf<String,Any>()
+    private val settings = mutableMapOf<String, Any>()
 
     init {
         window.addEventListener("keydown", fun(event) {
@@ -76,9 +78,13 @@ object UiManager {
         return null
     }
 
-    fun add(title: String, panel: SimplePanel, aggregator: BaseAggregator = UndefinedDispatcher()) {
-        RoView.addTab(title, panel)
-        EventStore.addView(title, aggregator, panel)
+    fun add(title: String, panel: SimplePanel, obj: Any? = null, aggregator: BaseAggregator = UndefinedDispatcher()) {
+        var uuid: UUID? = null
+        if (obj is ScalableVectorGraphic) {
+            uuid = obj.uuid
+        }
+        RoView.addTab(title, panel, uuid)
+        EventStore.addView(title, aggregator, panel, obj)
     }
 
     fun closeView(tab: SimplePanel) {
@@ -106,7 +112,7 @@ object UiManager {
         val displayable = aggregator.dpm
         val title: String = Utils.extractTitle(displayable.title)
         val panel = RoTable(displayable as ListDM)
-        add(title, panel, aggregator)
+        add(title, panel, null, aggregator)
         displayable.isRendered = true
     }
 
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/dialog/DiagramDialog.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/dialog/DiagramDialog.kt
index e419ec9..64514bd 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/dialog/DiagramDialog.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/dialog/DiagramDialog.kt
@@ -18,13 +18,10 @@
  */
 package org.apache.isis.client.kroviz.ui.dialog
 
+import io.kvision.panel.VPanel
 import org.apache.isis.client.kroviz.core.event.EventStore
 import org.apache.isis.client.kroviz.to.ValueType
-import org.apache.isis.client.kroviz.ui.core.FormItem
-import org.apache.isis.client.kroviz.ui.core.MenuFactory
-import org.apache.isis.client.kroviz.ui.core.RoDialog
-import org.apache.isis.client.kroviz.ui.core.UiManager
-import org.apache.isis.client.kroviz.ui.panel.FormPanelFactory
+import org.apache.isis.client.kroviz.ui.core.*
 import org.apache.isis.client.kroviz.utils.*
 import io.kvision.html.Link as KvisionHtmlLink
 
@@ -61,32 +58,33 @@ class DiagramDialog(
     }
 
     private fun pin() {
-        val newImage = getDiagram()
-        val newCallBack = buildNewPanel()
-        DomUtil.replaceWith(newCallBack, newImage)
+        val newUuid = UUID()
+        val newSvg= getDiagram(newUuid)
+        val panel = buildNewPanel(newUuid)
+        console.log("[DD.pin]")
+        console.log(panel)
+        console.log(panel.panel!!.getChildren().first())
+        UiManager.add("Diagram", panel, newSvg)
+        DomUtil.replaceWith(newUuid, newSvg)
         dialog.close()
     }
 
-    private fun getDiagram(): ScalableVectorGraphic {
-        val logEntry = EventStore.findBy(callBack as UUID)
+    private fun getDiagram(newUuid:UUID?): ScalableVectorGraphic {
+        val logEntry = EventStore.findByDispatcher(callBack as UUID)
         val svgStr = logEntry.getResponse()
-        return ScalableVectorGraphic(svgStr)
+        return ScalableVectorGraphic(svgStr, newUuid)
     }
 
-    private fun buildNewPanel(): UUID {
-        val newUuid = UUID()
+    private fun buildNewPanel(newUuid: UUID): FormPanelFactory {
         val formItems = mutableListOf<FormItem>()
         val newFi = FormItem("svg", ValueType.SVG_INLINE, callBack = newUuid)
         formItems.add(newFi)
-        val panel = FormPanelFactory(formItems)
-        console.log(panel)
-        UiManager.add("Diagram", panel)
-        return newUuid
+        return FormPanelFactory(formItems)
     }
 
     @Deprecated("use leaflet/svg")
     fun scale(direction: Direction) {
-        val svg = getDiagram()
+        val svg = getDiagram(null)
         when (direction) {
             Direction.UP -> svg.scaleUp()
             Direction.DOWN -> svg.scaleDown()
@@ -97,7 +95,7 @@ class DiagramDialog(
     fun buildMenu(): List<KvisionHtmlLink> {
         val menu = mutableListOf<KvisionHtmlLink>()
         val action = MenuFactory.buildActionLink(
-                label = "pin",
+                label = "Pin",
                 menuTitle = "pin")
         action.onClick {
             pin()
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/kv/override/RoTab.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/kv/override/RoTab.kt
index 967b3a9..d3d1fd7 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/kv/override/RoTab.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/kv/override/RoTab.kt
@@ -36,6 +36,10 @@ import io.kvision.routing.RoutingManager
 import io.kvision.state.ObservableState
 import io.kvision.state.bind
 import io.kvision.utils.obj
+import org.apache.isis.client.kroviz.core.event.EventStore
+import org.apache.isis.client.kroviz.utils.DomUtil
+import org.apache.isis.client.kroviz.utils.ScalableVectorGraphic
+import org.apache.isis.client.kroviz.utils.UUID
 
 /**
  * The single Tab component inside the TabPanel container.
@@ -49,8 +53,12 @@ import io.kvision.utils.obj
  * @param init an initializer extension function
  */
 open class RoTab(
-        label: String? = null, icon: String? = null,
-        image: ResString? = null, closable: Boolean = false, val route: String? = null,
+        label: String? = null,
+        icon: String? = null,
+        image: ResString? = null,
+        closable: Boolean = false,
+        val route: String? = null,
+        val uuid: UUID? = null,
         init: (RoTab.() -> Unit)? = null
 ) : Tag(TAG.LI, classes = setOf("nav-item")) {
 
@@ -61,16 +69,28 @@ open class RoTab(
             image: ResString? = null,
             closable: Boolean = false,
             route: String? = null,
+            uuid: UUID? = null,
             init: (RoTab.() -> Unit)? = null
-    ) : this(label, icon, image, closable, route, init) {
+    ) : this(label, icon, image, closable, route, uuid, init) {
         @Suppress("LeakingThis")
         add(child)
     }
 
-    override fun focus() {
-        console.log("[RT.focus]")
-        if (getElementJQuery()?.attr("tabindex") == undefined) getElementJQuery()?.attr("tabindex", "-1")
-        super.focus()
+    override fun render(): VNode {
+        if (uuid != null) {
+            console.log("[RT.render]")
+            console.log(uuid)
+            val logEntry = EventStore.findByView(uuid)
+            if (logEntry != null) {
+                val svgStr = logEntry.getResponse()
+                console.log(svgStr)
+                val newImage = ScalableVectorGraphic(svgStr)
+                val uuid = UUID(this.id!!)
+                console.log(uuid)
+                DomUtil.replaceWith(uuid, newImage)
+            }
+        }
+        return super.render()
     }
 
     /**
@@ -185,7 +205,7 @@ fun RoTabPanel.tab(
         image: ResString? = null, closable: Boolean = false, route: String? = null,
         init: (RoTab.() -> Unit)? = null
 ): RoTab {
-    val tab = RoTab(label, icon, image, closable, route, init)
+    val tab = RoTab(label, icon, image, closable, route, null, init)
     this.add(tab)
     return tab
 }
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/kv/override/RoTabPanel.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/kv/override/RoTabPanel.kt
index 4183743..2611087 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/kv/override/RoTabPanel.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/kv/override/RoTabPanel.kt
@@ -35,6 +35,7 @@ import io.kvision.utils.obj
 import io.kvision.utils.perc
 import io.kvision.utils.set
 import org.apache.isis.client.kroviz.ui.core.RoView
+import org.apache.isis.client.kroviz.utils.UUID
 
 /**
  * Tab position.
@@ -142,6 +143,11 @@ open class RoTabPanel(
         init?.invoke(this)
     }
 
+    override fun render(): VNode {
+        return render("div", childrenVNodes())
+    }
+
+
     private fun calculateSideClasses(): Pair<String, String> {
         return when (sideTabSize) {
             SideTabSize.SIZE_1 -> Pair("col-sm-1", "col-sm-11")
@@ -315,9 +321,10 @@ open class RoTabPanel(
      */
     open fun addTab(
             title: String, panel: Component, icon: String? = null,
-            image: ResString? = null, closable: Boolean = false, route: String? = null
+            image: ResString? = null, closable: Boolean = false, route: String? = null,
+            uuid: UUID? = null
     ): RoTabPanel {
-        addTab(RoTab(title, panel, icon, image, closable, route))
+        addTab(RoTab(title, panel, icon, image, closable, route, uuid))
         refresh()
         return this
     }
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/utils/ScalableVectorGraphic.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/utils/ScalableVectorGraphic.kt
index e686613..9d9d37e 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/utils/ScalableVectorGraphic.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/utils/ScalableVectorGraphic.kt
@@ -33,7 +33,7 @@ enum class Direction(val id: String) {
 }
 
 // see: https://vecta.io/blog/best-way-to-embed-svg
-class ScalableVectorGraphic(val data: String) {
+class ScalableVectorGraphic(val data: String, val uuid:UUID? = null) {
 
     var document: Document = DOMParser().parseFromString(data, Constants.svgMimeType)
     private var root: SVGSVGElement
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/utils/UUID.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/utils/UUID.kt
index 2617019..4461e3f 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/utils/UUID.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/utils/UUID.kt
@@ -21,7 +21,7 @@ package org.apache.isis.client.kroviz.utils
 import kotlin.random.Random
 
 class UUID() {
-    val value: String
+    var value: String
 
     // Returns a 36-character string in the form
     // XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
@@ -39,6 +39,10 @@ class UUID() {
         value = "$s1-$s2-$s3-$s4-$s5"
     }
 
+    constructor(string: String) : this() {
+        value = string
+    }
+
     @OptIn(kotlin.ExperimentalUnsignedTypes::class)
     fun ByteArray.toHexString() = asUByteArray().joinToString("") {
         it.toString(16).padStart(2, '0')
diff --git a/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/core/event/EventStoreTest.kt b/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/core/event/EventStoreTest.kt
index ce5c914..5544b15 100644
--- a/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/core/event/EventStoreTest.kt
+++ b/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/core/event/EventStoreTest.kt
@@ -116,9 +116,9 @@ class EventStoreTest : IntegrationTest() {
 
         // construct list with urls
         EventStore.add(h1Spec)
-        EventStore.addView(i1, agg, VPanel())
+        EventStore.addView(i1, agg, VPanel(), null)
         EventStore.add(h2Spec)
-        EventStore.addView(i2, agg, VPanel())
+        EventStore.addView(i2, agg, VPanel(), null)
 
         val le1 = EventStore.find(h1Spec)!!
         assertEquals(h1, le1.url)   //1