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

[causeway] 07/10: ISIS-3171 CollectionLayout removed, PropertySpecificationHolder introduced

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

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

commit 9bbf18daeab81f046b4fda6cb056bda9dd0b7a5f
Author: Jörg Rade <jo...@kuehne-nagel.com>
AuthorDate: Thu Feb 16 22:52:37 2023 +0100

    ISIS-3171 CollectionLayout removed, PropertySpecificationHolder introduced
---
 .../kroviz/core/aggregator/CollectionAggregator.kt | 19 +----
 .../kroviz/core/aggregator/ObjectAggregator.kt     |  8 +-
 .../client/kroviz/core/model/CollectionDM.kt       | 53 ++++++++++---
 .../client/kroviz/core/model/CollectionLayout.kt   | 90 ----------------------
 .../kroviz/core/model/PropertySpecification.kt     | 19 ++---
 .../core/model/PropertySpecificationHolder.kt      | 53 +++++++++++++
 .../causeway/client/kroviz/to/bs/PropertyBs.kt     | 10 +--
 .../client/kroviz/ui/core/ColumnFactory.kt         |  6 +-
 .../causeway/client/kroviz/ui/core/ViewManager.kt  |  2 -
 9 files changed, 115 insertions(+), 145 deletions(-)

diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/causeway/client/kroviz/core/aggregator/CollectionAggregator.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/causeway/client/kroviz/core/aggregator/CollectionAggregator.kt
index 3a36d46fd1..d1cbfafcf9 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/causeway/client/kroviz/core/aggregator/CollectionAggregator.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/causeway/client/kroviz/core/aggregator/CollectionAggregator.kt
@@ -22,9 +22,7 @@ import org.apache.causeway.client.kroviz.core.event.EventState
 import org.apache.causeway.client.kroviz.core.event.LogEntry
 import org.apache.causeway.client.kroviz.core.event.ResourceProxy
 import org.apache.causeway.client.kroviz.core.event.ResourceSpecification
-import org.apache.causeway.client.kroviz.core.model.BaseLayout
 import org.apache.causeway.client.kroviz.core.model.CollectionDM
-import org.apache.causeway.client.kroviz.core.model.CollectionLayout
 import org.apache.causeway.client.kroviz.to.*
 import org.apache.causeway.client.kroviz.to.bs.GridBs
 import org.apache.causeway.client.kroviz.ui.core.ViewManager
