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)