You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@causeway.apache.org by jo...@apache.org on 2023/07/31 15:35:34 UTC

[causeway] branch kvision-6-upgrade updated: CAUSEWAY-3264 click on menu icon in (list) table does not popup menu -> kvision issue 488

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

joergrade pushed a commit to branch kvision-6-upgrade
in repository https://gitbox.apache.org/repos/asf/causeway.git


The following commit(s) were added to refs/heads/kvision-6-upgrade by this push:
     new 7f2c7e448e CAUSEWAY-3264 click on menu icon in (list) table does not popup menu -> kvision issue 488
7f2c7e448e is described below

commit 7f2c7e448e40034be747243401f6e378f6074361
Author: Jörg Rade <jo...@kuehne-nagel.com>
AuthorDate: Mon Jul 31 17:35:18 2023 +0200

    CAUSEWAY-3264 click on menu icon in (list) table does not popup menu -> kvision issue 488
---
 .../causeway/client/kroviz/core/model/Exposer.kt    | 13 -------------
 .../causeway/client/kroviz/ui/builder/RoDisplay.kt  | 16 ++++++++++------
 .../causeway/client/kroviz/ui/core/ColumnFactory.kt | 17 +++++++++++------
 .../causeway/client/kroviz/ui/core/RoIconBar.kt     |  2 +-
 .../causeway/client/kroviz/ui/core/RoTable.kt       |  5 ++---
 .../apache/causeway/client/kroviz/ui/core/RoView.kt | 13 +++++++++++++
 .../causeway/client/kroviz/ui/core/ViewManager.kt   | 21 ++++++++++++++-------
 .../client/kroviz/core/model/ExposerTest.kt         |  8 ++++++--
 .../client/kroviz/ui/table/TableFactoryTest.kt      |  4 ++--
 9 files changed, 59 insertions(+), 40 deletions(-)

diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/causeway/client/kroviz/core/model/Exposer.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/causeway/client/kroviz/core/model/Exposer.kt
index 77a88c3f23..7437ac2ea5 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/causeway/client/kroviz/core/model/Exposer.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/causeway/client/kroviz/core/model/Exposer.kt
@@ -20,7 +20,6 @@ package org.apache.causeway.client.kroviz.core.model
 
 import org.apache.causeway.client.kroviz.to.MemberType
 import org.apache.causeway.client.kroviz.to.TObject
