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

ahuber pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/causeway.git


The following commit(s) were added to refs/heads/master by this push:
     new e35f8bf139 CAUSEWAY-3797: offer column sorting only if underlying 
class is comparable
e35f8bf139 is described below

commit e35f8bf13993c06750d58e6dcd8d02111c606f5e
Author: Andi Huber <[email protected]>
AuthorDate: Thu Jun 27 06:29:06 2024 +0200

    CAUSEWAY-3797: offer column sorting only if underlying class is
    comparable
---
 .../causeway/core/metamodel/spec/ObjectSpecification.java      |  7 +++++++
 .../ajaxtable/CollectionContentsAsAjaxTablePanel.java          |  7 +++++--
 .../ajaxtable/columns/AssociationColumnAbstract.java           | 10 ++++++++--
 .../collectioncontents/ajaxtable/columns/PluralColumn.java     |  6 ++++--
 .../collectioncontents/ajaxtable/columns/SingularColumn.java   |  2 +-
 5 files changed, 25 insertions(+), 7 deletions(-)

diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/ObjectSpecification.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/ObjectSpecification.java
index 01acac6fa5..c86a8f95b6 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/ObjectSpecification.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/ObjectSpecification.java
@@ -458,6 +458,13 @@ extends
         return getBeanSort().isAbstract();
     }
 
+    /**
+    * Whether {@link #getCorrespondingClass()} implements {@link Comparable}.
+    */
+    default boolean isComparable() {
+        return Comparable.class.isAssignableFrom(getCorrespondingClass());
+    }
+
     /**
      * Includes abstract types that have {@link EntityFacet}.
      */
diff --git 
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/collectioncontents/ajaxtable/CollectionContentsAsAjaxTablePanel.java
 
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/collectioncontents/ajaxtable/CollectionContentsAsAjaxTablePanel.java
index bb6687ec82..c55bb2a34d 100644
--- 
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/collectioncontents/ajaxtable/CollectionContentsAsAjaxTablePanel.java
+++ 
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/collectioncontents/ajaxtable/CollectionContentsAsAjaxTablePanel.java
@@ -19,6 +19,7 @@
 package 
org.apache.causeway.viewer.wicket.ui.components.collectioncontents.ajaxtable;
 
 import java.util.List;
+import java.util.Optional;
 
 import org.apache.wicket.Component;
 import 
org.apache.wicket.extensions.ajax.markup.html.repeater.data.table.AjaxFallbackDefaultDataTable;
@@ -203,11 +204,14 @@ implements CollectionCountProvider {
     private SingularColumn createSingularColumn(final OneToOneAssociation 
property) {
         val collectionModel = getModel();
         final String parentTypeName = 
property.getDeclaringType().getLogicalTypeName();
+        final Optional<String> sortability = 
property.getElementType().isComparable()
+                ? Optional.of(property.getId())
+                : Optional.empty();
 
         return new SingularColumn(
                 collectionModel.getVariant(),
                 Model.of(property.getCanonicalFriendlyName()),
-                property.getId(),
+                sortability,
                 property.getId(),
                 parentTypeName,
                 property.getCanonicalDescription());
@@ -221,7 +225,6 @@ implements CollectionCountProvider {
                 collectionModel.getVariant(),
                 Model.of(collection.getCanonicalFriendlyName()),
                 collection.getId(),
-                collection.getId(),
                 parentTypeName,
                 collection.getCanonicalDescription(),
                 // future work: can hook up with global config
diff --git 
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/collectioncontents/ajaxtable/columns/AssociationColumnAbstract.java
 
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/collectioncontents/ajaxtable/columns/AssociationColumnAbstract.java
index 9d8da5a4fc..1f273d0411 100644
--- 
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/collectioncontents/ajaxtable/columns/AssociationColumnAbstract.java
+++ 
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/collectioncontents/ajaxtable/columns/AssociationColumnAbstract.java
@@ -55,12 +55,18 @@ extends GenericColumnAbstract {
     public AssociationColumnAbstract(
             final EntityCollectionModel.Variant collectionVariant,
             final IModel<String> columnNameModel,
-            final String sortProperty,
+            /**
+             * If empty, sorting is disabled for this column.
+             * <p>
+             * Not every column (e.g. as mapped to on association) is sortable.
+             * The referenced type must implement {@link Comparable}.
+             */
+            final Optional<String> sortProperty,
             final String memberId,
             final String parentTypeName,
             final Optional<String> describedAs) {
 
-        super(columnNameModel, sortProperty);
+        super(columnNameModel, sortProperty.orElse(null));
         this.collectionVariant = collectionVariant;
         this.memberId = memberId;
         this.parentTypeName = parentTypeName;
diff --git 
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/collectioncontents/ajaxtable/columns/PluralColumn.java
 
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/collectioncontents/ajaxtable/columns/PluralColumn.java
index f989d86fc8..bbcbb1164f 100644
--- 
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/collectioncontents/ajaxtable/columns/PluralColumn.java
+++ 
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/collectioncontents/ajaxtable/columns/PluralColumn.java
@@ -64,12 +64,14 @@ extends AssociationColumnAbstract {
     public PluralColumn(
             final EntityCollectionModel.Variant collectionVariant,
             final IModel<String> columnNameModel,
-            final String sortProperty,
             final String propertyId,
             final String parentTypeName,
             final Optional<String> describedAs,
             final RenderOptions opts) {
-        super(collectionVariant, columnNameModel, sortProperty, propertyId, 
parentTypeName, describedAs);
+        super(collectionVariant, columnNameModel,
+                null // sortProperty .. never sortable
+                ,
+                propertyId, parentTypeName, describedAs);
         this.opts = opts;
     }
 
diff --git 
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/collectioncontents/ajaxtable/columns/SingularColumn.java
 
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/collectioncontents/ajaxtable/columns/SingularColumn.java
index 0135a4c0d5..9f730538ed 100644
--- 
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/collectioncontents/ajaxtable/columns/SingularColumn.java
+++ 
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/collectioncontents/ajaxtable/columns/SingularColumn.java
@@ -39,7 +39,7 @@ extends AssociationColumnAbstract {
     public SingularColumn(
             final EntityCollectionModel.Variant collectionVariant,
             final IModel<String> columnNameModel,
-            final String sortProperty,
+            final Optional<String> sortProperty,
             final String propertyId,
             final String parentTypeName,
             final Optional<String> describedAs) {

Reply via email to