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/07/06 15:21:06 UTC

[isis] branch ISIS-2505_Catch_Up_With_Demo_Examples updated (79f5f42 -> f110a70)

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

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


    from 79f5f42  ISIS-2505 Parented Table shows up with 2/4 Column headers, but no data yet
     new 7faf75a  ISIS-2505 all attributes in parented collections shown in table header, preparation for object-icon, response column added in EventLogTable
     new 5e2ed9c  ISIS-2505 Credits/Icons/Buttons in RoStatusBar
     new 375f326  ISIS-2505 parentedCollection (BasicTypes->String) renders two empty entries
     new 9aaf69c  ISIS-2505 (some) columns hidden, Properties/PropertyFacade introduced
     new b0304a2  ISIS-2505 FieldsetPanel.legend capitalized
     new 8737135  ISIS-2505 CollectionProperties reklated tests fixed - data not rendered yet
     new f110a70  ISIS-2505 upgrade KVision, Kotlin, Serialization

The 7 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 incubator/clients/kroviz/build.gradle.kts          |  25 +-
 incubator/clients/kroviz/gradle.properties         |   6 +-
 incubator/clients/kroviz/settings.gradle.kts       |   4 -
 .../kroviz/core/aggregator/AggregatorWithLayout.kt |   9 +-
 .../kroviz/core/aggregator/BaseAggregator.kt       |  14 +-
 .../kroviz/core/aggregator/CollectionAggregator.kt |  17 +-
 .../core/aggregator/DomainTypesAggregator.kt       |   2 +-
 .../kroviz/core/aggregator/ObjectAggregator.kt     |   2 +-
 .../isis/client/kroviz/core/event/LogEntry.kt      |  17 +-
 .../client/kroviz/core/event/LogEntryDecorator.kt  |   2 -
 .../client/kroviz/core/event/RoXmlHttpRequest.kt   |   2 +-
 .../isis/client/kroviz/core/model/CollectionDM.kt  |  21 +-
 .../kroviz/core/model/CollectionProperties.kt      |  99 ++++++
 .../kroviz/core/model/DisplayModelWithLayout.kt    |  36 +--
 .../client/kroviz/handler/CollectionHandler.kt     |   1 -
 .../client/kroviz/handler/DomainTypesHandler.kt    |   5 +-
 .../isis/client/kroviz/handler/HttpErrorHandler.kt |   1 -
 .../{CollectionHandler.kt => IconHandler.kt}       |  16 +-
 .../isis/client/kroviz/handler/LayoutHandler.kt    |   4 +-
 .../isis/client/kroviz/handler/LayoutXmlHandler.kt |   2 +-
 .../isis/client/kroviz/handler/ResponseHandler.kt  |   4 +-
 .../apache/isis/client/kroviz/layout/PropertyLt.kt |   4 +-
 .../org/apache/isis/client/kroviz/to/Icon.kt       |   8 +
 .../apache/isis/client/kroviz/to/bs3/FieldSet.kt   |  12 +-
 .../apache/isis/client/kroviz/to/bs3/Property.kt   |   4 +-
 .../isis/client/kroviz/ui/builder/ColBuilder.kt    |  16 +-
 .../isis/client/kroviz/ui/core/ColumnFactory.kt    |  44 +--
 .../apache/isis/client/kroviz/ui/core/Constants.kt |   1 +
 .../isis/client/kroviz/ui/core/FormPanelFactory.kt |   6 +-
 .../isis/client/kroviz/ui/core/MenuFactory.kt      |   2 -
 .../apache/isis/client/kroviz/ui/core/RoMenuBar.kt |   2 +-
 .../isis/client/kroviz/ui/core/RoStatusBar.kt      |  33 +-
 .../apache/isis/client/kroviz/ui/core/RoTable.kt   |  14 +
 .../apache/isis/client/kroviz/ui/core/RoView.kt    |   2 +-
 .../apache/isis/client/kroviz/ui/core/UiManager.kt |   2 -
 .../isis/client/kroviz/ui/dialog/DiagramDialog.kt  |   1 +
 .../isis/client/kroviz/ui/panel/EventLogTable.kt   |  43 ++-
 .../apache/isis/client/kroviz/utils/IconManager.kt |   3 +-
 .../org/apache/isis/client/kroviz/utils/Utils.kt   |  26 +-
 .../kroviz/src/main/resources/css/kroviz.css       |  19 +-
 .../core/aggregator/CollectionAggregatorTest.kt    |   7 +-
 .../client/kroviz/core/model/CollectionDMTest.kt   |   6 +-
 .../snapshots/demo2_0_0/ACTIONS_STRINGS_INVOKE.kt  | 344 ++++++++-------------
 .../kroviz/snapshots/demo2_0_0/Response2Handler.kt |   2 +-
 .../org/apache/isis/client/kroviz/to/LinkTest.kt   |  12 +-
 .../apache/isis/client/kroviz/to/TObjectTest.kt    |   6 +-
 .../clients/kroviz/webpack.config.d/bootstrap.js   |   6 +-
 incubator/clients/kroviz/webpack.config.d/css.js   |   3 +-
 incubator/clients/kroviz/webpack.config.d/file.js  |   5 +-
 incubator/clients/kroviz/webpack.config.d/jed.js   |   7 -
 .../clients/kroviz/webpack.config.d/minify.js      |  17 -
 .../clients/kroviz/webpack.config.d/webpack.js     |   9 +
 52 files changed, 524 insertions(+), 431 deletions(-)
 create mode 100644 incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/model/CollectionProperties.kt
 copy incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/handler/{CollectionHandler.kt => IconHandler.kt} (74%)
 create mode 100644 incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/to/Icon.kt
 delete mode 100644 incubator/clients/kroviz/webpack.config.d/jed.js
 delete mode 100644 incubator/clients/kroviz/webpack.config.d/minify.js

[isis] 05/07: ISIS-2505 FieldsetPanel.legend capitalized

Posted by jo...@apache.org.
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 b0304a2c50ca418f7600f26e822ab78df111f26f
Author: Jörg Rade <jo...@kuehne-nagel.com>
AuthorDate: Fri Jul 2 08:33:27 2021 +0200

    ISIS-2505 FieldsetPanel.legend capitalized
---
 .../kotlin/org/apache/isis/client/kroviz/ui/builder/ColBuilder.kt   | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/builder/ColBuilder.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/builder/ColBuilder.kt
index 5274df1..e6188c3 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/builder/ColBuilder.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/builder/ColBuilder.kt
@@ -27,7 +27,6 @@ import org.apache.isis.client.kroviz.to.bs3.Col
 import org.apache.isis.client.kroviz.ui.core.MenuFactory
 import org.apache.isis.client.kroviz.ui.core.RoDisplay
 import org.apache.isis.client.kroviz.ui.core.RoTable