@@ -57,7 +55,7 @@ class CollectionAggregator(actionTitle: String, private val parent: ObjectAggreg
                 is TObject -> handleObject(obj)
                 is DomainType -> handleDomainType(obj)
                 is GridBs -> handleLayout(obj)
-                is Property -> handleProperty(obj)
+                is Property -> handleProperty(obj, referrer)
                 is Collection -> handleCollection(obj)
                 is Icon -> handleIcon(obj)
                 else -> log(logEntry)
@@ -88,10 +86,6 @@ class CollectionAggregator(actionTitle: String, private val parent: ObjectAggreg
         return displayModel as CollectionDM
     }
 
-    private fun getLayout(): CollectionLayout {
-        return getDisplayModel().layout as CollectionLayout
-    }
-
     private fun handleList(resultList: ResultList) {
         if (resultList.resulttype != ResultType.VOID.type) {
             val result = resultList.result!!
@@ -113,7 +107,7 @@ class CollectionAggregator(actionTitle: String, private val parent: ObjectAggreg
             invokeLayoutLink(tObj, this, referrer = referrer)
         }
         //TODO fold layout into model
-        getLayout().addObject(tObj, this, referrer = referrer)
+        getDisplayModel().addObject(tObj, this, referrer = referrer)
 
         invokeIconLink(tObj, this, referrer = referrer)
     }
@@ -144,11 +138,7 @@ class CollectionAggregator(actionTitle: String, private val parent: ObjectAggreg
         }
     }
 
-    private fun handleProperty(property: Property) {
-        handleProperty(property, referrer, getLayout())
-    }
-
-    protected fun handleProperty(property: Property, referrer: String, layout: BaseLayout) {
+    private fun handleProperty(property: Property, referrer: String) {
         when {
             property.isObjectProperty() -> {
                 val op = ObjectProperty(property)
@@ -158,7 +148,7 @@ class CollectionAggregator(actionTitle: String, private val parent: ObjectAggreg
 
             property.isPropertyDescription() -> {
                 val pd = PropertyDescription(property)
-                getLayout().addPropertyDescription(pd, this, referrer)
+                getDisplayModel().addPropertyDescription(pd, this, referrer)
             }
 
             else -> {
@@ -173,7 +163,6 @@ class CollectionAggregator(actionTitle: String, private val parent: ObjectAggreg
             //TODO is _id_ required in both CollectionDM and CollectionLayout?
             val id = collection.id
             getDisplayModel().id = id
-            getLayout().id = id
             // add displayModel to parent.displayModel
             val objectDM = parent!!.getDisplayModel()
             objectDM.addCollectionModel(getDisplayModel())
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/causeway/client/kroviz/core/aggregator/ObjectAggregator.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/causeway/client/kroviz/core/aggregator/ObjectAggregator.kt
index 17b85d0581..3bbc286a5c 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/causeway/client/kroviz/core/aggregator/ObjectAggregator.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/causeway/client/kroviz/core/aggregator/ObjectAggregator.kt
@@ -58,8 +58,6 @@ class ObjectAggregator(val actionTitle: String) : AggregatorWithLayout() {
         }
 
         if (getDisplayModel().readyToRender()) {
-            console.log("[OA_readyToRender]")
-            console.log(getDisplayModel())
             ViewManager.openObjectView(this)
         }
     }
@@ -103,7 +101,9 @@ class ObjectAggregator(val actionTitle: String) : AggregatorWithLayout() {
     }
 
     private fun handleProperty(property: Property, referrer: String) {
-        handleProperty(property, referrer) //FIXME
+        //(property, referrer) //FIXME
+        console.log("[OA_handleProperty] not handled")
+        console.log(property)
     }
 
     private fun handleGrid(grid: GridBs, referrer: String) {
@@ -126,8 +126,6 @@ class ObjectAggregator(val actionTitle: String) : AggregatorWithLayout() {
         return title
     }
 
-
-
     override fun reset(): ObjectAggregator {
         displayModel.reset()
         return this
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/causeway/client/kroviz/core/model/CollectionDM.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/causeway/client/kroviz/core/model/CollectionDM.kt
index af6e1371e5..25279300ac 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/causeway/client/kroviz/core/model/CollectionDM.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/causeway/client/kroviz/core/model/CollectionDM.kt
@@ -20,16 +20,17 @@ package org.apache.causeway.client.kroviz.core.model
 
 import io.kvision.state.observableListOf
 import org.apache.causeway.client.kroviz.core.aggregator.AggregatorWithLayout
+import org.apache.causeway.client.kroviz.core.aggregator.CollectionAggregator
 import org.apache.causeway.client.kroviz.core.event.ResourceProxy
+import org.apache.causeway.client.kroviz.to.PropertyDescription
 import org.apache.causeway.client.kroviz.to.TObject
 import org.apache.causeway.client.kroviz.to.TransferObject
 import org.apache.causeway.client.kroviz.to.bs.GridBs
+import org.apache.causeway.client.kroviz.to.bs.PropertyBs
 import org.apache.causeway.client.kroviz.utils.StringUtils
 
 class CollectionDM(override val title: String) : DisplayModelWithLayout() {
-    init {
-        layout = CollectionLayout()
-    }
+    val propertySpecificationHolder = PropertySpecificationHolder()
 
     var id = ""
     var data = observableListOf<Exposer>()
@@ -40,31 +41,61 @@ class CollectionDM(override val title: String) : DisplayModelWithLayout() {
     fun setProtoTypeLayout(grid: GridBs) {
         protoTypeLayout = grid
         val propertyList = grid.getPropertyList()
-        propertyList.forEach{
-            getLayout().addPropertyDetails(it)
+        propertyList.forEach {
+            addPropertyDetails(it)
+        }
+    }
+
+    /**
+     * collection layout needs only to be initialized once with an object (pars pro toto, prototype)
+     * obj acts as a kind prototype - we assume all elements in the collection have the same structure
+     */
+    fun addObject(obj: TObject, aggregator: CollectionAggregator, referrer: String) {
+        if (!propertySpecificationHolder.isInitialized()) {
+            // members contain all properties, regardless if hidden, disabled, etc.
+            val members = obj.getProperties()
+            members.forEach { m ->
+                propertySpecificationHolder.addMember(m)
+                val l = m.getInvokeLink()!!
+                ResourceProxy().fetch(l, aggregator, referrer = referrer)
+            }
         }
     }
 
+
+    private fun addPropertyDetails(propertyBs: PropertyBs) {
+        val id = propertyBs.id
+        val ps: PropertySpecification = propertySpecificationHolder.getPropertySpecification(id)
+        ps.amendWith(propertyBs)
+    }
+
+    fun addPropertyDescription(
+        propertyDescription: PropertyDescription,
+        aggregator: AggregatorWithLayout,
+        referrer: String
+    ) {
+        val id = propertyDescription.id
+        val ps: PropertySpecification = propertySpecificationHolder.getPropertySpecification(id)
+        ps.amendWith(propertyDescription)
+    }
+
+
     fun hasProtoType(): Boolean {
         return protoType != null
     }
 
-    fun setProtoType(to:TransferObject){
+    fun setProtoType(to: TransferObject) {
         protoType = to as TObject
     }
 
     override fun readyToRender(): Boolean {
-        return getLayout().readyToRender()
+        return propertySpecificationHolder.readyToRender()
     }
 
     fun getTitle(): String {
         return StringUtils.extractTitle(title)
     }
 
-    fun getLayout(): CollectionLayout {
-        return layout as CollectionLayout
-    }
-
     override fun addData(obj: TransferObject, aggregator: AggregatorWithLayout?, referrer: String?) {
         //TODO is checking rawdata really needed?
         if (!rawData.contains(obj)) {
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/causeway/client/kroviz/core/model/CollectionLayout.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/causeway/client/kroviz/core/model/CollectionLayout.kt
deleted file mode 100644
index 71b97e68ed..0000000000
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/causeway/client/kroviz/core/model/CollectionLayout.kt
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- *  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.causeway.client.kroviz.core.model
-
-import org.apache.causeway.client.kroviz.core.aggregator.AggregatorWithLayout
-import org.apache.causeway.client.kroviz.core.aggregator.CollectionAggregator
-import org.apache.causeway.client.kroviz.core.event.ResourceProxy
-import org.apache.causeway.client.kroviz.to.PropertyDescription
-import org.apache.causeway.client.kroviz.to.TObject
-import org.apache.causeway.client.kroviz.to.bs.PropertyBs
-
-/**
- * For collections aggregate information for each column
- * in order to display the table, namely:
- * - columnName :   column header/label
- * - id :           attribute to be used to retrieve the value of each cell (id)
- * - hidden :       will the column be displayed or not
- */
-class CollectionLayout : BaseLayout() {
-    var id = ""
-    var propertySpecificationList = mutableListOf<PropertySpecification>()
-
-    override fun readyToRender(): Boolean {
-        return isInitialized() && arePropertySpecificationsReadyToRender()
-    }
-
-    private fun arePropertySpecificationsReadyToRender():Boolean {
-        propertySpecificationList.forEach {
-            val ready = it.readyToRender()
-            if (!ready) {
-                return false
-            }
-        }
-        return true
-    }
-
-    /**
-     * collection layout needs only to be initialized once with an object (pars pro toto, prototype)
-     * obj acts as a kind prototype - we assume all elements in the collection have the same structure
-     */
-    fun addObject(obj: TObject, aggregator: CollectionAggregator, referrer: String) {
-        if (!isInitialized()) {
-            // members contain all properties, regardless if hidden, disabled, etc.
-            val members = obj.getProperties()
-            members.forEach { m ->
-                val ps = PropertySpecification(m)
-                propertySpecificationList.add(ps)
-                val l = m.getInvokeLink()!!
-                ResourceProxy().fetch(l, aggregator, referrer = referrer)
-            }
-        }
-    }
-
-    private fun isInitialized(): Boolean {
-        return propertySpecificationList.isNotEmpty() && propertySpecificationList.size > 0
-    }
-
-    fun addPropertyDetails(propertyBs: PropertyBs) {
-        val id = propertyBs.id
-        val ps: PropertySpecification = propertySpecificationList.firstOrNull { it.id == id }!!
-        ps.amendWith(propertyBs)
-    }
-
-    fun addPropertyDescription(
-        propertyDescription: PropertyDescription,
-        aggregator: AggregatorWithLayout,
-        referrer: String
-    ) {
-        val id = propertyDescription.id
-        val ps: PropertySpecification = propertySpecificationList.firstOrNull { it.id == id }!!
-        ps.amendWith(propertyDescription)
-    }
-
-}
\ No newline at end of file
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/causeway/client/kroviz/core/model/PropertySpecification.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/causeway/client/kroviz/core/model/PropertySpecification.kt
index d70a72b0f3..bbb872de0e 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/causeway/client/kroviz/core/model/PropertySpecification.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/causeway/client/kroviz/core/model/PropertySpecification.kt
@@ -23,28 +23,22 @@ import org.apache.causeway.client.kroviz.to.PropertyDescription
 import org.apache.causeway.client.kroviz.to.bs.PropertyBs
 
 /**
- * Properties have multiple aspects:
- *
- * - Member of a DomainObject
- * - Description (friendlyName, etc.)
- * - Layout (disabledReason, labelPosition, etc.)
- * - Visibility (hidden)
- *
- * All are required in order to be correctly displayed (in a table).
+ * Aggregate information for each column in order to display in a table, namely:
+ * - columnName :   column header/label
+ * - id :           attribute to be used to retrieve the value of each cell (id)
+ * - hidden :       will the column be displayed or not
  */
 class PropertySpecification(member: Member) {
     var id = member.id
     var name = "" // aka: columnName, named, label, title
     var hidden = true
     var disabled = member.disabledReason.isNotEmpty()
-    var isAmendedFromBs = false
-    var isAmendedFromPropertyDescription = false
+    private var isAmendedFromBs = false
+    private var isAmendedFromPropertyDescription = false
     var typicalLength: Int = 10
 
 
     fun amendWith(pbs: PropertyBs) {
-        console.log("[PS_amendWith] PropertyBs")
-        console.log(pbs)
         name = pbs.named
         hidden = !(pbs.hidden != null && pbs.hidden.isNotEmpty())
         //This is hacky
@@ -55,7 +49,6 @@ class PropertySpecification(member: Member) {
             typicalLength = pbs.typicalLength.toInt()
         }
         isAmendedFromBs = true
-        console.log(this)
     }
 
     fun amendWith(pd: PropertyDescription) {
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/causeway/client/kroviz/core/model/PropertySpecificationHolder.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/causeway/client/kroviz/core/model/PropertySpecificationHolder.kt
new file mode 100644
index 0000000000..05aa7f563b
--- /dev/null
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/causeway/client/kroviz/core/model/PropertySpecificationHolder.kt
@@ -0,0 +1,53 @@
+/*
+ *  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.causeway.client.kroviz.core.model
+
+import org.apache.causeway.client.kroviz.to.Member
+
+class PropertySpecificationHolder() {
+    var propertySpecificationList = mutableListOf<PropertySpecification>()
+
+    fun getPropertySpecification(id: String): PropertySpecification {
+        return propertySpecificationList.firstOrNull { it.id == id }!!
+    }
+
+    fun readyToRender(): Boolean {
+        return isInitialized() && arePropertySpecificationsReadyToRender()
+    }
+
+    private fun arePropertySpecificationsReadyToRender(): Boolean {
+        propertySpecificationList.forEach {
+            val ready = it.readyToRender()
+            if (!ready) {
+                return false
+            }
+        }
+        return true
+    }
+
+    fun addMember(m: Member) {
+        val ps = PropertySpecification(m)
+        propertySpecificationList.add(ps)
+    }
+
+    fun isInitialized(): Boolean {
+        return propertySpecificationList.isNotEmpty() && propertySpecificationList.size > 0
+    }
+
+}
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/causeway/client/kroviz/to/bs/PropertyBs.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/causeway/client/kroviz/to/bs/PropertyBs.kt
index 4c93d3e460..29d3773225 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/causeway/client/kroviz/to/bs/PropertyBs.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/causeway/client/kroviz/to/bs/PropertyBs.kt
@@ -36,11 +36,11 @@ class PropertyBs(node: Node) : XmlLayout() {
     init {
         // TODO improve casting
         val dn = node.asDynamic()
-        hidden = dn.getAttribute("hidden") //as String
-        id = dn.getAttribute("id") //as String
-        typicalLength = dn.getAttribute("typicalLength") //as Int
-        multiLine = dn.getAttribute("multiLine") //as Int
-        describedAs = dn.getAttribute("describedAs") //as String
+        hidden = dn.getAttribute("hidden").unsafeCast<String>()
+        id = dn.getAttribute("id").unsafeCast<String>()
+        typicalLength = dn.getAttribute("typicalLength").unsafeCast<Int>()
+        multiLine = dn.getAttribute("multiLine").unsafeCast<Int>()
+        describedAs = dn.getAttribute("describedAs").unsafeCast<String>()
 
         val nodeList = node.childNodes.asList()
         val namedList = nodeList.filter { it.nodeName == "$nsCpt:named" }
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/causeway/client/kroviz/ui/core/ColumnFactory.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/causeway/client/kroviz/ui/core/ColumnFactory.kt
index 1a710e5b7c..dc52247e6f 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/causeway/client/kroviz/ui/core/ColumnFactory.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/causeway/client/kroviz/ui/core/ColumnFactory.kt
@@ -25,7 +25,6 @@ import io.kvision.tabulator.Formatter
 import io.kvision.tabulator.js.Tabulator
 import io.kvision.utils.obj
 import org.apache.causeway.client.kroviz.core.model.CollectionDM
-import org.apache.causeway.client.kroviz.core.model.CollectionLayout
 import org.apache.causeway.client.kroviz.core.model.Exposer
 import org.apache.causeway.client.kroviz.ui.menu.DynamicMenuBuilder
 
@@ -46,8 +45,6 @@ class ColumnFactory {
         addColumnForObjectIcon(displayCollection, columns)
         addColumnsForProperties(displayCollection, columns)
         columns.add(columnForObjectMenu())
-        console.log("[CF_buildColumns]")
-        console.log(columns)
         return columns
     }
 
@@ -106,7 +103,7 @@ class ColumnFactory {
         collectionModel: CollectionDM,
         columns: MutableList<ColumnDefinition<Exposer>>,
     ) {
-        val clo = collectionModel.getLayout()
+        val clo = collectionModel.propertySpecificationHolder
         val propSpecList = clo.propertySpecificationList
         if (propSpecList.size == 0) {
             // without this, propSpecList is empty? problem with mutable list?
@@ -117,6 +114,7 @@ class ColumnFactory {
                 var colDef = ColumnDefinition<dynamic>(
                     title = it.name,
                     field = it.id,
+                    width = (it.typicalLength * 8).toString(),
                     headerFilter = Editor.INPUT)
                 if (it.id == "object") {
                     colDef = buildLink()
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/causeway/client/kroviz/ui/core/ViewManager.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/causeway/client/kroviz/ui/core/ViewManager.kt
index 02a7d4386b..12c3fb1ac7 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/causeway/client/kroviz/ui/core/ViewManager.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/causeway/client/kroviz/ui/core/ViewManager.kt
@@ -173,9 +173,7 @@ object ViewManager {
     }
 
     fun openObjectView(aggregator: ObjectAggregator) {
-        console.log("[VM_openObjectView]")
         val dm = aggregator.getDisplayModel()
-//        console.log(dm)
         val panel = RoDisplay(dm)
         add(aggregator.getTitle(), panel, aggregator)
         dm.isRendered = true