-import org.apache.causeway.client.kroviz.utils.IconManager
 
 /**
  * Makes properties of delegate available for display in tables.
@@ -32,11 +31,8 @@ import org.apache.causeway.client.kroviz.utils.IconManager
  * but it goes further since it even reveals members of its delegate.
  */
 class Exposer(val delegate: TObject) {
-    val iconName: String = IconManager.findFor(delegate) //required by ColumnFactory
-
     init {
         val that = this.asDynamic()
-//        that["icon"] = null is added at runtime
         for (m in delegate.members) {
             val member = m.value
             if (member.memberType == MemberType.PROPERTY.type) {
@@ -49,13 +45,4 @@ class Exposer(val delegate: TObject) {
         }
     }
 
-    fun withDelegateProperties(): dynamic {
-        return this.asDynamic()
-    }
-
-    // convenience method for test - refactor?
-    fun get(propertyName: String): Any? {
-        return this.delegate.getProperty(propertyName)?.value
-    }
-
 }
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/causeway/client/kroviz/ui/builder/RoDisplay.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/causeway/client/kroviz/ui/builder/RoDisplay.kt
index 311e400c7b..b79097d92c 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/causeway/client/kroviz/ui/builder/RoDisplay.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/causeway/client/kroviz/ui/builder/RoDisplay.kt
@@ -30,16 +30,20 @@ import org.apache.causeway.client.kroviz.ui.menu.DropDownMenuBuilder
 class RoDisplay(val displayModel: ObjectDM) : Displayable, VPanel() {
 
     var menu: DropDown? = null
-    private var objectPanel: VPanel
+    private var objectPanel: VPanel? = null
 
     init {
         val model = displayModel.data!!
         val tObject: TObject = model.delegate
-        val grid = (displayModel.layout as ObjectLayout).grid
-        objectPanel = LayoutBuilder().create(grid, tObject, this)
-        objectPanel.overflow = Overflow.AUTO
-        objectPanel.width = CssSize(100, UNIT.perc)
-        add(objectPanel)
+        val layout = displayModel.layout
+        //TODO if object is invoked from list/table, sometimes layout is not set
+        if (layout != null) {
+            val grid = (layout as ObjectLayout).grid
+            objectPanel = LayoutBuilder().create(grid, tObject, this)
+            objectPanel?.overflow = Overflow.AUTO
+            objectPanel?.width = CssSize(100, UNIT.perc)
+            add(objectPanel!!)
+        }
     }
 
     override fun setDirty(value: Boolean) {
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/causeway/client/kroviz/ui/core/ColumnFactory.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/causeway/client/kroviz/ui/core/ColumnFactory.kt
index de0bd7a5f0..8ebf26edb8 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/causeway/client/kroviz/ui/core/ColumnFactory.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/causeway/client/kroviz/ui/core/ColumnFactory.kt
@@ -19,6 +19,7 @@
 package org.apache.causeway.client.kroviz.ui.core
 
 import io.kvision.core.Component
+import io.kvision.maps.externals.leaflet.layer.overlay.Popup
 import io.kvision.panel.VPanel
 import io.kvision.tabulator.Align
 import io.kvision.tabulator.ColumnDefinition
@@ -27,8 +28,8 @@ import io.kvision.tabulator.Formatter
 import io.kvision.tabulator.js.Tabulator
 import io.kvision.utils.obj
 import org.apache.causeway.client.kroviz.core.model.CollectionDM
+import org.apache.causeway.client.kroviz.core.model.Exposer
 import org.apache.causeway.client.kroviz.core.model.PropertyDetails
-import org.apache.causeway.client.kroviz.to.TObject
 import org.apache.causeway.client.kroviz.to.ValueType
 import org.apache.causeway.client.kroviz.to.Vega5
 import org.apache.causeway.client.kroviz.ui.menu.DynamicMenuBuilder
@@ -62,13 +63,13 @@ class ColumnFactory {
     private fun columnForObjectMenu(): ColumnDefinition<dynamic> {
         return ColumnDefinition(
             "",
-            field = "iconName", // any existing field can be used
+            field = "menuCol", // field is created dynamically
             formatter = Formatter.TICKCROSS,
             formatterParams = menuFormatterParams,
             hozAlign = Align.CENTER,
             width = "40",
             headerSort = false,
-            clickMenu = { _: dynamic, cellComponent: dynamic ->
+            cellClick = { _: dynamic, cellComponent: dynamic ->
                 buildObjectMenu(cellComponent.unsafeCast<Tabulator.CellComponent>())
             }
         )
@@ -76,14 +77,18 @@ class ColumnFactory {
 
     private fun buildObjectMenu(cell: Tabulator.CellComponent): dynamic {
         val row = cell.getRow()
-        val dynamic = row.getData().asDynamic()
-        val tObject = dynamic.delegate
-        return DynamicMenuBuilder().buildObjectMenu(tObject as TObject)
+        val exposer = row.getData() as Exposer
+        val tObject = exposer.delegate
+        val menu = DynamicMenuBuilder().buildObjectMenu(tObject)
+        console.log("[CF_buildObjetMenu]")
+        console.log(menu)
+        return menu
     }
 
     private fun exposeIcons(displayCollection: CollectionDM) {
         val icon = displayCollection.icon
         displayCollection.data.forEach {
+            it["menuCol"] = "XXX"
             if (icon != null) {
                 it["iconUrl"] = icon.image.src
             }
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/causeway/client/kroviz/ui/core/RoIconBar.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/causeway/client/kroviz/ui/core/RoIconBar.kt
index cabe79bf2e..1c4bfffb63 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/causeway/client/kroviz/ui/core/RoIconBar.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/causeway/client/kroviz/ui/core/RoIconBar.kt
@@ -104,7 +104,7 @@ class RoIconBar : SimplePanel() {
             (obj == null) -> null
             is TObject -> {
                 val exp = Exposer(obj)
-                val ed = exp.withDelegateProperties()
+                val ed = exp.asDynamic()
                 val hasIconName = ed.hasOwnProperty("iconName") as Boolean
                 val iconName = if (hasIconName) (ed["iconName"] as String) else ""
 
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/causeway/client/kroviz/ui/core/RoTable.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/causeway/client/kroviz/ui/core/RoTable.kt
index ca422bd193..8ae832a1c5 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/causeway/client/kroviz/ui/core/RoTable.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/causeway/client/kroviz/ui/core/RoTable.kt
@@ -29,6 +29,7 @@ import io.kvision.tabulator.js.Tabulator.CellComponent
 import org.apache.causeway.client.kroviz.core.event.ResourceProxy
 import org.apache.causeway.client.kroviz.core.model.CollectionDM
 import org.apache.causeway.client.kroviz.core.model.Exposer
+import org.apache.causeway.client.kroviz.ui.menu.DynamicMenuBuilder
 import org.apache.causeway.client.kroviz.utils.StringUtils
 
 /**
@@ -54,12 +55,10 @@ class RoTable(displayCollection: CollectionDM) : SimplePanel() {
         val tabulator = createTabulator(model, options)
         tabulator.setEventListener<Tabulator<dynamic>> {
             cellClickTabulator = {
-                // can't check cast to external interface
-                val cc = it.detail as CellComponent
+                val cc = it.detail.unsafeCast<CellComponent>()
                 val column = cc.getColumn().getField()
                 if (column == "iconUrl") {
                     val exposer = cc.getData() as Exposer
-                    console.log(exposer)
                     val tObject = exposer.delegate
                     ResourceProxy().load(tObject)
                 }
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/causeway/client/kroviz/ui/core/RoView.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/causeway/client/kroviz/ui/core/RoView.kt
index a4db41128d..5bb7b4e7bf 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/causeway/client/kroviz/ui/core/RoView.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/causeway/client/kroviz/ui/core/RoView.kt
@@ -89,4 +89,17 @@ class RoView {
         }
     }
 
+    fun findTab(title: String): SimplePanel? {
+        return tabPanel.getTabs().find {
+            it.title == title
+        }
+    }
+
+    fun setActive(title: String) {
+        for ((i, c) in tabPanel.getTabs().withIndex()) {
+            if (c.title == title) {
+                tabPanel.activeIndex = i
+            }
+        }
+    }
 }
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/causeway/client/kroviz/ui/core/ViewManager.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/causeway/client/kroviz/ui/core/ViewManager.kt
index 3359ffb6e8..48841aa5ba 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/causeway/client/kroviz/ui/core/ViewManager.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/causeway/client/kroviz/ui/core/ViewManager.kt
@@ -174,11 +174,18 @@ object ViewManager {
         dm.isRendered = true
         setNormalCursor()
     }
+
     fun openObjectView(aggregator: ObjectAggregator) {
-        val dm = aggregator.getDisplayModel()
-        val panel = RoDisplay(dm)
-        add(aggregator.getTitle(), panel, aggregator)
-        dm.isRendered = true
+        val title = aggregator.getTitle()
+        val tab = getRoView().findTab(title)
+        if (tab == null) {
+            val dm = aggregator.getDisplayModel()
+            val panel = RoDisplay(dm)
+            add(title, panel, aggregator)
+            dm.isRendered = true
+        } else {
+            getRoView().setActive(title)
+        }
         setNormalCursor()
     }
 
@@ -228,9 +235,9 @@ object ViewManager {
     fun performUserAction(aggregator: BaseAggregator, obj: TObject) {
         setBusyCursor()
         getEventStore().addUserAction(aggregator, obj)
-        if (aggregator is ObjectAggregator) {
-            //TODO a 2nd, 3rd, etc view may be opened - introduce check
-            openObjectView(aggregator)
+        when (aggregator) {
+            is ObjectAggregator -> openObjectView(aggregator)
+            else -> {}
         }
         setNormalCursor()
     }
diff --git a/incubator/clients/kroviz/src/test/kotlin/org/apache/causeway/client/kroviz/core/model/ExposerTest.kt b/incubator/clients/kroviz/src/test/kotlin/org/apache/causeway/client/kroviz/core/model/ExposerTest.kt
index 1b70e40602..a98b6bda33 100644
--- a/incubator/clients/kroviz/src/test/kotlin/org/apache/causeway/client/kroviz/core/model/ExposerTest.kt
+++ b/incubator/clients/kroviz/src/test/kotlin/org/apache/causeway/client/kroviz/core/model/ExposerTest.kt
@@ -49,7 +49,7 @@ class ExposerTest {
 
         val exposer = Exposer(to)
 
-        val dyn = exposer.withDelegateProperties()
+        val dyn = exposer.asDynamic()
 
         val actKey = dyn["key"]
         assertEquals("causeway.appManifest", actKey)
@@ -74,7 +74,7 @@ class ExposerTest {
         val actualDnvers = exposer.get("datanucleusVersionTimestamp") as Value
         assertEquals(1514897074953L, actualDnvers.content as Long)
 
-        val dynEx = exposer.withDelegateProperties()
+        val dynEx = exposer.asDynamic()
         val actKey = dynEx["name"]
         assertEquals("Foo", actKey)
 
@@ -85,4 +85,8 @@ class ExposerTest {
         assertFalse(members.isEmpty())
     }
 
+    fun Exposer.get(propertyName: String): Any? {
+        return this.delegate.getProperty(propertyName)?.value
+    }
+
 }
diff --git a/incubator/clients/kroviz/src/test/kotlin/org/apache/causeway/client/kroviz/ui/table/TableFactoryTest.kt b/incubator/clients/kroviz/src/test/kotlin/org/apache/causeway/client/kroviz/ui/table/TableFactoryTest.kt
index 31e1ded233..48cd795a7a 100644
--- a/incubator/clients/kroviz/src/test/kotlin/org/apache/causeway/client/kroviz/ui/table/TableFactoryTest.kt
+++ b/incubator/clients/kroviz/src/test/kotlin/org/apache/causeway/client/kroviz/ui/table/TableFactoryTest.kt
@@ -36,14 +36,14 @@ class TableFactoryTest {
         val map = mapOf("m1" to m1, "m2" to m2)
         val t1 = TObject(extensions = Extensions(), members = map)
         val o1 = Exposer(t1)
-        val d1 = o1.getWithDelegateProperties()
+        val d1 = o1.asDynamic()
         d1["var1"] = "string1"
         d1["var2"] = 1
         answer.add(d1)
 
         val t2 = TObject(extensions = Extensions())
         val o2 = Exposer(t2)
-        val d2 = o2.getWithDelegateProperties()
+        val d2 = o2.asDynamic()
         d2["var1"] = "string2"
         d2["var2"] = 2
         answer.add(d2)