-import org.apache.isis.client.kroviz.utils.Utils
 
 class ColBuilder : UiBuilder() {
 
@@ -47,8 +46,9 @@ class ColBuilder : UiBuilder() {
             val fsCpt = FieldSetBuilder().create(fs, tObject, dsp)!!
             var legend = fs.name
             if (legend.trim().length == 0) {
-                legend = Utils.enCamel(fs.id) //IMPROVE uppercase firstchar
+                legend = fs.id
             }
+            legend = legend.capitalize()
             val fsPanel = FieldsetPanel(legend = legend).add(fsCpt)
             val tto = TooltipOptions(title = fs.id)
             fsPanel.enableTooltip(tto)
@@ -67,7 +67,7 @@ class ColBuilder : UiBuilder() {
             console.log(collectionDM.grid)
             console.log(collectionDM.layout)
             val tblCpt = RoTable(collectionDM)
-            val fsPanel = FieldsetPanel(legend = key).add(tblCpt)
+            val fsPanel = FieldsetPanel(legend = key.capitalize()).add(tblCpt)
             panel.add(fsPanel)
             collectionDM.isRendered = true
         }

[isis] 04/07: ISIS-2505 (some) columns hidden, Properties/PropertyFacade introduced

Posted by jo...@apache.org.
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 9aaf69c46935190734e836f78b70469515b0fc10
Author: Jörg Rade <jo...@kuehne-nagel.com>
AuthorDate: Thu Jul 1 21:20:45 2021 +0200

    ISIS-2505 (some) columns hidden, Properties/PropertyFacade introduced
---
 .../kroviz/core/model/DisplayModelWithLayout.kt    | 40 +++--------
 .../isis/client/kroviz/core/model/Properties.kt    | 82 ++++++++++++++++++++++
 .../apache/isis/client/kroviz/layout/PropertyLt.kt |  4 +-
 .../apache/isis/client/kroviz/to/bs3/Property.kt   |  4 +-
 .../isis/client/kroviz/ui/builder/ColBuilder.kt    |  7 +-
 .../isis/client/kroviz/ui/core/ColumnFactory.kt    | 24 ++++---
 6 files changed, 114 insertions(+), 47 deletions(-)

diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/model/DisplayModelWithLayout.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/model/DisplayModelWithLayout.kt
index b6d9f70..467680a 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/model/DisplayModelWithLayout.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/model/DisplayModelWithLayout.kt
@@ -21,7 +21,6 @@ package org.apache.isis.client.kroviz.core.model
 import org.apache.isis.client.kroviz.layout.Layout
 import org.apache.isis.client.kroviz.layout.PropertyLt
 import org.apache.isis.client.kroviz.layout.RowLt
-import org.apache.isis.client.kroviz.to.Extensions
 import org.apache.isis.client.kroviz.to.Property
 import org.apache.isis.client.kroviz.to.bs3.Grid
 
@@ -29,42 +28,20 @@ abstract class DisplayModelWithLayout : DisplayModel() {
 
     var layout: Layout? = null
     var grid: Grid? = null
-    var propertyDescriptionList = mutableMapOf<String, String>()
-    var propertyList = mutableListOf<Property>()
+    var propertyDescriptionList = mutableListOf<Property>()
     var propertyLayoutList = mutableListOf<PropertyLt>()
+    val properties = Properties()
 
     override fun canBeDisplayed(): Boolean {
-//        testPropertyNamesMatch()
         return when {
             isRendered -> false
             layout == null -> false
             grid == null -> false
-            else -> {
-                val pls = propertyLayoutList.size
-                val pds = propertyDescriptionList.size
-                val descriptionsComplete = pds >= pls
-                descriptionsComplete
-            }
+            propertyDescriptionList.isEmpty() -> false
+            else -> true
         }
     }
 
-    /*
-    check that property names match in:
-    * propertyList
-    * propertyLayoutList
-    * propertyDescriptionList
-     */
-    fun testPropertyNamesMatch() {
-        val ps = propertyList.size
-        val pls = propertyLayoutList.size
-        val pds = propertyDescriptionList.size
-        val sizeOK = (ps >= pds) && (pds >= pls)
-        console.log("[DMWL.testPropertyNamesMatch] $sizeOK")
-        console.log(propertyList)
-        console.log(propertyLayoutList)
-        console.log(propertyDescriptionList)
-    }
-
     fun addLayout(layout: Layout) {
         this.layout = layout
         initPropertyLayoutList(layout)
@@ -83,6 +60,7 @@ abstract class DisplayModelWithLayout : DisplayModel() {
                 console.log("[DMWL.initLayout4Row]")
                 console.log(fs.property)
                 propertyLayoutList.addAll(fs.property)
+                properties.addAllPropertyLayout(fs.property)
             }
             c.tabGroup.forEach { tg ->
                 tg.tab.forEach { t ->
@@ -95,14 +73,12 @@ abstract class DisplayModelWithLayout : DisplayModel() {
     }
 
     fun addPropertyDescription(p: Property) {
-        val id = p.id
-        val e: Extensions = p.extensions!!
-        val friendlyName = e.friendlyName
-        propertyDescriptionList.put(id, friendlyName)
+        propertyDescriptionList.add(p)
+        properties.addPropertyDescription(p)
     }
 
     fun addProperty(property: Property) {
-        propertyList.add(property)
+        properties.addProperty(property)
     }
 
 }
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/model/Properties.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/model/Properties.kt
new file mode 100644
index 0000000..6c00954
--- /dev/null
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/model/Properties.kt
@@ -0,0 +1,82 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.apache.isis.client.kroviz.core.model
+
+import org.apache.isis.client.kroviz.layout.PropertyLt
+import org.apache.isis.client.kroviz.to.Extensions
+import org.apache.isis.client.kroviz.to.Property
+
+class Properties() {
+    val list = mutableListOf<PropertyFacade>()
+
+    fun addProperty(property: Property) {
+        val id = property.id
+        val pf = findOrCreate(id)
+        pf.property = property
+    }
+
+    fun addAllPropertyLayout(layoutList: List<PropertyLt>) {
+        fun addPropertyLayout(layout: PropertyLt) {
+            val id = layout.id!!
+            val pf = findOrCreate(id)
+            pf.layout = layout
+        }
+        layoutList.forEach { addPropertyLayout(it) }
+    }
+
+    fun addPropertyDescription(description: Property) {
+        val id = description.id
+        val pf = findOrCreate(id)
+        val e: Extensions = description.extensions!!
+        pf.friendlyName = e.friendlyName
+    }
+
+    private fun findOrCreate(id: String): PropertyFacade {
+        var pf = list.find { it.key == id }
+        if (pf == null) {
+            pf = PropertyFacade(id)
+            list.add(pf)
+        }
+        return pf
+    }
+
+}
+
+/**
+ * Properties have three aspects:
+ *
+ * - Member of a DomainObject
+ * - Description (labels, friendlyName)
+ * - Layout
+ *
+ * All three are required in order to display correctly in a table.
+ */
+class PropertyFacade(val key: String) {
+    var property: Property? = null
+    var friendlyName: String = ""
+    var layout: PropertyLt? = null
+
+    fun hidden(): Boolean {
+        if (layout != null) {
+            return (layout!!.hidden != null)
+        }
+        return false
+    }
+
+}
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/layout/PropertyLt.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/layout/PropertyLt.kt
index e5c3896..8b7ce90 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/layout/PropertyLt.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/layout/PropertyLt.kt
@@ -22,12 +22,12 @@ import kotlinx.serialization.Serializable
 import org.apache.isis.client.kroviz.to.Link
 
 @Serializable
-data class PropertyLt(val named: String? = null,
+data class PropertyLt(val id: String? = null,
+                      val named: String? = null,
                       val describedAs: String? = null,
                       val action: List<ActionLt> = emptyList(),
                       var metadataError: String? = null,
                       val link: Link? = null,
-                      val id: String? = null,
                       val cssClass: String? = null,
                       val hidden: String? = null,  //ALL_TABLES
                       val labelPosition: String? = null,
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/to/bs3/Property.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/to/bs3/Property.kt
index 9485d6a..d1683b2 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/to/bs3/Property.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/to/bs3/Property.kt
@@ -25,17 +25,17 @@ import org.w3c.dom.asList
 //IMPROVE class differs in many aspects from org.ro.to.Property - to be refactored?
 class Property(node: Node) {
     var id: String
+    var named = ""
     var link: Link? = null
     var hidden: String = "" // USE ENUM Where? = null
     var typicalLength: Int = 0
     var multiLine: Int = 1
     var describedAs: String? = null
-    var named = ""
     lateinit var action: Action
 
     init {
         val dn = node.asDynamic()
-        id = dn.getAttribute("hidden")
+        hidden = dn.getAttribute("hidden")
         id = dn.getAttribute("id") as String
         typicalLength = dn.getAttribute("typicalLength")
         multiLine = dn.getAttribute("multiLine")
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/builder/ColBuilder.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/builder/ColBuilder.kt
index 91876ad..5274df1 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/builder/ColBuilder.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/builder/ColBuilder.kt
@@ -27,6 +27,7 @@ import org.apache.isis.client.kroviz.to.bs3.Col
 import org.apache.isis.client.kroviz.ui.core.MenuFactory
 import org.apache.isis.client.kroviz.ui.core.RoDisplay
 import org.apache.isis.client.kroviz.ui.core.RoTable
+import org.apache.isis.client.kroviz.utils.Utils
 
 class ColBuilder : UiBuilder() {
 
@@ -44,7 +45,11 @@ class ColBuilder : UiBuilder() {
         }
         for (fs in col.fieldSetList) {
             val fsCpt = FieldSetBuilder().create(fs, tObject, dsp)!!
-            val fsPanel = FieldsetPanel(legend = fs.name).add(fsCpt)
+            var legend = fs.name
+            if (legend.trim().length == 0) {
+                legend = Utils.enCamel(fs.id) //IMPROVE uppercase firstchar
+            }
+            val fsPanel = FieldsetPanel(legend = legend).add(fsCpt)
             val tto = TooltipOptions(title = fs.id)
             fsPanel.enableTooltip(tto)
             panel.add(fsPanel)
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/core/ColumnFactory.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/core/ColumnFactory.kt
index 6c3b951..31ed7d6 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/core/ColumnFactory.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/core/ColumnFactory.kt
@@ -69,18 +69,22 @@ class ColumnFactory {
             columns.add(icon)
         }
 
-        val propertyLabels = displayCollection.propertyDescriptionList
+        val propertyLabels = displayCollection.properties.list
         for (pl in propertyLabels) {
-            val id = pl.key
-            val friendlyName = pl.value
-            var cd = ColumnDefinition<Exposer>(
-                    title = friendlyName,
-                    field = id,
-                    headerFilter = Editor.INPUT)
-            if (id == "object") {
-                cd = buildLink()
+            console.log("[CF.buildColumns]")
+            console.log(pl.hidden())
+            if (!pl.hidden()) {
+                val id = pl.key
+                val friendlyName = pl.friendlyName
+                var cd = ColumnDefinition<Exposer>(
+                        title = friendlyName,
+                        field = id,
+                        headerFilter = Editor.INPUT)
+                if (id == "object") {
+                    cd = buildLink()
+                }
+                columns.add(cd)
             }
-            columns.add(cd)
         }
         return columns
     }

[isis] 07/07: ISIS-2505 upgrade KVision, Kotlin, Serialization

Posted by jo...@apache.org.
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 f110a709343a841653b572c379480ec7dfe33875
Author: Jörg Rade <jo...@kuehne-nagel.com>
AuthorDate: Tue Jul 6 17:20:30 2021 +0200

    ISIS-2505 upgrade KVision, Kotlin, Serialization
---
 incubator/clients/kroviz/build.gradle.kts          | 25 ++++++++++++---------
 incubator/clients/kroviz/gradle.properties         |  6 ++---
 incubator/clients/kroviz/settings.gradle.kts       |  4 ----
 .../core/aggregator/DomainTypesAggregator.kt       |  1 +
 .../client/kroviz/handler/CollectionHandler.kt     |  1 -
 .../isis/client/kroviz/handler/IconHandler.kt      |  2 +-
 .../isis/client/kroviz/ui/core/ColumnFactory.kt    | 11 ++-------
 .../isis/client/kroviz/ui/core/FormPanelFactory.kt |  2 +-
 .../apache/isis/client/kroviz/ui/core/RoTable.kt   | 16 ++++++++++++-
 .../apache/isis/client/kroviz/ui/core/RoView.kt    |  2 +-
 .../apache/isis/client/kroviz/utils/IconManager.kt |  3 ++-
 .../org/apache/isis/client/kroviz/utils/Utils.kt   | 26 +++++++++++++---------
 .../core/aggregator/CollectionAggregatorTest.kt    |  3 ++-
 .../kroviz/snapshots/demo2_0_0/Response2Handler.kt |  2 +-
 .../clients/kroviz/webpack.config.d/bootstrap.js   |  6 ++---
 incubator/clients/kroviz/webpack.config.d/css.js   |  3 +--
 incubator/clients/kroviz/webpack.config.d/file.js  |  5 +----
 incubator/clients/kroviz/webpack.config.d/jed.js   |  7 ------
 .../clients/kroviz/webpack.config.d/minify.js      | 17 --------------
 .../clients/kroviz/webpack.config.d/webpack.js     |  9 ++++++++
 20 files changed, 72 insertions(+), 79 deletions(-)

diff --git a/incubator/clients/kroviz/build.gradle.kts b/incubator/clients/kroviz/build.gradle.kts
index 01502fd..116687c 100644
--- a/incubator/clients/kroviz/build.gradle.kts
+++ b/incubator/clients/kroviz/build.gradle.kts
@@ -48,13 +48,16 @@ kotlin {
                 outputFileName = "main.bundle.js"
                 sourceMaps = true
                 devServer = KotlinWebpackConfig.DevServer(
-                        open = false,
-                        port = 3000,
-                        proxy = mapOf(
-                                "/kv/*" to "http://localhost:8080",
-                                "/kvws/*" to mapOf("target" to "ws://localhost:8080", "ws" to true)
-                        ),
-                        contentBase = listOf("$buildDir/processedResources/js/main")
+                    open = false,
+                    port = 3000,
+                    proxy = mutableMapOf(
+                        "/kv/*" to "http://localhost:8080",
+                        "/kvws/*" to mapOf(
+                            "target" to "ws://localhost:8080",
+                            "ws" to true
+                        )
+                    ),
+                    static = mutableListOf("$buildDir/processedResources/js/main")
                 )
             }
             webpackTask {
@@ -127,9 +130,9 @@ afterEvaluate {
                     exec {
                         executable = getNodeJsBinaryExecutable()
                         args(
-                                "${rootProject.buildDir}/js/node_modules/gettext.js/bin/po2json",
-                                it.absolutePath,
-                                "${it.parent}/${it.nameWithoutExtension}.json"
+                            "${rootProject.buildDir}/js/node_modules/gettext.js/bin/po2json",
+                            it.absolutePath,
+                            "${it.parent}/${it.nameWithoutExtension}.json"
                         )
                         println("Converted ${it.name} to ${it.nameWithoutExtension}.json")
                     }
@@ -142,7 +145,7 @@ afterEvaluate {
             group = "package"
             destinationDirectory.set(file("$buildDir/libs"))
             val distribution =
-                    project.tasks.getByName("browserProductionWebpack", KotlinWebpack::class).destinationDirectory!!
+                project.tasks.getByName("browserProductionWebpack", KotlinWebpack::class).destinationDirectory!!
             from(distribution) {
                 include("*.*")
             }
diff --git a/incubator/clients/kroviz/gradle.properties b/incubator/clients/kroviz/gradle.properties
index 08feff5..0b171a6 100644
--- a/incubator/clients/kroviz/gradle.properties
+++ b/incubator/clients/kroviz/gradle.properties
@@ -18,8 +18,8 @@
 #
 javaVersion=1.8
 #Plugins
-systemProp.kotlinVersion=1.4.32
-serializationVersion=1.1.0
+systemProp.kotlinVersion=1.5.10
+serializationVersion=1.2.1
 #Dependencies
-systemProp.kvisionVersion=4.4.0
+systemProp.kvisionVersion=4.8.3
 kotlin.js.compiler=ir
diff --git a/incubator/clients/kroviz/settings.gradle.kts b/incubator/clients/kroviz/settings.gradle.kts
index 0e5d180..80a9293 100644
--- a/incubator/clients/kroviz/settings.gradle.kts
+++ b/incubator/clients/kroviz/settings.gradle.kts
@@ -21,11 +21,7 @@
 pluginManagement {
     repositories {
         mavenCentral()
-        jcenter()
         maven { url = uri("https://plugins.gradle.org/m2/") }
-        maven { url = uri("https://dl.bintray.com/kotlin/kotlin-eap") }
-        maven { url = uri("https://kotlin.bintray.com/kotlinx") }
-        maven { url = uri("https://dl.bintray.com/rjaros/kotlin") }
         mavenLocal()
     }
     resolutionStrategy {
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/aggregator/DomainTypesAggregator.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/aggregator/DomainTypesAggregator.kt
index 2240756..a3b2fc6 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/aggregator/DomainTypesAggregator.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/aggregator/DomainTypesAggregator.kt
@@ -49,6 +49,7 @@ class DomainTypesAggregator(val url: String) : BaseAggregator() {
     }
 
     private fun handleAction(obj: Action) {
+        console.log("[DTA.handleAction] $obj")
         throw Throwable("[DomainTypesAggregator.handleAction] not implemented yet")  //dsp.addData(obj)
     }
 
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/handler/CollectionHandler.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/handler/CollectionHandler.kt
index c5e70b5..8df6429 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/handler/CollectionHandler.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/handler/CollectionHandler.kt
@@ -24,7 +24,6 @@ import org.apache.isis.client.kroviz.to.TransferObject
 
 class CollectionHandler : BaseHandler() {
 
-    
     override fun parse(response: String): TransferObject {
         return Json.decodeFromString(Collection.serializer(), response)
     }
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/handler/IconHandler.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/handler/IconHandler.kt
index 3736ad9..467954b 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/handler/IconHandler.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/handler/IconHandler.kt
@@ -29,7 +29,7 @@ class IconHandler : BaseHandler() {
     }
 
     override fun parse(response: String): TransferObject? {
-        return Icon(response as Blob)
+        return Icon(response as Blob) //TODO
     }
 
 }
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/core/ColumnFactory.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/core/ColumnFactory.kt
index 1f14de3..dadaf10 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/core/ColumnFactory.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/core/ColumnFactory.kt
@@ -53,14 +53,7 @@ class ColumnFactory {
             displayCollection: CollectionDM,
             withCheckBox: Boolean = false): List<ColumnDefinition<dynamic>> {
 
-        val model = mutableListOf<dynamic>()
-        displayCollection.data.forEach {
-            model.add(it.asDynamic())
-        }
-        console.log("[CF.buildColumns]")
-        console.log(model::class.simpleName)
-        console.log(model)
-        val columns = mutableListOf<ColumnDefinition<dynamic>>()
+        val columns = mutableListOf<ColumnDefinition<Exposer>>()
         if (withCheckBox) {
             val checkBox = buildCheckBox()
             columns.add(checkBox)
@@ -71,7 +64,7 @@ class ColumnFactory {
             columns.add(menu)
 
             val icon = buildLinkIcon()
-            columns.add(icon)
+           columns.add(icon)
         }
 
         val propertyLabels = displayCollection.properties.list
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/core/FormPanelFactory.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/core/FormPanelFactory.kt
index 833c45f..9c0a852 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/core/FormPanelFactory.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/core/FormPanelFactory.kt
@@ -168,7 +168,7 @@ class FormPanelFactory(items: List<FormItem>) : VPanel() {
     private fun createImage(fi: FormItem): VPanel {
         val panel = VPanel {
             when (val fc = fi.content) {
-                fc is Image -> fc
+//                fc is Image -> fc
                 fc is String -> {
                     // interpret as (file) URL and load locally
                     console.log("[FPF.createImage]")
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/core/RoTable.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/core/RoTable.kt
index dcb68ad..be1fd79 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/core/RoTable.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/core/RoTable.kt
@@ -42,7 +42,8 @@ class RoTable(displayCollection: CollectionDM) : SimplePanel() {
     init {
         title = Utils.extractTitle(displayCollection.title)
         width = CssSize(100, UNIT.perc)
-        val model = displayCollection.data as List<Exposer>
+        val model = displayCollection.data
+//        val model = buildModel(displayCollection)
         val columns = ColumnFactory().buildColumns(
                 displayCollection,
                 true)
@@ -65,6 +66,19 @@ class RoTable(displayCollection: CollectionDM) : SimplePanel() {
         }
     }
 
+    private fun buildModel(displayCollection: CollectionDM) : List<dynamic> {
+        console.log("[RT.buildModel]")
+        val model = mutableListOf<Exposer>()
+        displayCollection.data.forEach {
+            console.log(it)
+            val record = it.asDynamic()
+            console.log(record["readOnlyProperty"])
+            model.add(record)
+            console.log(record)
+        }
+        return model
+    }
+
     fun <T : Any> Container.tabulator(
             data: List<T>? = null,
             dataUpdateOnEdit: Boolean = true,
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 ed81588..6801f14 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
@@ -67,7 +67,7 @@ object RoView {
         val index = tabPanel.activeIndex
         return if (index > 0) {
             val tabs = tabPanel.getTabs()
-            tabs.get(index) as SimplePanel
+            tabs.get(index)
         } else {
             null
         }
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 62fa8bc..079afcd 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
@@ -75,7 +75,7 @@ object IconManager {
         "OK" to "check",
         "Open" to "book",
         "Other" to "asterisk",
-        "Pin" to "pin",
+        "Pin" to "map-pin",
         "Primitives" to "hashtag",
         "Prototyping" to "object-group",
         "Queen" to "chess-queen",
@@ -98,6 +98,7 @@ object IconManager {
         "Wikipedia" to "wikipedia-w"
     )
 
+    @OptIn(ExperimentalStdlibApi::class)
     fun find(query: String): String {
         if (query.startsWith("fa")) return query
         val actionTitle = Utils.deCamel(query)
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/utils/Utils.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/utils/Utils.kt
index 2c64e9e..00861b2 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/utils/Utils.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/utils/Utils.kt
@@ -21,10 +21,10 @@ package org.apache.isis.client.kroviz.utils
 import org.apache.isis.client.kroviz.to.Argument
 import org.apache.isis.client.kroviz.to.Link
 import org.apache.isis.client.kroviz.to.TObject
-import kotlinx.serialization.json.Json
 
 object Utils {
 
+    @OptIn(ExperimentalStdlibApi::class)
     fun enCamel(input: String): String {
         var output = ""
         val words = input.split(" ")
@@ -34,15 +34,17 @@ object Utils {
         return decapitalize(output)
     }
 
+    @OptIn(ExperimentalStdlibApi::class)
     private fun decapitalize(input: String): String {
         val output = input.substring(1, input.length)
-        return input.first().toLowerCase() + output
+        return input.first().lowercaseChar() + output
     }
 
+    @OptIn(ExperimentalStdlibApi::class)
     fun deCamel(input: String): String {
         var output = ""
         for ((i, c) in input.withIndex()) {
-            val cuc = c.toUpperCase()
+            val cuc = c.uppercaseChar()
             if (i == 0) {
                 output += cuc
             } else {
@@ -105,10 +107,11 @@ object Utils {
     }
 
     internal fun argumentsAsString(
-            args: Map<String, Argument?>?,
-            start: String,
-            sep: String,
-            end: String): String {
+        args: Map<String, Argument?>?,
+        start: String,
+        sep: String,
+        end: String
+    ): String {
         return if (args.isNullOrEmpty()) "" else {
             var answer = start
             args.forEach { kv ->
@@ -122,10 +125,11 @@ object Utils {
     }
 
     internal fun argumentsAsList(
-            args: Map<String, Argument?>?,
-            start: String,
-            sep: String,
-            end: String): String {
+        args: Map<String, Argument?>?,
+        start: String,
+        sep: String,
+        end: String
+    ): String {
         return if (args.isNullOrEmpty()) "" else {
             var answer = start
             args.forEach { kv ->
diff --git a/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/core/aggregator/CollectionAggregatorTest.kt b/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/core/aggregator/CollectionAggregatorTest.kt
index 541217b..b42f1d2 100644
--- a/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/core/aggregator/CollectionAggregatorTest.kt
+++ b/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/core/aggregator/CollectionAggregatorTest.kt
@@ -70,7 +70,8 @@ class CollectionAggregatorTest : IntegrationTest() {
             val property = pdLe.getTransferObject() as Property
             assertTrue(propertyLabels.size > 0)  // 5
             val lbl = dl.properties.find(property.id)!!
-            assertEquals("ResultListResult class", lbl)  // 6
+            val expected = "ResultListResult class"
+            assertEquals(expected, lbl)  // 6
         }
     }
 
diff --git a/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/snapshots/demo2_0_0/Response2Handler.kt b/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/snapshots/demo2_0_0/Response2Handler.kt
index b1c6fc0..a47956c 100644
--- a/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/snapshots/demo2_0_0/Response2Handler.kt
+++ b/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/snapshots/demo2_0_0/Response2Handler.kt
@@ -24,7 +24,7 @@ object Response2Handler {
 
     val map = mapOf(
             ACTIONS_STRINGS to ActionHandler(),
-//            ACTIONS_STRINGS_INVOKE to TObjectHandler(),    // comented out due to issues with object-icon
+//            ACTIONS_STRINGS_INVOKE to TObjectHandler(),    // commented out due to issues with object-icon
             ACTIONS_WHEREINTHEWORLD_INVOKE to TObjectHandler(),
             ACTIONS_TEXT_INVOKE to TObjectHandler(),
             ASSOCIATED_ACTION_OBJECT_LAYOUT to LayoutHandler(),
diff --git a/incubator/clients/kroviz/webpack.config.d/bootstrap.js b/incubator/clients/kroviz/webpack.config.d/bootstrap.js
index 35b28e6..46c1bca 100644
--- a/incubator/clients/kroviz/webpack.config.d/bootstrap.js
+++ b/incubator/clients/kroviz/webpack.config.d/bootstrap.js
@@ -1,3 +1,3 @@
-config.module.rules.push({test: /\.(woff|woff2)(\?v=\d+\.\d+\.\d+)?$/, loader: 'url-loader?limit=10000&mimetype=application/font-woff'});
-config.module.rules.push({test: /\.ttf(\?v=\d+\.\d+\.\d+)?$/, loader: 'url-loader?limit=10000&mimetype=application/octet-stream'});
-config.module.rules.push({test: /\.eot(\?v=\d+\.\d+\.\d+)?$/, loader: 'file-loader'});
+config.module.rules.push({test: /\.(woff|woff2)(\?v=\d+\.\d+\.\d+)?$/, type: 'asset'});
+config.module.rules.push({test: /\.ttf(\?v=\d+\.\d+\.\d+)?$/, type: 'asset'});
+config.module.rules.push({test: /\.eot(\?v=\d+\.\d+\.\d+)?$/, type: 'asset/resource'});
\ No newline at end of file
diff --git a/incubator/clients/kroviz/webpack.config.d/css.js b/incubator/clients/kroviz/webpack.config.d/css.js
index 5d710d3..3b41ac1 100644
--- a/incubator/clients/kroviz/webpack.config.d/css.js
+++ b/incubator/clients/kroviz/webpack.config.d/css.js
@@ -1,2 +1 @@
-config.module.rules.push({ test: /\.css$/, loader: "style-loader!css-loader" });
-
+config.module.rules.push({ test: /\.css$/, use: ["style-loader", { loader: "css-loader", options: {sourceMap: false} } ] });
\ No newline at end of file
diff --git a/incubator/clients/kroviz/webpack.config.d/file.js b/incubator/clients/kroviz/webpack.config.d/file.js
index 653ca21..aa64925 100644
--- a/incubator/clients/kroviz/webpack.config.d/file.js
+++ b/incubator/clients/kroviz/webpack.config.d/file.js
@@ -1,9 +1,6 @@
 config.module.rules.push(
     {
         test: /\.(jpe?g|png|gif|svg)$/i,
-        loader: 'file-loader',
-        options: {
-              esModule: false,
-        },
+        type: 'asset/resource'
     }
 );
diff --git a/incubator/clients/kroviz/webpack.config.d/jed.js b/incubator/clients/kroviz/webpack.config.d/jed.js
deleted file mode 100644
index 9a970dd..0000000
--- a/incubator/clients/kroviz/webpack.config.d/jed.js
+++ /dev/null
@@ -1,7 +0,0 @@
-;(function() {
-    const webpack = require('webpack')
-
-    config.plugins.push(new webpack.ProvidePlugin({
-	Jed: "jed"
-    }));
-})();
diff --git a/incubator/clients/kroviz/webpack.config.d/minify.js b/incubator/clients/kroviz/webpack.config.d/minify.js
deleted file mode 100644
index 62d97b8..0000000
--- a/incubator/clients/kroviz/webpack.config.d/minify.js
+++ /dev/null
@@ -1,17 +0,0 @@
-if (!config.devServer) {
-    ;(function() {
-        const UglifyJSPlugin = require('uglifyjs-webpack-plugin');
-
-        config.optimization = {
-            minimizer: [
-                 new UglifyJSPlugin({
-                    uglifyOptions: {
-                        compress: {
-                            unused: false
-                        }
-                    }
-                 })
-            ]
-        }
-    })();
-}
diff --git a/incubator/clients/kroviz/webpack.config.d/webpack.js b/incubator/clients/kroviz/webpack.config.d/webpack.js
index 84ade10..b7edd08 100644
--- a/incubator/clients/kroviz/webpack.config.d/webpack.js
+++ b/incubator/clients/kroviz/webpack.config.d/webpack.js
@@ -3,4 +3,13 @@ config.resolve.modules.push("../../processedResources/js/main");
 if (config.devServer) {
     config.devServer.hot = true;
     config.devtool = 'eval-cheap-source-map';
+} else {
+    config.devtool = undefined;
 }
+
+// disable bundle size warning
+config.performance = {
+    assetFilter: function (assetFilename) {
+        return !assetFilename.endsWith('.js');
+    },
+};
\ No newline at end of file

[isis] 02/07: ISIS-2505 Credits/Icons/Buttons in RoStatusBar

Posted by jo...@apache.org.
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 5e2ed9ce1773d975138693297bbfeae3d9566a48
Author: Jörg Rade <jo...@kuehne-nagel.com>
AuthorDate: Wed Jun 23 15:45:24 2021 +0200

    ISIS-2505 Credits/Icons/Buttons in RoStatusBar
---
 .../apache/isis/client/kroviz/to/bs3/Property.kt   |  6 ++--
 .../apache/isis/client/kroviz/ui/core/RoMenuBar.kt |  2 +-
 .../isis/client/kroviz/ui/core/RoStatusBar.kt      | 33 +++++++++++++++++-----
 .../kroviz/src/main/resources/css/kroviz.css       | 19 +++++++++++--
 4 files changed, 48 insertions(+), 12 deletions(-)

diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/to/bs3/Property.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/to/bs3/Property.kt
index a9f245d..e42ee6e 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/to/bs3/Property.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/to/bs3/Property.kt
@@ -26,7 +26,7 @@ import org.w3c.dom.asList
 class Property(node: Node) {
     var id: String
     var link: Link? = null
-    var hidden: String // USE ENUM Where? = null
+    var hidden: String = "" // USE ENUM Where? = null
     var typicalLength: Int = 0
     var multiLine: Int = 1
     var describedAs: String? = null
@@ -35,7 +35,9 @@ class Property(node: Node) {
 
     init {
         val dn = node.asDynamic()
-        hidden = dn.getAttribute("hidden")
+        if (dn.hasOwnProperty("hidden")) {
+            id = dn.getAttribute("hidden") as String
+        }
         id = dn.getAttribute("id") as String
         typicalLength = dn.getAttribute("typicalLength")
         multiLine = dn.getAttribute("multiLine")
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 c7c4565..820ae1f 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
@@ -146,7 +146,7 @@ object RoMenuBar : SimplePanel() {
     }
 
     private fun logoButton() {
-        val classes = setOf("logo-button-image", "logo-button")
+        val classes = setOf("isis-logo-button-image", "logo-button")
         val logo = Button("", style = ButtonStyle.LINK, classes = classes)
                 .onClick {
                     window.open("https://isis.apache.org")
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/core/RoStatusBar.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/core/RoStatusBar.kt
index a8d0020..ee5bd00 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/core/RoStatusBar.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/core/RoStatusBar.kt
@@ -18,13 +18,6 @@
  */
 package org.apache.isis.client.kroviz.ui.core
 
-import org.apache.isis.client.kroviz.core.event.EventState
-import org.apache.isis.client.kroviz.core.event.LogEntry
-import org.apache.isis.client.kroviz.core.model.DiagramDM
-import org.apache.isis.client.kroviz.ui.dialog.DiagramDialog
-import org.apache.isis.client.kroviz.ui.dialog.NotificationDialog
-import org.apache.isis.client.kroviz.ui.diagram.ClassDiagram
-import org.apache.isis.client.kroviz.utils.IconManager
 import io.kvision.core.*
 import io.kvision.html.Button
 import io.kvision.html.ButtonStyle
@@ -32,6 +25,14 @@ import io.kvision.navbar.Nav
 import io.kvision.navbar.Navbar
 import io.kvision.navbar.NavbarType
 import io.kvision.panel.SimplePanel
+import kotlinx.browser.window
+import org.apache.isis.client.kroviz.core.event.EventState
+import org.apache.isis.client.kroviz.core.event.LogEntry
+import org.apache.isis.client.kroviz.core.model.DiagramDM
+import org.apache.isis.client.kroviz.ui.diagram.ClassDiagram
+import org.apache.isis.client.kroviz.ui.dialog.DiagramDialog
+import org.apache.isis.client.kroviz.ui.dialog.NotificationDialog
+import org.apache.isis.client.kroviz.utils.IconManager
 
 object RoStatusBar {
     val navbar = Navbar(
@@ -55,6 +56,8 @@ object RoStatusBar {
 
     init {
         navbar.add(nav)
+        nav.add(isisButton())
+        nav.add(kvisionButton())
         nav.add(lastError)
         nav.add(classDiagram)
         nav.add(userBtn)
@@ -112,4 +115,20 @@ object RoStatusBar {
         notify(text)
     }
 
+    private fun isisButton(): Button {
+        val classes = setOf("isis-logo-button-image", "logo-button")
+        return Button("", style = ButtonStyle.LINK, classes = classes)
+                .onClick {
+                    window.open("https://isis.apache.org")
+                }
+    }
+
+    private fun kvisionButton(): Button {
+        val classes = setOf("kvision-logo-button-image", "logo-button")
+        return Button("", style = ButtonStyle.LINK, classes = classes)
+                .onClick {
+                    window.open("https://kvision.io")
+                }
+    }
+
 }
diff --git a/incubator/clients/kroviz/src/main/resources/css/kroviz.css b/incubator/clients/kroviz/src/main/resources/css/kroviz.css
index 0035168..7f6c23e 100644
--- a/incubator/clients/kroviz/src/main/resources/css/kroviz.css
+++ b/incubator/clients/kroviz/src/main/resources/css/kroviz.css
@@ -137,9 +137,9 @@ div {
     /* font-family: Chicago, sans-serif;*/
 }
 
-.logo-button-image:before {
+.isis-logo-button-image:before {
     content: "";
-    width: 75px;
+    width: 65px;
     height: 40px;
     display: inline-block;
     vertical-align: text-top;
@@ -151,6 +151,21 @@ div {
     background-image: url("https://svn.apache.org/repos/asf/comdev/project-logos/originals/isis.svg");
 }
 
+.kvision-logo-button-image:before {
+    content: "";
+    width: 25px;
+    height: 40px;
+    display: inline-block;
+    vertical-align: text-top;
+    background-color: transparent;
+    background-position: center center;
+    background-repeat: no-repeat;
+    background-size: contain, cover;
+    background-image: url("https://kvision.io/0cdf370d4484d5f175f0.svg");
+}
+
+
+
 .kv-window {
     /* background-color: rgba(255,255,255, 0) !important;*/
 }

[isis] 06/07: ISIS-2505 CollectionProperties reklated tests fixed - data not rendered yet

Posted by jo...@apache.org.
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 8737135dae4d4375177ac546df44a5b413e85c98
Author: Jörg Rade <jo...@kuehne-nagel.com>
AuthorDate: Sun Jul 4 10:14:14 2021 +0200

    ISIS-2505 CollectionProperties reklated tests fixed - data not rendered yet
---
 .../kroviz/core/aggregator/AggregatorWithLayout.kt |   2 +-
 .../{Properties.kt => CollectionProperties.kt}     |  61 ++--
 .../kroviz/core/model/DisplayModelWithLayout.kt    |  12 +-
 .../isis/client/kroviz/ui/builder/ColBuilder.kt    |   4 -
 .../isis/client/kroviz/ui/core/ColumnFactory.kt    |  19 +-
 .../apache/isis/client/kroviz/ui/core/RoTable.kt   |   2 +-
 .../isis/client/kroviz/ui/panel/EventLogTable.kt   |   5 +-
 .../core/aggregator/CollectionAggregatorTest.kt    |   4 +-
 .../client/kroviz/core/model/CollectionDMTest.kt   |   6 +-
 .../snapshots/demo2_0_0/ACTIONS_STRINGS_INVOKE.kt  | 344 ++++++++-------------
 .../kroviz/snapshots/demo2_0_0/Response2Handler.kt |   2 +-
 .../org/apache/isis/client/kroviz/to/LinkTest.kt   |  12 +-
 .../apache/isis/client/kroviz/to/TObjectTest.kt    |   6 +-
 13 files changed, 197 insertions(+), 282 deletions(-)

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 639f43f..6d98fef 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
@@ -11,7 +11,7 @@ abstract class AggregatorWithLayout : BaseAggregator() {
     protected fun handleLayout(layout: Layout, dm: DisplayModelWithLayout) {
         if (dm.layout == null) {
             dm.addLayout(layout)
-            dm.propertyLayoutList.forEach { p ->
+            dm.properties.propertyLayoutList.forEach { p ->
                 val l = p.link!!
                 val isDn = l.href.contains("datanucleus")
                 if (!isDn) {
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/model/Properties.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/model/CollectionProperties.kt
similarity index 55%
rename from incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/model/Properties.kt
rename to incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/model/CollectionProperties.kt
index 6c00954..d1c653d 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/model/Properties.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/model/CollectionProperties.kt
@@ -22,38 +22,56 @@ import org.apache.isis.client.kroviz.layout.PropertyLt
 import org.apache.isis.client.kroviz.to.Extensions
 import org.apache.isis.client.kroviz.to.Property
 
-class Properties() {
-    val list = mutableListOf<PropertyFacade>()
+class CollectionProperties() {
+    val list = mutableListOf<ColumnProperties>()
+    var propertyDescriptionList = mutableListOf<Property>()
+    var propertyLayoutList = mutableListOf<PropertyLt>()
+    var propertyList = mutableListOf<Property>()
+
+    fun readyForDisplay(): Boolean {
+        val ps = propertyList.size
+        val pls = propertyLayoutList.size
+        val pds = propertyDescriptionList.size
+        val descriptionsComplete = (pds >= pls) && (pds >= ps)
+        return descriptionsComplete
+    }
 
     fun addProperty(property: Property) {
+        propertyList.add(property)
         val id = property.id
-        val pf = findOrCreate(id)
-        pf.property = property
+        val cp = findOrCreate(id)
+        cp.property = property
     }
 
     fun addAllPropertyLayout(layoutList: List<PropertyLt>) {
+        propertyLayoutList.addAll(layoutList)
         fun addPropertyLayout(layout: PropertyLt) {
             val id = layout.id!!
-            val pf = findOrCreate(id)
-            pf.layout = layout
+            val cp = findOrCreate(id)
+            cp.initLayout(layout)
         }
         layoutList.forEach { addPropertyLayout(it) }
     }
 
     fun addPropertyDescription(description: Property) {
+        propertyDescriptionList.add(description)
         val id = description.id
-        val pf = findOrCreate(id)
+        val cp = findOrCreate(id)
         val e: Extensions = description.extensions!!
-        pf.friendlyName = e.friendlyName
+        cp.friendlyName = e.friendlyName
     }
 
-    private fun findOrCreate(id: String): PropertyFacade {
-        var pf = list.find { it.key == id }
-        if (pf == null) {
-            pf = PropertyFacade(id)
-            list.add(pf)
+    private fun findOrCreate(id: String): ColumnProperties {
+        var cp = find(id)
+        if (cp == null) {
+            cp = ColumnProperties(id)
+            list.add(cp)
         }
-        return pf
+        return cp
+    }
+
+    fun find(id: String): ColumnProperties? {
+        return list.find { it.key == id }
     }
 
 }
@@ -62,21 +80,20 @@ class Properties() {
  * Properties have three aspects:
  *
  * - Member of a DomainObject
- * - Description (labels, friendlyName)
- * - Layout
+ * - Description (friendlyName, etc.)
+ * - Layout (hidden, etc.)
  *
  * All three are required in order to display correctly in a table.
  */
-class PropertyFacade(val key: String) {
+class ColumnProperties(val key: String) {
     var property: Property? = null
     var friendlyName: String = ""
     var layout: PropertyLt? = null
+    var hidden: Boolean = true
 
-    fun hidden(): Boolean {
-        if (layout != null) {
-            return (layout!!.hidden != null)
-        }
-        return false
+    fun initLayout(layout: PropertyLt) {
+        this.layout = layout
+        hidden = (layout.hidden != null)
     }
 
 }
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/model/DisplayModelWithLayout.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/model/DisplayModelWithLayout.kt
index 467680a..d8e591b 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/model/DisplayModelWithLayout.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/model/DisplayModelWithLayout.kt
@@ -19,7 +19,6 @@
 package org.apache.isis.client.kroviz.core.model
 
 import org.apache.isis.client.kroviz.layout.Layout
-import org.apache.isis.client.kroviz.layout.PropertyLt
 import org.apache.isis.client.kroviz.layout.RowLt
 import org.apache.isis.client.kroviz.to.Property
 import org.apache.isis.client.kroviz.to.bs3.Grid
@@ -28,17 +27,14 @@ abstract class DisplayModelWithLayout : DisplayModel() {
 
     var layout: Layout? = null
     var grid: Grid? = null
-    var propertyDescriptionList = mutableListOf<Property>()
-    var propertyLayoutList = mutableListOf<PropertyLt>()
-    val properties = Properties()
+    val properties = CollectionProperties()
 
     override fun canBeDisplayed(): Boolean {
         return when {
             isRendered -> false
             layout == null -> false
             grid == null -> false
-            propertyDescriptionList.isEmpty() -> false
-            else -> true
+            else -> properties.readyForDisplay()
         }
     }
 
@@ -57,9 +53,6 @@ abstract class DisplayModelWithLayout : DisplayModel() {
         r.cols.forEach { cs ->
             val c = cs.getCol()
             c.fieldSet.forEach { fs ->
-                console.log("[DMWL.initLayout4Row]")
-                console.log(fs.property)
-                propertyLayoutList.addAll(fs.property)
                 properties.addAllPropertyLayout(fs.property)
             }
             c.tabGroup.forEach { tg ->
@@ -73,7 +66,6 @@ abstract class DisplayModelWithLayout : DisplayModel() {
     }
 
     fun addPropertyDescription(p: Property) {
-        propertyDescriptionList.add(p)
         properties.addPropertyDescription(p)
     }
 
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/builder/ColBuilder.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/builder/ColBuilder.kt
index e6188c3..f746902 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/builder/ColBuilder.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/builder/ColBuilder.kt
@@ -59,13 +59,9 @@ class ColBuilder : UiBuilder() {
             panel.add(rowCpt)
         }
         for (c in col.collectionList) {
-            console.log("[CB.create]")
-            // analogous to UiManager.openCollectionView
             val key = c.id  // entities
             val objectDM = dsp.displayModel
             val collectionDM = objectDM.collections.get(key)!!
-            console.log(collectionDM.grid)
-            console.log(collectionDM.layout)
             val tblCpt = RoTable(collectionDM)
             val fsPanel = FieldsetPanel(legend = key.capitalize()).add(tblCpt)
             panel.add(fsPanel)
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/core/ColumnFactory.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/core/ColumnFactory.kt
index 31ed7d6..1f14de3 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/core/ColumnFactory.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/core/ColumnFactory.kt
@@ -53,15 +53,20 @@ class ColumnFactory {
             displayCollection: CollectionDM,
             withCheckBox: Boolean = false): List<ColumnDefinition<dynamic>> {
 
+        val model = mutableListOf<dynamic>()
+        displayCollection.data.forEach {
+            model.add(it.asDynamic())
+        }
         console.log("[CF.buildColumns]")
-        console.log(displayCollection)
+        console.log(model::class.simpleName)
+        console.log(model)
         val columns = mutableListOf<ColumnDefinition<dynamic>>()
         if (withCheckBox) {
             val checkBox = buildCheckBox()
             columns.add(checkBox)
         }
 
-        if (hasIcon(displayCollection)) {
+        if (hasIcon(displayCollection.data)) {
             val menu = buildMenu()
             columns.add(menu)
 
@@ -71,12 +76,11 @@ class ColumnFactory {
 
         val propertyLabels = displayCollection.properties.list
         for (pl in propertyLabels) {
-            console.log("[CF.buildColumns]")
-            console.log(pl.hidden())
-            if (!pl.hidden()) {
+            if (!pl.hidden) {
                 val id = pl.key
+                console.log("id: $id")
                 val friendlyName = pl.friendlyName
-                var cd = ColumnDefinition<Exposer>(
+                var cd = ColumnDefinition<dynamic>(
                         title = friendlyName,
                         field = id,
                         headerFilter = Editor.INPUT)
@@ -89,8 +93,7 @@ class ColumnFactory {
         return columns
     }
 
-    private fun hasIcon(displayCollection: CollectionDM): Boolean {
-        val model = displayCollection.data as List<dynamic>
+    private fun hasIcon(model: List<dynamic>): Boolean {
         return (model[0].hasOwnProperty("iconName") as Boolean)
     }
 
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/core/RoTable.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/core/RoTable.kt
index 9b0b750..dcb68ad 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/core/RoTable.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/core/RoTable.kt
@@ -42,7 +42,7 @@ class RoTable(displayCollection: CollectionDM) : SimplePanel() {
     init {
         title = Utils.extractTitle(displayCollection.title)
         width = CssSize(100, UNIT.perc)
-        val model = displayCollection.data
+        val model = displayCollection.data as List<Exposer>
         val columns = ColumnFactory().buildColumns(
                 displayCollection,
                 true)
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/panel/EventLogTable.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/panel/EventLogTable.kt
index 15ca0a1..e698973 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/panel/EventLogTable.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/panel/EventLogTable.kt
@@ -27,10 +27,7 @@ import io.kvision.tabulator.*
 import io.kvision.utils.obj
 import io.kvision.utils.px
 import org.apache.isis.client.kroviz.core.event.LogEntry
-import org.apache.isis.client.kroviz.to.HasLinks
-import org.apache.isis.client.kroviz.to.Relation
 import org.apache.isis.client.kroviz.to.TObject
-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.ui.dialog.EventLogDetail
@@ -116,7 +113,7 @@ class EventLogTable(val model: List<LogEntry>) : VPanel() {
         return b
     }
 
-    fun shorten(url: String): String {
+    private fun shorten(url: String): String {
         var result = url
         val signature = Constants.restInfix
         if (url.contains(signature)) {
diff --git a/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/core/aggregator/CollectionAggregatorTest.kt b/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/core/aggregator/CollectionAggregatorTest.kt
index 8328820..541217b 100644
--- a/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/core/aggregator/CollectionAggregatorTest.kt
+++ b/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/core/aggregator/CollectionAggregatorTest.kt
@@ -66,10 +66,10 @@ class CollectionAggregatorTest : IntegrationTest() {
 
             // then
             val dl = obs.dpm as CollectionDM
-            val propertyLabels = dl.propertyDescriptionList
+            val propertyLabels = dl.properties.propertyDescriptionList
             val property = pdLe.getTransferObject() as Property
             assertTrue(propertyLabels.size > 0)  // 5
-            val lbl = propertyLabels.get(property.id)!!
+            val lbl = dl.properties.find(property.id)!!
             assertEquals("ResultListResult class", lbl)  // 6
         }
     }
diff --git a/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/core/model/CollectionDMTest.kt b/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/core/model/CollectionDMTest.kt
index 7dc6ac4..2cbb74c 100644
--- a/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/core/model/CollectionDMTest.kt
+++ b/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/core/model/CollectionDMTest.kt
@@ -43,7 +43,7 @@ class CollectionDMTest {
 
         assertEquals(2, dl.data.size) //1
 
-        val properties = dl.propertyLayoutList
+        val properties = dl.properties.propertyLayoutList
         assertEquals(5, properties.size) //2    // includes datanucleus IdLong, VersionLong, VersionTimestamp
         assertEquals("name", properties[0].id) //3
         assertEquals("notes", properties[1].id)  //4
@@ -61,7 +61,7 @@ class CollectionDMTest {
         dl.addLayout(lt)
         assertEquals(1, dl.data.size) //1
 
-        val properties = dl.propertyLayoutList
+        val properties = dl.properties.propertyLayoutList
         assertEquals("key", properties[0].id) // 2
         assertEquals("value", properties[1].id)   // 3
     }
@@ -78,7 +78,7 @@ class CollectionDMTest {
         assertEquals(1, dl.data.size)
 
         assertNotNull(dl.layout)
-        val properties = dl.propertyList
+        val properties = dl.properties.propertyList
         assertNotNull(properties)
         //Sequence in FR_OBJECT differs from sequence in FR_OBJECT_LAYOUT
         // FR_OBJECT: fixtureScriptClassName, key, object, className
diff --git a/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/snapshots/demo2_0_0/ACTIONS_STRINGS_INVOKE.kt b/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/snapshots/demo2_0_0/ACTIONS_STRINGS_INVOKE.kt
index c61c613..38c4d57 100644
--- a/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/snapshots/demo2_0_0/ACTIONS_STRINGS_INVOKE.kt
+++ b/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/snapshots/demo2_0_0/ACTIONS_STRINGS_INVOKE.kt
@@ -24,226 +24,132 @@ object ACTIONS_STRINGS_INVOKE : Response() {
     override val url = "http://localhost:8080/restful/objects/demo.JavaLangTypesMenu/1/actions/strings/invoke"
     override val str = """
 {
-  "links": [
-    {
-      "rel": "self",
-      "href": "https://demo-wicket.isis.incode.work/restful/objects/demo.JavaLangStrings/PADw_eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPz4KPERlbW8vPgo=",
-      "method": "GET",
-      "type": "application/json;profile=\"urn:org.restfulobjects:repr-types/object\"",
-      "title": "String data type"
-    },
-    {
-      "rel": "describedby",
-      "href": "https://demo-wicket.isis.incode.work/restful/domain-types/demo.JavaLangStrings",
-      "method": "GET",
-      "type": "application/json;profile=\"urn:org.restfulobjects:repr-types/domain-type\""
-    },
-    {
-      "rel": "urn:org.apache.isis.restfulobjects:rels/object-layout",
-      "href": "https://demo-wicket.isis.incode.work/restful/objects/demo.JavaLangStrings/PADw_eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPz4KPERlbW8vPgo=/object-layout",
-      "method": "GET",
-      "type": "application/json;profile=\"urn:org.restfulobjects:repr-types/object-layout-bs3\""
-    },
-    {
-      "rel": "urn:org.apache.isis.restfulobjects:rels/object-icon",
-      "href": "https://demo-wicket.isis.incode.work/restful/objects/demo.JavaLangStrings/PADw_eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPz4KPERlbW8vPgo=/image",
-      "method": "GET",
-      "type": "image/png"
-    },
-    {
-      "rel": "urn:org.restfulobjects:rels/update",
-      "href": "https://demo-wicket.isis.incode.work/restful/objects/demo.JavaLangStrings:PADw_eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPz4KPERlbW8vPgo=",
-      "method": "PUT",
-      "type": "application/json;profile=\"urn:org.restfulobjects:repr-types/object\"",
-      "arguments": {}
-    }
-  ],
-  "extensions": {
-    "oid": "demo.JavaLangStrings:PADw_eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPz4KPERlbW8vPgo=",
-    "isService": false,
-    "isPersistent": true
+  "links" : [ {
+    "rel" : "self",
+    "href" : "http://localhost:8080/restful/objects/demo.JavaLangStrings/PADw_eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPz4KPERlbW8vPgo=",
+    "method" : "GET",
+    "type" : "application/json;profile=\"urn:org.restfulobjects:repr-types/object\"",
+    "title" : "String data type"
+  }, {
+    "rel" : "describedby",
+    "href" : "http://localhost:8080/restful/domain-types/demo.JavaLangStrings",
+    "method" : "GET",
+    "type" : "application/json;profile=\"urn:org.restfulobjects:repr-types/domain-type\""
+  }, {
+    "rel" : "urn:org.apache.isis.restfulobjects:rels/object-layout",
+    "href" : "http://localhost:8080/restful/objects/demo.JavaLangStrings/PADw_eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPz4KPERlbW8vPgo=/object-layout",
+    "method" : "GET",
+    "type" : "application/json;profile=\"urn:org.restfulobjects:repr-types/object-layout-bs3\""
+  }, {
+    "rel" : "urn:org.apache.isis.restfulobjects:rels/object-icon",
+    "href" : "http://localhost:8080/restful/objects/demo.JavaLangStrings/PADw_eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPz4KPERlbW8vPgo=/object-icon",
+    "method" : "GET",
+    "type" : "image/*"
+  }, {
+    "rel" : "urn:org.restfulobjects:rels/update",
+    "href" : "http://localhost:8080/restful/objects/demo.JavaLangStrings:PADw_eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPz4KPERlbW8vPgo=",
+    "method" : "PUT",
+    "type" : "application/json;profile=\"urn:org.restfulobjects:repr-types/object\"",
+    "arguments" : { }
+  } ],
+  "extensions" : {
+    "oid" : "demo.JavaLangStrings:PADw_eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPz4KPERlbW8vPgo=",
+    "isService" : false,
+    "isPersistent" : true
   },
-  "title": "String data type",
-  "domainType": "demo.JavaLangStrings",
-  "instanceId": "PADw_eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPz4KPERlbW8vPgo=",
-  "members": {
-    "description": {
-      "id": "description",
-      "memberType": "property",
-      "links": [
-        {
-          "rel": "urn:org.restfulobjects:rels/details;property=\"description\"",
-          "href": "https://demo-wicket.isis.incode.work/restful/objects/demo.JavaLangStrings/PADw_eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPz4KPERlbW8vPgo=/properties/description",
-          "method": "GET",
-          "type": "application/json;profile=\"urn:org.restfulobjects:repr-types/object-property\""
-        }
-      ],
-      "value": "<div class=\"paragraph\">\n<p>The framework has built-in support for the <code>String</code> data type.</p>\n</div>\n<div class=\"paragraph\">\n<p>From here you can:</p>\n</div>\n<div class=\"ulist\">\n<ul>\n<li>\n<p>navigate to an entity that uses the <code>String</code> datatype</p>\n</li>\n<li>\n<p>open a view model that uses the <code>String</code> datatype</p>\n</li>\n</ul>\n</div>\n<div class=\"paragraph\">\n<p>Some properties on these domain objects are mandatory,  [...]
-      "format": "string",
-      "extensions": {
-        "": "string"
-      },
-      "disabledReason": "Contributed property"
-    },
-    "objectType": {
-      "id": "objectType",
-      "memberType": "property",
-      "links": [
-        {
-          "rel": "urn:org.restfulobjects:rels/details;property=\"objectType\"",
-          "href": "https://demo-wicket.isis.incode.work/restful/objects/demo.JavaLangStrings/PADw_eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPz4KPERlbW8vPgo=/properties/objectType",
-          "method": "GET",
-          "type": "application/json;profile=\"urn:org.restfulobjects:repr-types/object-property\""
-        }
-      ],
-      "value": "demo.JavaLangStrings",
-      "extensions": {
-        "x-isis-format": "string"
-      },
-      "disabledReason": "Contributed property"
-    },
-    "objectIdentifier": {
-      "id": "objectIdentifier",
-      "memberType": "property",
-      "links": [
-        {
-          "rel": "urn:org.restfulobjects:rels/details;property=\"objectIdentifier\"",
-          "href": "https://demo-wicket.isis.incode.work/restful/objects/demo.JavaLangStrings/PADw_eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPz4KPERlbW8vPgo=/properties/objectIdentifier",
-          "method": "GET",
-          "type": "application/json;profile=\"urn:org.restfulobjects:repr-types/object-property\""
-        }
-      ],
-      "value": "»1a9012b0",
-      "extensions": {
-        "x-isis-format": "string"
-      },
-      "disabledReason": "Contributed property"
-    },
-    "sources": {
-      "id": "sources",
-      "memberType": "property",
-      "links": [
-        {
-          "rel": "urn:org.restfulobjects:rels/details;property=\"sources\"",
-          "href": "https://demo-wicket.isis.incode.work/restful/objects/demo.JavaLangStrings/PADw_eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPz4KPERlbW8vPgo=/properties/sources",
-          "method": "GET",
-          "type": "application/json;profile=\"urn:org.restfulobjects:repr-types/object-property\""
-        }
-      ],
-      "value": "<div class=\"paragraph\">\n<p><a href=\"https://github.com/apache/isis/tree/master/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/strings\">Sources</a> for this demo</p>\n</div>",
-      "format": "string",
-      "extensions": {
-        "x-isis-format": "string"
-      },
-      "disabledReason": "Contributed property"
-    },
-    "entities": {
-      "id": "entities",
-      "memberType": "collection",
-      "links": [
-        {
-          "rel": "urn:org.restfulobjects:rels/details;collection=\"entities\"",
-          "href": "https://demo-wicket.isis.incode.work/restful/objects/demo.JavaLangStrings/PADw_eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPz4KPERlbW8vPgo=/collections/entities",
-          "method": "GET",
-          "type": "application/json;profile=\"urn:org.restfulobjects:repr-types/object-collection\""
-        }
-      ]
-    },
-    "openViewModel": {
-      "id": "openViewModel",
-      "memberType": "action",
-      "links": [
-        {
-          "rel": "urn:org.restfulobjects:rels/details;action=\"openViewModel\"",
-          "href": "https://demo-wicket.isis.incode.work/restful/objects/demo.JavaLangStrings/PADw_eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPz4KPERlbW8vPgo=/actions/openViewModel",
-          "method": "GET",
-          "type": "application/json;profile=\"urn:org.restfulobjects:repr-types/object-action\""
-        }
-      ]
-    },
-    "clearHints": {
-      "id": "clearHints",
-      "memberType": "action",
-      "links": [
-        {
-          "rel": "urn:org.restfulobjects:rels/details;action=\"clearHints\"",
-          "href": "https://demo-wicket.isis.incode.work/restful/objects/demo.JavaLangStrings/PADw_eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPz4KPERlbW8vPgo=/actions/clearHints",
-          "method": "GET",
-          "type": "application/json;profile=\"urn:org.restfulobjects:repr-types/object-action\""
-        }
-      ]
-    },
-    "downloadMetamodelXml": {
-      "id": "downloadMetamodelXml",
-      "memberType": "action",
-      "links": [
-        {
-          "rel": "urn:org.restfulobjects:rels/details;action=\"downloadMetamodelXml\"",
-          "href": "https://demo-wicket.isis.incode.work/restful/objects/demo.JavaLangStrings/PADw_eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPz4KPERlbW8vPgo=/actions/downloadMetamodelXml",
-          "method": "GET",
-          "type": "application/json;profile=\"urn:org.restfulobjects:repr-types/object-action\""
-        }
-      ]
-    },
-    "rebuildMetamodel": {
-      "id": "rebuildMetamodel",
-      "memberType": "action",
-      "links": [
-        {
-          "rel": "urn:org.restfulobjects:rels/details;action=\"rebuildMetamodel\"",
-          "href": "https://demo-wicket.isis.incode.work/restful/objects/demo.JavaLangStrings/PADw_eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPz4KPERlbW8vPgo=/actions/rebuildMetamodel",
-          "method": "GET",
-          "type": "application/json;profile=\"urn:org.restfulobjects:repr-types/object-action\""
-        }
-      ]
-    },
-    "downloadLayoutXml": {
-      "id": "downloadLayoutXml",
-      "memberType": "action",
-      "links": [
-        {
-          "rel": "urn:org.restfulobjects:rels/details;action=\"downloadLayoutXml\"",
-          "href": "https://demo-wicket.isis.incode.work/restful/objects/demo.JavaLangStrings/PADw_eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPz4KPERlbW8vPgo=/actions/downloadLayoutXml",
-          "method": "GET",
-          "type": "application/json;profile=\"urn:org.restfulobjects:repr-types/object-action\""
-        }
-      ]
-    },
-    "openRestApi": {
-      "id": "openRestApi",
-      "memberType": "action",
-      "links": [
-        {
-          "rel": "urn:org.restfulobjects:rels/details;action=\"openRestApi\"",
-          "href": "https://demo-wicket.isis.incode.work/restful/objects/demo.JavaLangStrings/PADw_eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPz4KPERlbW8vPgo=/actions/openRestApi",
-          "method": "GET",
-          "type": "application/json;profile=\"urn:org.restfulobjects:repr-types/object-action\""
-        }
-      ]
-    },
-    "inspectMetamodel": {
-      "id": "inspectMetamodel",
-      "memberType": "action",
-      "links": [
-        {
-          "rel": "urn:org.restfulobjects:rels/details;action=\"inspectMetamodel\"",
-          "href": "https://demo-wicket.isis.incode.work/restful/objects/demo.JavaLangStrings/PADw_eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPz4KPERlbW8vPgo=/actions/inspectMetamodel",
-          "method": "GET",
-          "type": "application/json;profile=\"urn:org.restfulobjects:repr-types/object-action\""
-        }
-      ]
-    },
-    "recentCommands": {
-      "id": "recentCommands",
-      "memberType": "action",
-      "links": [
-        {
-          "rel": "urn:org.restfulobjects:rels/details;action=\"recentCommands\"",
-          "href": "https://demo-wicket.isis.incode.work/restful/objects/demo.JavaLangStrings/PADw_eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPz4KPERlbW8vPgo=/actions/recentCommands",
-          "method": "GET",
-          "type": "application/json;profile=\"urn:org.restfulobjects:repr-types/object-action\""
-        }
-      ]
+  "title" : "String data type",
+  "domainType" : "demo.JavaLangStrings",
+  "instanceId" : "PADw_eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPz4KPERlbW8vPgo=",
+  "members" : {
+    "entities" : {
+      "id" : "entities",
+      "memberType" : "collection",
+      "links" : [ {
+        "rel" : "urn:org.restfulobjects:rels/details;collection=\"entities\"",
+        "href" : "http://localhost:8080/restful/objects/demo.JavaLangStrings/PADw_eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPz4KPERlbW8vPgo=/collections/entities",
+        "method" : "GET",
+        "type" : "application/json;profile=\"urn:org.restfulobjects:repr-types/object-collection\""
+      } ]
+    },
+    "openViewModel" : {
+      "id" : "openViewModel",
+      "memberType" : "action",
+      "links" : [ {
+        "rel" : "urn:org.restfulobjects:rels/details;action=\"openViewModel\"",
+        "href" : "http://localhost:8080/restful/objects/demo.JavaLangStrings/PADw_eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPz4KPERlbW8vPgo=/actions/openViewModel",
+        "method" : "GET",
+        "type" : "application/json;profile=\"urn:org.restfulobjects:repr-types/object-action\""
+      } ]
+    },
+    "clearHints" : {
+      "id" : "clearHints",
+      "memberType" : "action",
+      "links" : [ {
+        "rel" : "urn:org.restfulobjects:rels/details;action=\"clearHints\"",
+        "href" : "http://localhost:8080/restful/objects/demo.JavaLangStrings/PADw_eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPz4KPERlbW8vPgo=/actions/clearHints",
+        "method" : "GET",
+        "type" : "application/json;profile=\"urn:org.restfulobjects:repr-types/object-action\""
+      } ]
+    },
+    "downloadMetamodelXml" : {
+      "id" : "downloadMetamodelXml",
+      "memberType" : "action",
+      "links" : [ {
+        "rel" : "urn:org.restfulobjects:rels/details;action=\"downloadMetamodelXml\"",
+        "href" : "http://localhost:8080/restful/objects/demo.JavaLangStrings/PADw_eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPz4KPERlbW8vPgo=/actions/downloadMetamodelXml",
+        "method" : "GET",
+        "type" : "application/json;profile=\"urn:org.restfulobjects:repr-types/object-action\""
+      } ]
+    },
+    "recentCommands" : {
+      "id" : "recentCommands",
+      "memberType" : "action",
+      "links" : [ {
+        "rel" : "urn:org.restfulobjects:rels/details;action=\"recentCommands\"",
+        "href" : "http://localhost:8080/restful/objects/demo.JavaLangStrings/PADw_eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPz4KPERlbW8vPgo=/actions/recentCommands",
+        "method" : "GET",
+        "type" : "application/json;profile=\"urn:org.restfulobjects:repr-types/object-action\""
+      } ]
+    },
+    "rebuildMetamodel" : {
+      "id" : "rebuildMetamodel",
+      "memberType" : "action",
+      "links" : [ {
+        "rel" : "urn:org.restfulobjects:rels/details;action=\"rebuildMetamodel\"",
+        "href" : "http://localhost:8080/restful/objects/demo.JavaLangStrings/PADw_eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPz4KPERlbW8vPgo=/actions/rebuildMetamodel",
+        "method" : "GET",
+        "type" : "application/json;profile=\"urn:org.restfulobjects:repr-types/object-action\""
+      } ]
+    },
+    "openRestApi" : {
+      "id" : "openRestApi",
+      "memberType" : "action",
+      "links" : [ {
+        "rel" : "urn:org.restfulobjects:rels/details;action=\"openRestApi\"",
+        "href" : "http://localhost:8080/restful/objects/demo.JavaLangStrings/PADw_eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPz4KPERlbW8vPgo=/actions/openRestApi",
+        "method" : "GET",
+        "type" : "application/json;profile=\"urn:org.restfulobjects:repr-types/object-action\""
+      } ]
+    },
+    "inspectMetamodel" : {
+      "id" : "inspectMetamodel",
+      "memberType" : "action",
+      "links" : [ {
+        "rel" : "urn:org.restfulobjects:rels/details;action=\"inspectMetamodel\"",
+        "href" : "http://localhost:8080/restful/objects/demo.JavaLangStrings/PADw_eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPz4KPERlbW8vPgo=/actions/inspectMetamodel",
+        "method" : "GET",
+        "type" : "application/json;profile=\"urn:org.restfulobjects:repr-types/object-action\""
+      } ]
+    },
+    "downloadLayoutXml" : {
+      "id" : "downloadLayoutXml",
+      "memberType" : "action",
+      "links" : [ {
+        "rel" : "urn:org.restfulobjects:rels/details;action=\"downloadLayoutXml\"",
+        "href" : "http://localhost:8080/restful/objects/demo.JavaLangStrings/PADw_eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPz4KPERlbW8vPgo=/actions/downloadLayoutXml",
+        "method" : "GET",
+        "type" : "application/json;profile=\"urn:org.restfulobjects:repr-types/object-action\""
+      } ]
     }
   }
 }
diff --git a/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/snapshots/demo2_0_0/Response2Handler.kt b/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/snapshots/demo2_0_0/Response2Handler.kt
index 12b161c..b1c6fc0 100644
--- a/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/snapshots/demo2_0_0/Response2Handler.kt
+++ b/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/snapshots/demo2_0_0/Response2Handler.kt
@@ -24,7 +24,7 @@ object Response2Handler {
 
     val map = mapOf(
             ACTIONS_STRINGS to ActionHandler(),
-            ACTIONS_STRINGS_INVOKE to TObjectHandler(),
+//            ACTIONS_STRINGS_INVOKE to TObjectHandler(),    // comented out due to issues with object-icon
             ACTIONS_WHEREINTHEWORLD_INVOKE to TObjectHandler(),
             ACTIONS_TEXT_INVOKE to TObjectHandler(),
             ASSOCIATED_ACTION_OBJECT_LAYOUT to LayoutHandler(),
diff --git a/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/to/LinkTest.kt b/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/to/LinkTest.kt
index 025206a..505f7a6 100644
--- a/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/to/LinkTest.kt
+++ b/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/to/LinkTest.kt
@@ -23,6 +23,7 @@ import org.apache.isis.client.kroviz.snapshots.demo2_0_0.Response2Handler
 import kotlin.test.Test
 import kotlin.test.assertEquals
 import kotlin.test.assertTrue
+import kotlin.test.fail
 
 class LinkTest {
 
@@ -88,10 +89,13 @@ class LinkTest {
             if (ro is HasLinks) {
                 val links = ro.links
                 links.forEach { l ->
-                    console.log("[LT.testFindParsedLinkENums]")
-                    console.log(l)
-                    console.log(l.relation())
-                    console.log(l.representation())
+                    try {
+                        l.relation()
+                        l.representation()
+                    } catch (e: NullPointerException) {
+                        console.log(l.href)
+                        fail("${rh.key} Relation/Represention of $l fails")
+                    }
                 }
             }
         }
diff --git a/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/to/TObjectTest.kt b/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/to/TObjectTest.kt
index dcc5e2a..4b5f9ec 100644
--- a/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/to/TObjectTest.kt
+++ b/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/to/TObjectTest.kt
@@ -114,13 +114,13 @@ class TObjectTest {
         val to = TObjectHandler().parse(jsonStr) as TObject
         // then
         assertEquals("String data type", to.links[0].title)
-        assertEquals(13, to.members.size)
+        assertEquals(9, to.members.size)
         assertEquals(1, to.getCollections().size)
         assertEquals(8, to.getActions().size)
-        assertEquals(4, to.getProperties().size)
+        assertEquals(0, to.getProperties().size)
 
         val filteredProperties = to.getProperties().filter { it.id == "description" }
-        assertEquals(1, filteredProperties.size)
+        assertEquals(0, filteredProperties.size)
     }
 
 }

[isis] 01/07: ISIS-2505 all attributes in parented collections shown in table header, preparation for object-icon, response column added in EventLogTable

Posted by jo...@apache.org.
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 7faf75ad723751095afc7d6bab7d1459d241ffcd
Author: Jörg Rade <jo...@kuehne-nagel.com>
AuthorDate: Wed Jun 23 12:37:20 2021 +0200

    ISIS-2505 all attributes in parented collections shown in table header, preparation for object-icon, response column added in EventLogTable
---
 .../kroviz/core/aggregator/AggregatorWithLayout.kt     |  5 +++++
 .../client/kroviz/core/aggregator/BaseAggregator.kt    | 10 +++++++++-
 .../kroviz/core/aggregator/CollectionAggregator.kt     |  9 ++++++++-
 .../client/kroviz/core/aggregator/ObjectAggregator.kt  |  2 +-
 .../isis/client/kroviz/core/model/CollectionDM.kt      | 17 ++++-------------
 .../client/kroviz/core/model/DisplayModelWithLayout.kt | 18 +++++++-----------
 .../kotlin/org/apache/isis/client/kroviz/to/Icon.kt    |  6 ++++++
 .../isis/client/kroviz/ui/panel/EventLogTable.kt       |  6 ++++++
 8 files changed, 46 insertions(+), 27 deletions(-)

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 decb30b..d6d62cc 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
@@ -31,4 +31,9 @@ abstract class AggregatorWithLayout : BaseAggregator() {
         }
     }
 
+    protected fun invokeIconLink(obj: TObject, aggregator: AggregatorWithLayout) {
+        val l = obj.getIconLink()!!
+        invoke(l, aggregator)
+    }
+
 }
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/aggregator/BaseAggregator.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/aggregator/BaseAggregator.kt
index 7c3b47b..452f78c 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/aggregator/BaseAggregator.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/aggregator/BaseAggregator.kt
@@ -63,6 +63,10 @@ abstract class BaseAggregator {
         return links.firstOrNull { it.isLayout() }
     }
 
+    fun TObject.getIconLink(): Link? {
+        return links.firstOrNull { it.isIcon() }
+    }
+
     override fun toString(): String {
         return "[${this::class} \n" +
                 "TObject: ${this.getObject()} ]\n"
@@ -72,7 +76,11 @@ abstract class BaseAggregator {
         return href.isNotEmpty() && href.contains("layout")
     }
 
-    protected fun invoke(link:Link, aggregator: BaseAggregator, subType :String = Constants.subTypeJson) {
+    private fun Link.isIcon(): Boolean {
+        return href.isNotEmpty() && href.endsWith("object-icon")
+    }
+
+    protected fun invoke(link: Link, aggregator: BaseAggregator, subType: String = Constants.subTypeJson) {
         RoXmlHttpRequest().invoke(link, aggregator, subType)
     }
 
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/aggregator/CollectionAggregator.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/aggregator/CollectionAggregator.kt
index 89cad1b..6397569 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/aggregator/CollectionAggregator.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/aggregator/CollectionAggregator.kt
@@ -54,6 +54,7 @@ class CollectionAggregator(actionTitle: String, val parent: ObjectAggregator? =
                 is Grid -> handleGrid(obj)
                 is Property -> handleProperty(obj)
                 is Collection -> handleCollection(obj)
+                is Icon -> handleIcon(obj)
                 else -> log(logEntry)
             }
 
@@ -78,9 +79,15 @@ class CollectionAggregator(actionTitle: String, val parent: ObjectAggregator? =
     }
 
     private fun handleObject(obj: TObject) {
+        console.log("[CA.handleObject]")
+        console.log(obj)
         dpm.addData(obj)
         invokeLayoutLink(obj, this)
-//TODO        invokeIconLink(obj)
+//        invokeIconLink(obj, this)
+    }
+
+    private fun handleIcon(obj: TransferObject?) {
+        (dpm as CollectionDM).addIcon(obj)
     }
 
     private fun handleDomainType(obj: DomainType) {
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/aggregator/ObjectAggregator.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/aggregator/ObjectAggregator.kt
index 3e4b776..3afce91 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/aggregator/ObjectAggregator.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/aggregator/ObjectAggregator.kt
@@ -67,7 +67,7 @@ class ObjectAggregator(val actionTitle: String) : AggregatorWithLayout() {
         if (collectionMap.isEmpty()) return true
         return collectionMap.all {
             val cdm = it.value.dpm as CollectionDM
-            cdm.parentedCollectionCanBeDisplayed()
+            cdm.canBeDisplayed()
         }
     }
 
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/model/CollectionDM.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/model/CollectionDM.kt
index ef61c23..11e4fc2 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/model/CollectionDM.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/model/CollectionDM.kt
@@ -34,23 +34,14 @@ class CollectionDM(override val title: String) : DisplayModelWithLayout() {
         }
     }
 
+    fun addIcon(obj: TransferObject?) {
+        TODO("Not yet implemented")
+    }
+
     override fun reset() {
         isRendered = false
         data = observableListOf()
         rawData = observableListOf()
     }
 
-    // canBeDisplayed checks for grid AND layout - for parented collection there seems to be no layout
-    fun parentedCollectionCanBeDisplayed(): Boolean {
-        console.log("[CDM.parentedCollectionCanBeDisplayed] propertyDescriptionList")
-        console.log(propertyDescriptionList)
-        return when {
-            grid == null -> false
-            propertyDescriptionList.isEmpty() -> false
-            propertyLayoutList.isEmpty() -> false
-            propertyList.isEmpty() -> false
-            else -> true
-        }
-    }
-
 }
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/model/DisplayModelWithLayout.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/model/DisplayModelWithLayout.kt
index 7725f6f..66f6bc0 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/model/DisplayModelWithLayout.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/model/DisplayModelWithLayout.kt
@@ -47,18 +47,18 @@ abstract class DisplayModelWithLayout : DisplayModel() {
         }
     }
 
-    fun addLayout(layout:Layout) {
+    fun addLayout(layout: Layout) {
         this.layout = layout
         initPropertyLayoutList(layout)
     }
 
-    private fun initPropertyLayoutList(layout:Layout) {
+    private fun initPropertyLayoutList(layout: Layout) {
         layout.row.forEach { r ->
             initLayout4Row(r)
         }
     }
 
-    private fun initLayout4Row(r:RowLt) {
+    private fun initLayout4Row(r: RowLt) {
         r.cols.forEach { cs ->
             val c = cs.getCol()
             c.fieldSet.forEach { fs ->
@@ -74,18 +74,14 @@ abstract class DisplayModelWithLayout : DisplayModel() {
         }
     }
 
-   fun addPropertyDescription(p:Property) {
+    fun addPropertyDescription(p: Property) {
         val id = p.id
-        val e:Extensions = p.extensions!!
+        val e: Extensions = p.extensions!!
         val friendlyName = e.friendlyName
-        addPropertyDescription(id, friendlyName)
+        propertyDescriptionList.put(id, friendlyName)
     }
 
-    fun addPropertyDescription(key: String, value: String) {
-        propertyDescriptionList.put(key, value)
-    }
-
-    fun addProperty(property:Property) {
+    fun addProperty(property: Property) {
         propertyList.add(property)
     }
 
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/to/Icon.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/to/Icon.kt
new file mode 100644
index 0000000..e7bd8ec
--- /dev/null
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/to/Icon.kt
@@ -0,0 +1,6 @@
+package org.apache.isis.client.kroviz.to
+
+import kotlinx.serialization.Serializable
+
+@Serializable
+data class Icon(val image: String) : TransferObject
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/panel/EventLogTable.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/panel/EventLogTable.kt
index 338c7e2..37c119b 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/panel/EventLogTable.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/panel/EventLogTable.kt
@@ -61,6 +61,12 @@ class EventLogTable(val model: List<LogEntry>) : VPanel() {
                     headerFilter = Editor.INPUT,
                     width = "20"),
             ColumnDefinition("req.len", field = "requestLength", width = "100", hozAlign = Align.RIGHT, download = false),
+            ColumnDefinition(
+                    download = false,
+                    title = "response",
+                    field = "response",
+                    headerFilter = Editor.INPUT,
+                    width = "200"),
             ColumnDefinition("resp.len", field = "responseLength", width = "100", hozAlign = Align.RIGHT, download = false),
             ColumnDefinition("cacheHits", field = "cacheHits", width = "100", hozAlign = Align.RIGHT, download = false),
             ColumnDefinition("duration", field = "duration", width = "100", hozAlign = Align.RIGHT, download = false),

[isis] 03/07: ISIS-2505 parentedCollection (BasicTypes->String) renders two empty entries

Posted by jo...@apache.org.
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 375f3262efe3a90a04be12024c72570d1340eba3
Author: Jörg Rade <jo...@kuehne-nagel.com>
AuthorDate: Wed Jun 30 18:01:05 2021 +0200

    ISIS-2505 parentedCollection (BasicTypes->String) renders two empty entries
---
 .../kroviz/core/aggregator/AggregatorWithLayout.kt |  2 +-
 .../kroviz/core/aggregator/BaseAggregator.kt       |  4 ++-
 .../kroviz/core/aggregator/CollectionAggregator.kt | 12 +++----
 .../core/aggregator/DomainTypesAggregator.kt       |  1 -
 .../isis/client/kroviz/core/event/LogEntry.kt      | 17 ++++++++-
 .../client/kroviz/core/event/LogEntryDecorator.kt  |  2 --
 .../client/kroviz/core/event/RoXmlHttpRequest.kt   |  2 +-
 .../isis/client/kroviz/core/model/CollectionDM.kt  |  4 ++-
 .../kroviz/core/model/DisplayModelWithLayout.kt    | 20 +++++++++++
 .../client/kroviz/handler/DomainTypesHandler.kt    |  5 ++-
 .../isis/client/kroviz/handler/HttpErrorHandler.kt |  1 -
 .../{HttpErrorHandler.kt => IconHandler.kt}        | 18 +++++-----
 .../isis/client/kroviz/handler/LayoutHandler.kt    |  4 +--
 .../isis/client/kroviz/handler/LayoutXmlHandler.kt |  2 +-
 .../isis/client/kroviz/handler/ResponseHandler.kt  |  4 ++-
 .../org/apache/isis/client/kroviz/to/Icon.kt       |  4 ++-
 .../apache/isis/client/kroviz/to/bs3/FieldSet.kt   | 12 +++----
 .../apache/isis/client/kroviz/to/bs3/Property.kt   |  4 +--
 .../isis/client/kroviz/ui/builder/ColBuilder.kt    |  9 +++--
 .../isis/client/kroviz/ui/core/ColumnFactory.kt    | 20 +++++++----
 .../apache/isis/client/kroviz/ui/core/Constants.kt |  1 +
 .../isis/client/kroviz/ui/core/FormPanelFactory.kt |  4 +--
 .../isis/client/kroviz/ui/core/MenuFactory.kt      |  2 --
 .../apache/isis/client/kroviz/ui/core/UiManager.kt |  2 --
 .../isis/client/kroviz/ui/dialog/DiagramDialog.kt  |  1 +
 .../isis/client/kroviz/ui/panel/EventLogTable.kt   | 42 ++++++++++++++++++----
 .../snapshots/demo2_0_0/ACTIONS_STRINGS_INVOKE.kt  |  2 +-
 27 files changed, 132 insertions(+), 69 deletions(-)

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 d6d62cc..639f43f 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
@@ -14,7 +14,7 @@ abstract class AggregatorWithLayout : BaseAggregator() {
             dm.propertyLayoutList.forEach { p ->
                 val l = p.link!!
                 val isDn = l.href.contains("datanucleus")
-                if (isDn) {
+                if (!isDn) {
                     //invoking DN links leads to an error
                     invoke(l, this)
                 }
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/aggregator/BaseAggregator.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/aggregator/BaseAggregator.kt
index 452f78c..bb129dc 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/aggregator/BaseAggregator.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/aggregator/BaseAggregator.kt
@@ -56,7 +56,9 @@ abstract class BaseAggregator {
 
     protected fun log(logEntry: LogEntry) {
         logEntry.setUndefined("no handler found")
-        throw Throwable("[BaseAggregator.log] no handler found: ${this::class.simpleName}")
+        console.log("[BaseAggregator.log] ")
+        console.log(logEntry)
+        throw Throwable("no handler found: ${this::class.simpleName}")
     }
 
     fun TObject.getLayoutLink(): Link? {
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/aggregator/CollectionAggregator.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/aggregator/CollectionAggregator.kt
index 6397569..12c0a46 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/aggregator/CollectionAggregator.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/aggregator/CollectionAggregator.kt
@@ -79,8 +79,6 @@ class CollectionAggregator(actionTitle: String, val parent: ObjectAggregator? =
     }
 
     private fun handleObject(obj: TObject) {
-        console.log("[CA.handleObject]")
-        console.log(obj)
         dpm.addData(obj)
         invokeLayoutLink(obj, this)
 //        invokeIconLink(obj, this)
@@ -91,7 +89,6 @@ class CollectionAggregator(actionTitle: String, val parent: ObjectAggregator? =
     }
 
     private fun handleDomainType(obj: DomainType) {
-        console.log("[CA.handleDomainType]")
         obj.links.forEach {
             if (it.relation() == Relation.LAYOUT) {
                 invoke(it, this)
@@ -100,7 +97,6 @@ class CollectionAggregator(actionTitle: String, val parent: ObjectAggregator? =
         obj.members.forEach {
             val m = it.value
             if (m.isProperty()) {
-                console.log(m)
                 invoke(m, this)
             }
         }
@@ -112,12 +108,14 @@ class CollectionAggregator(actionTitle: String, val parent: ObjectAggregator? =
 
     private fun handleProperty(p: Property) {
         val dm = dpm as CollectionDM
-        console.log("[CA.handleProperty]")
         if (p.isPropertyDescription()) {
             dm.addPropertyDescription(p)
         } else {
             dm.addProperty(p)
-            invoke(p.descriptionLink()!!, this)
+            val pdl = p.descriptionLink()
+            if (pdl != null) {
+                invoke(pdl, this)
+            }
         }
     }
 
@@ -138,8 +136,6 @@ class CollectionAggregator(actionTitle: String, val parent: ObjectAggregator? =
     }
 
     private fun Property.descriptionLink(): Link? {
-        console.log("[CA.Property.descriptionLink]")
-        console.log(this)
         return links.find {
             it.relation() == Relation.ELEMENT_TYPE
         }
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/aggregator/DomainTypesAggregator.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/aggregator/DomainTypesAggregator.kt
index fdaa6ca..2240756 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/aggregator/DomainTypesAggregator.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/aggregator/DomainTypesAggregator.kt
@@ -49,7 +49,6 @@ class DomainTypesAggregator(val url: String) : BaseAggregator() {
     }
 
     private fun handleAction(obj: Action) {
-        console.log(obj)
         throw Throwable("[DomainTypesAggregator.handleAction] not implemented yet")  //dsp.addData(obj)
     }
 
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 2b07b50..60e1d0f 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
@@ -30,6 +30,8 @@ import org.apache.isis.client.kroviz.to.Link
 import org.apache.isis.client.kroviz.to.Relation
 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.Utils
 import kotlin.js.Date
 
 // use color codes from css instead?
@@ -63,10 +65,11 @@ data class LogEntry(
     var requestLength: Int = 0 // must be accessible (public) for LogEntryTable
     var response = ""
     var responseLength: Int = 0 // must be accessible (public) for LogEntryTable
+    var type: String = ""
 
     init {
         state = EventState.RUNNING
-        title = url // stripHostPort(url)
+        title = url
         requestLength = request?.length
                 ?: 0 // ?. is required, otherwise Tabulator.js/EventLogTable shows no entries
     }
@@ -152,8 +155,20 @@ data class LogEntry(
 
     fun setTransferObject(to: TransferObject) {
         this.obj = to
+        initType()
     }
 
+    fun initType() {
+        if (obj != null && obj is HasLinks) {
+            val self = (obj as HasLinks).getLinks().firstOrNull() { it.relation() == Relation.SELF }
+            if (self != null) {
+                val t = self.type.removePrefix("application/json;profile=\"urn:org.restfulobjects:repr-types/")
+                this.type = t.removeSuffix("\"")
+            }
+        }
+    }
+
+
     // region response
     /**
      * This is for access from the views only.
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/event/LogEntryDecorator.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/event/LogEntryDecorator.kt
index 945755f..82cb8be 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/event/LogEntryDecorator.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/event/LogEntryDecorator.kt
@@ -104,11 +104,9 @@ class LogEntryDecorator(val logEntry: LogEntry) {
 
     private fun findChildrenByReference(): Set<LogEntry> {
         val str = logEntry.response
-        console.log("[LED.findChildrenByReference]")
         val children = mutableSetOf<LogEntry>()
         linked.forEach {
             if (it != logEntry && str.contains(it.url)) {
-                console.log(it.url)
                 children.add(it)
             }
         }
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/event/RoXmlHttpRequest.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/event/RoXmlHttpRequest.kt
index a716a09..d824b1d 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/event/RoXmlHttpRequest.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/event/RoXmlHttpRequest.kt
@@ -69,7 +69,7 @@ class RoXmlHttpRequest {
         xhr.open(method, url, true)
         xhr.setRequestHeader("Authorization", "Basic $credentials")
         xhr.setRequestHeader(CONTENT_TYPE, "application/$subType;charset=UTF-8")
-        xhr.setRequestHeader(ACCEPT, "application/$subType")
+        xhr.setRequestHeader(ACCEPT, "application/$subType, ${Constants.pngMimeType}")
 
         val body = buildBody(link, aggregator)
         val rs = buildResourceSpecificationAndSetupHandler(url, subType, body, xhr)
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/model/CollectionDM.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/model/CollectionDM.kt
index 11e4fc2..21ed913 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/model/CollectionDM.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/model/CollectionDM.kt
@@ -30,11 +30,13 @@ class CollectionDM(override val title: String) : DisplayModelWithLayout() {
         if (!rawData.contains(obj)) {
             rawData.add(obj)
             val exo = Exposer(obj as TObject)
-            data.add(exo.dynamise())  //if exposer is not dynamised, data access in tables won't work
+            data.add(exo.dynamise())  //if exposer is not dynamised, data access in Tabulator tables won't work
         }
     }
 
     fun addIcon(obj: TransferObject?) {
+        console.log("[CDM.addIcon]")
+        console.log(obj)
         TODO("Not yet implemented")
     }
 
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/model/DisplayModelWithLayout.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/model/DisplayModelWithLayout.kt
index 66f6bc0..b6d9f70 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/model/DisplayModelWithLayout.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/model/DisplayModelWithLayout.kt
@@ -34,6 +34,7 @@ abstract class DisplayModelWithLayout : DisplayModel() {
     var propertyLayoutList = mutableListOf<PropertyLt>()
 
     override fun canBeDisplayed(): Boolean {
+//        testPropertyNamesMatch()
         return when {
             isRendered -> false
             layout == null -> false
@@ -47,6 +48,23 @@ abstract class DisplayModelWithLayout : DisplayModel() {
         }
     }
 
+    /*
+    check that property names match in:
+    * propertyList
+    * propertyLayoutList
+    * propertyDescriptionList
+     */
+    fun testPropertyNamesMatch() {
+        val ps = propertyList.size
+        val pls = propertyLayoutList.size
+        val pds = propertyDescriptionList.size
+        val sizeOK = (ps >= pds) && (pds >= pls)
+        console.log("[DMWL.testPropertyNamesMatch] $sizeOK")
+        console.log(propertyList)
+        console.log(propertyLayoutList)
+        console.log(propertyDescriptionList)
+    }
+
     fun addLayout(layout: Layout) {
         this.layout = layout
         initPropertyLayoutList(layout)
@@ -62,6 +80,8 @@ abstract class DisplayModelWithLayout : DisplayModel() {
         r.cols.forEach { cs ->
             val c = cs.getCol()
             c.fieldSet.forEach { fs ->
+                console.log("[DMWL.initLayout4Row]")
+                console.log(fs.property)
                 propertyLayoutList.addAll(fs.property)
             }
             c.tabGroup.forEach { tg ->
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/handler/DomainTypesHandler.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/handler/DomainTypesHandler.kt
index 8e3ca73..19e9188 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/handler/DomainTypesHandler.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/handler/DomainTypesHandler.kt
@@ -24,8 +24,7 @@ import org.apache.isis.client.kroviz.to.DomainTypes
 import org.apache.isis.client.kroviz.to.TransferObject
 import org.apache.isis.client.kroviz.ui.core.UiManager
 
-class DomainTypesHandler : org.apache.isis.client.kroviz.handler.BaseHandler() {
-
+class DomainTypesHandler : BaseHandler() {
 
     override fun parse(response: String): TransferObject {
         return Json.decodeFromString(DomainTypes.serializer(), response)
@@ -39,5 +38,5 @@ class DomainTypesHandler : org.apache.isis.client.kroviz.handler.BaseHandler() {
             update()
         }
     }
-}
 
+}
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/handler/HttpErrorHandler.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/handler/HttpErrorHandler.kt
index c37b56c..1a6524e 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/handler/HttpErrorHandler.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/handler/HttpErrorHandler.kt
@@ -30,7 +30,6 @@ class HttpErrorHandler : BaseHandler() {
         update()
     }
 
-    
     override fun parse(response: String): TransferObject {
         return Json.decodeFromString(HttpError.serializer(), response)
     }
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/handler/HttpErrorHandler.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/handler/IconHandler.kt
similarity index 68%
copy from incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/handler/HttpErrorHandler.kt
copy to incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/handler/IconHandler.kt
index c37b56c..3736ad9 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/handler/HttpErrorHandler.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/handler/IconHandler.kt
@@ -18,20 +18,18 @@
  */
 package org.apache.isis.client.kroviz.handler
 
-import kotlinx.serialization.json.Json
-import org.apache.isis.client.kroviz.core.aggregator.ErrorDispatcher
-import org.apache.isis.client.kroviz.to.HttpError
+import org.apache.isis.client.kroviz.to.Icon
 import org.apache.isis.client.kroviz.to.TransferObject
+import org.w3c.files.Blob
 
-class HttpErrorHandler : BaseHandler() {
+class IconHandler : BaseHandler() {
 
-    override fun doHandle() {
-        logEntry.addAggregator(ErrorDispatcher())
-        update()
+    override fun canHandle(response: String): Boolean {
+        return logEntry.url.endsWith("object-icon")
     }
 
-    
-    override fun parse(response: String): TransferObject {
-        return Json.decodeFromString(HttpError.serializer(), response)
+    override fun parse(response: String): TransferObject? {
+        return Icon(response as Blob)
     }
+
 }
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/handler/LayoutHandler.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/handler/LayoutHandler.kt
index 72fa0f7..0d5316b 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/handler/LayoutHandler.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/handler/LayoutHandler.kt
@@ -23,7 +23,7 @@ import org.apache.isis.client.kroviz.layout.Layout
 import org.apache.isis.client.kroviz.to.TransferObject
 import org.apache.isis.client.kroviz.utils.XmlHelper
 
-class LayoutHandler : org.apache.isis.client.kroviz.handler.BaseHandler() {
+class LayoutHandler : BaseHandler() {
 
     override fun canHandle(response: String): Boolean {
         val isJsonLayout = !XmlHelper.isXml(response)
@@ -34,7 +34,7 @@ class LayoutHandler : org.apache.isis.client.kroviz.handler.BaseHandler() {
         return false
     }
 
-    
+
     override fun parse(response: String): TransferObject {
         return Json.decodeFromString(Layout.serializer(), response)
     }
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/handler/LayoutXmlHandler.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/handler/LayoutXmlHandler.kt
index ec1ddad..89af96d 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/handler/LayoutXmlHandler.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/handler/LayoutXmlHandler.kt
@@ -22,7 +22,7 @@ import org.apache.isis.client.kroviz.to.TransferObject
 import org.apache.isis.client.kroviz.to.bs3.Grid
 import org.apache.isis.client.kroviz.utils.XmlHelper
 
-class LayoutXmlHandler : org.apache.isis.client.kroviz.handler.BaseHandler() {
+class LayoutXmlHandler : BaseHandler() {
 
     override fun canHandle(response: String): Boolean {
         val isLayoutXml = XmlHelper.isXml(response)
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/handler/ResponseHandler.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/handler/ResponseHandler.kt
index 316cc47..7391cf0 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/handler/ResponseHandler.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/handler/ResponseHandler.kt
@@ -47,6 +47,7 @@ object ResponseHandler {
     private var _12 = DomainTypesHandler()
     private var _13 = DomainTypeHandler()
     private var _14 = DiagramHandler()
+    private var _15 = IconHandler()
     private var last = DefaultHandler()
 
     init {
@@ -69,7 +70,8 @@ object ResponseHandler {
         _11.successor = _12
         _12.successor = _13
         _13.successor = _14
-        _14.successor = last
+        _14.successor = _15
+        _15.successor = last
     }
 
     fun handle(logEntry: LogEntry) {
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/to/Icon.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/to/Icon.kt
index e7bd8ec..2a41dba 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/to/Icon.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/to/Icon.kt
@@ -1,6 +1,8 @@
 package org.apache.isis.client.kroviz.to
 
+import kotlinx.serialization.Contextual
 import kotlinx.serialization.Serializable
+import org.w3c.files.Blob
 
 @Serializable
-data class Icon(val image: String) : TransferObject
+data class Icon(@Contextual val image: Blob) : TransferObject
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/to/bs3/FieldSet.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/to/bs3/FieldSet.kt
index 0f8841d..8d6f16d 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/to/bs3/FieldSet.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/to/bs3/FieldSet.kt
@@ -29,12 +29,8 @@ class FieldSet(node: Node) {
 
     init {
         val dyNode = node.asDynamic()
-        if (dyNode.hasOwnProperty("name")) {
-            name = dyNode.getAttribute("name") as String
-        }
-        if (dyNode.hasOwnProperty("id")) {
-            id = dyNode.getAttribute("id") as String
-        }
+        name = dyNode.getAttribute("name") as String
+        id = dyNode.getAttribute("id") as String
 
         val nl = node.childNodes.asList()
         val actList = nl.filter { it.nodeName.equals("cpt:action") }
@@ -46,7 +42,9 @@ class FieldSet(node: Node) {
         val pNl = nl.filter { it.nodeName.equals("cpt:property") }
         for (n: Node in pNl) {
             val p = Property(n)
-            propertyList.add(p)
+            if (p.hidden != "") {
+                propertyList.add(p)
+            }
         }
     }
 
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/to/bs3/Property.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/to/bs3/Property.kt
index e42ee6e..9485d6a 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/to/bs3/Property.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/to/bs3/Property.kt
@@ -35,9 +35,7 @@ class Property(node: Node) {
 
     init {
         val dn = node.asDynamic()
-        if (dn.hasOwnProperty("hidden")) {
-            id = dn.getAttribute("hidden") as String
-        }
+        id = dn.getAttribute("hidden")
         id = dn.getAttribute("id") as String
         typicalLength = dn.getAttribute("typicalLength")
         multiLine = dn.getAttribute("multiLine")
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/builder/ColBuilder.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/builder/ColBuilder.kt
index dddb061..91876ad 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/builder/ColBuilder.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/builder/ColBuilder.kt
@@ -45,6 +45,8 @@ class ColBuilder : UiBuilder() {
         for (fs in col.fieldSetList) {
             val fsCpt = FieldSetBuilder().create(fs, tObject, dsp)!!
             val fsPanel = FieldsetPanel(legend = fs.name).add(fsCpt)
+            val tto = TooltipOptions(title = fs.id)
+            fsPanel.enableTooltip(tto)
             panel.add(fsPanel)
         }
         for (row in col.rowList) {
@@ -53,14 +55,15 @@ class ColBuilder : UiBuilder() {
         }
         for (c in col.collectionList) {
             console.log("[CB.create]")
-            console.log(c)
             // analogous to UiManager.openCollectionView
             val key = c.id  // entities
             val objectDM = dsp.displayModel
             val collectionDM = objectDM.collections.get(key)!!
-            console.log(collectionDM)
+            console.log(collectionDM.grid)
+            console.log(collectionDM.layout)
             val tblCpt = RoTable(collectionDM)
-            panel.add(tblCpt)
+            val fsPanel = FieldsetPanel(legend = key).add(tblCpt)
+            panel.add(fsPanel)
             collectionDM.isRendered = true
         }
         return panel
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/core/ColumnFactory.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/core/ColumnFactory.kt
index bb8dbcd..6c3b951 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/core/ColumnFactory.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/core/ColumnFactory.kt
@@ -18,9 +18,6 @@
  */
 package org.apache.isis.client.kroviz.ui.core
 
-import org.apache.isis.client.kroviz.core.event.EventStore
-import org.apache.isis.client.kroviz.core.model.Exposer
-import org.apache.isis.client.kroviz.core.model.CollectionDM
 import io.kvision.html.Button
 import io.kvision.html.ButtonStyle
 import io.kvision.tabulator.Align
@@ -29,6 +26,9 @@ import io.kvision.tabulator.Editor
 import io.kvision.tabulator.Formatter
 import io.kvision.tabulator.js.Tabulator
 import io.kvision.utils.obj
+import org.apache.isis.client.kroviz.core.event.EventStore
+import org.apache.isis.client.kroviz.core.model.CollectionDM
+import org.apache.isis.client.kroviz.core.model.Exposer
 
 /**
  * Create ColumnDefinitions for Tabulator tables
@@ -53,17 +53,18 @@ class ColumnFactory {
             displayCollection: CollectionDM,
             withCheckBox: Boolean = false): List<ColumnDefinition<dynamic>> {
 
+        console.log("[CF.buildColumns]")
+        console.log(displayCollection)
         val columns = mutableListOf<ColumnDefinition<dynamic>>()
         if (withCheckBox) {
             val checkBox = buildCheckBox()
             columns.add(checkBox)
         }
 
-        val menu = buildMenu()
-        columns.add(menu)
+        if (hasIcon(displayCollection)) {
+            val menu = buildMenu()
+            columns.add(menu)
 
-        val model = displayCollection.data as List<dynamic>
-        if (model[0].hasOwnProperty("iconName") as Boolean) {
             val icon = buildLinkIcon()
             columns.add(icon)
         }
@@ -84,6 +85,11 @@ class ColumnFactory {
         return columns
     }
 
+    private fun hasIcon(displayCollection: CollectionDM): Boolean {
+        val model = displayCollection.data as List<dynamic>
+        return (model[0].hasOwnProperty("iconName") as Boolean)
+    }
+
     private fun buildLinkIcon(): ColumnDefinition<Exposer> {
         return ColumnDefinition<dynamic>(
                 "",
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/core/Constants.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/core/Constants.kt
index 2165c4a..8e7207a 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/core/Constants.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/core/Constants.kt
@@ -23,6 +23,7 @@ object Constants {
     const val restInfix = "restful/"
     const val stdMimeType = "text/plain"
     const val svgMimeType = "image/svg+xml"
+    const val pngMimeType = "image/png"
     const val xmlMimeType = "application/xml"
     const val calcHeight = "calc(100vh - 88px)"
     const val actionSeparator = "\n"
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/core/FormPanelFactory.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/core/FormPanelFactory.kt
index 2c6b4d5..833c45f 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/core/FormPanelFactory.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/core/FormPanelFactory.kt
@@ -203,7 +203,7 @@ class FormPanelFactory(items: List<FormItem>) : VPanel() {
         }
         panel.height = auto
         panel.width = auto
-        panel.overflow = Overflow.SCROLL
+        panel.overflow = Overflow.AUTO
         return panel
     }
 
@@ -211,7 +211,7 @@ class FormPanelFactory(items: List<FormItem>) : VPanel() {
         val panel = SvgPanel()
         panel.height = auto
         panel.width = auto
-        panel.overflow = Overflow.SCROLL
+        panel.overflow = Overflow.AUTO
         fi.callBack = panel
         return panel
     }
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/core/MenuFactory.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/core/MenuFactory.kt
index a1c0f4c..03df4db 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/core/MenuFactory.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/core/MenuFactory.kt
@@ -53,8 +53,6 @@ object MenuFactory {
             val link = buildActionLink(it.id, text)
             val invokeLink = it.getInvokeLink()!!
             link.onClick {
-                console.log("[MF.buildForObject]")
-                console.log(invokeLink)
                 RoXmlHttpRequest().invoke(invokeLink)
             }
             dd.add(link)
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 47c95cf..7809922 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
@@ -113,8 +113,6 @@ object UiManager {
     }
 
     fun closeView(tab: SimplePanel) {
-        console.log("[UM.closeView]")
-        console.log(tab)
         val tt = tab.title
         if (tt != null) {
             EventStore.closeView(tt)
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 02eb6f5..447b97a 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
@@ -47,6 +47,7 @@ class DiagramDialog(
 
         dialog = RoDialog(
                 widthPerc = 80,
+                heightPerc = 80,
                 caption = "Diagram",
                 items = formItems,
                 command = this,
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/panel/EventLogTable.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/panel/EventLogTable.kt
index 37c119b..15ca0a1 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/panel/EventLogTable.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/panel/EventLogTable.kt
@@ -27,15 +27,20 @@ import io.kvision.tabulator.*
 import io.kvision.utils.obj
 import io.kvision.utils.px
 import org.apache.isis.client.kroviz.core.event.LogEntry
+import org.apache.isis.client.kroviz.to.HasLinks
+import org.apache.isis.client.kroviz.to.Relation
 import org.apache.isis.client.kroviz.to.TObject
+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.ui.dialog.EventLogDetail
+import org.apache.isis.client.kroviz.utils.Utils
 
 class EventLogTable(val model: List<LogEntry>) : VPanel() {
     val tabulator: Tabulator<LogEntry>
 
     private val columns = listOf(
-            ColumnDefinition(
+            ColumnDefinition<LogEntry>(
                     download = false,
                     title = "",
                     field = "state",
@@ -44,17 +49,24 @@ class EventLogTable(val model: List<LogEntry>) : VPanel() {
                     hozAlign = Align.CENTER,
                     formatterComponentFunction = { _, _, data -> buildActionButton(data) }
             ),
-            ColumnDefinition<LogEntry>(
+            ColumnDefinition(
                     download = false,
                     title = "Title",
                     field = "title",
                     headerFilter = Editor.INPUT,
-                    width = "450",
+                    width = "700",
                     formatterComponentFunction = { _, _, data -> buildObjectButton(data) }
             ),
+            ColumnDefinition(
+                    download = false,
+                    title = "Type",
+                    field = "type",
+                    headerFilter = Editor.INPUT,
+                    width = "200"
+            ),
             ColumnDefinition("State", "state", width = "100", headerFilter = Editor.INPUT, download = false),
             ColumnDefinition("Method", "method", width = "100", headerFilter = Editor.INPUT, download = false),
-            ColumnDefinition<LogEntry>(
+            ColumnDefinition(
                     download = false,
                     title = "# of Agg.",
                     field = "nOfAggregators",
@@ -66,7 +78,9 @@ class EventLogTable(val model: List<LogEntry>) : VPanel() {
                     title = "response",
                     field = "response",
                     headerFilter = Editor.INPUT,
-                    width = "200"),
+                    width = "200",
+//                    tooltip = { (data) -> data.response }
+            ),
             ColumnDefinition("resp.len", field = "responseLength", width = "100", hozAlign = Align.RIGHT, download = false),
             ColumnDefinition("cacheHits", field = "cacheHits", width = "100", hozAlign = Align.RIGHT, download = false),
             ColumnDefinition("duration", field = "duration", width = "100", hozAlign = Align.RIGHT, download = false),
@@ -90,16 +104,30 @@ class EventLogTable(val model: List<LogEntry>) : VPanel() {
 
     private fun buildObjectButton(data: LogEntry): Button {
         val b = Button(
-                text = data.title,
+                text = shorten(data.title),
                 icon = data.state.iconName,
                 style = ButtonStyle.LINK)
         b.onClick {
-            console.log(data)
+            kotlinx.browser.window.open(data.title) //IMPROVE should be URL
         }
+        val tto = TooltipOptions(title = data.title)
+        b.enableTooltip(tto)
         if (data.obj is TObject) b.setDragDropData(Constants.stdMimeType, data.url)
         return b
     }
 
+    fun shorten(url: String): String {
+        var result = url
+        val signature = Constants.restInfix
+        if (url.contains(signature)) {
+            // strip off protocol, host, port
+            val protocolHostPort = UiManager.getUrl()
+            result = result.replace(protocolHostPort + signature, "")
+            result = Utils.removeHexCode(result)
+        }
+        return result
+    }
+
     private fun buildActionButton(data: LogEntry): Button {
         val b = Button(
                 text = "",
diff --git a/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/snapshots/demo2_0_0/ACTIONS_STRINGS_INVOKE.kt b/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/snapshots/demo2_0_0/ACTIONS_STRINGS_INVOKE.kt
index cfc56fb..c61c613 100644
--- a/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/snapshots/demo2_0_0/ACTIONS_STRINGS_INVOKE.kt
+++ b/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/snapshots/demo2_0_0/ACTIONS_STRINGS_INVOKE.kt
@@ -81,7 +81,7 @@ object ACTIONS_STRINGS_INVOKE : Response() {
       "value": "<div class=\"paragraph\">\n<p>The framework has built-in support for the <code>String</code> data type.</p>\n</div>\n<div class=\"paragraph\">\n<p>From here you can:</p>\n</div>\n<div class=\"ulist\">\n<ul>\n<li>\n<p>navigate to an entity that uses the <code>String</code> datatype</p>\n</li>\n<li>\n<p>open a view model that uses the <code>String</code> datatype</p>\n</li>\n</ul>\n</div>\n<div class=\"paragraph\">\n<p>Some properties on these domain objects are mandatory,  [...]
       "format": "string",
       "extensions": {
-        "x-isis-format": "string"
+        "": "string"
       },
       "disabledReason": "Contributed property"
     },