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 356e72ea92 CAUSEWAY-3797: allows sorting for primitives, strings and 
enums
356e72ea92 is described below

commit 356e72ea928e5f17191d19f2e31252104cd613ed
Author: Andi Huber <[email protected]>
AuthorDate: Thu Jun 27 13:43:26 2024 +0200

    CAUSEWAY-3797: allows sorting for primitives, strings and enums
    
    - also has some CSS fixes for the column header
---
 .../core/metamodel/spec/ObjectSpecification.java   | 11 +++++---
 .../CollectionContentsAsAjaxTablePanel.css         | 29 +++++++++++-----------
 .../CollectionContentsAsAjaxTablePanel.java        |  2 +-
 .../ui/components/table/head/HeadersToolbar.html   |  2 +-
 .../table/head/HeadersToolbarAbstract.java         | 19 ++++++--------
 5 files changed, 32 insertions(+), 31 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 c86a8f95b6..b42e21785b 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
@@ -459,10 +459,15 @@ extends
     }
 
     /**
-    * Whether {@link #getCorrespondingClass()} implements {@link Comparable}.
+    * Whether {@link #getCorrespondingClass()} implements {@link Comparable}
+    * or has ordering (primitives, strings and enums).
     */
-    default boolean isComparable() {
-        return Comparable.class.isAssignableFrom(getCorrespondingClass());
+    default boolean isComparableOrOrdered() {
+        var cls = getCorrespondingClass();
+        return Comparable.class.isAssignableFrom(cls)
+                || cls.isPrimitive()
+                || cls.equals(String.class)
+                || cls.isEnum();
     }
 
     /**
diff --git 
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/collectioncontents/ajaxtable/CollectionContentsAsAjaxTablePanel.css
 
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/collectioncontents/ajaxtable/CollectionContentsAsAjaxTablePanel.css
index 5181dc487f..9be79e6ab0 100644
--- 
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/collectioncontents/ajaxtable/CollectionContentsAsAjaxTablePanel.css
+++ 
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/collectioncontents/ajaxtable/CollectionContentsAsAjaxTablePanel.css
@@ -19,7 +19,7 @@
 
  /* CSS for the Table Panel and all its child components, toolbars, search-bar 
etc. */
  
- .table-header-sortIcon {
+ .collectionContentsAsAjaxTablePanel .table-header-sortIcon {
        color: grey;
  }
  
@@ -28,6 +28,18 @@
        margin-right: 1rem;
 }
 
+.collectionContentsAsAjaxTablePanel th.column-sortable .column-header-label {
+  color:var(--link-color);
+  opacity:0.75;
+  vertical-align: middle;
+}
+.collectionContentsAsAjaxTablePanel th.column-sortable a:hover 
.column-header-label,
+.collectionContentsAsAjaxTablePanel th.column-nonsortable .column-header-label 
{
+  color:var(--link-color-hover);
+  opacity:0.75;
+  vertical-align: middle;
+}
+
 /* table search bar is present only optionally on tables, so if present, 
        it needs a bit of top spacing (but only in parented tables, 
        standalone tables don't have the 'padding-top: 0px' CSS hack) */
@@ -54,21 +66,10 @@
     margin-top:10px;
 }
 
-.collectionContentsAsAjaxTablePanel table.contents caption { text-align: left; 
}
-/*
-.collectionContentsAsAjaxTablePanel table.contents tr {
-}
-*/
-
-.collectionContentsAsAjaxTablePanel table.contents tr th,
-.collectionContentsAsAjaxTablePanel table.contents tr th a span {
-    text-align: left;
-    font-weight: bold;
+.collectionContentsAsAjaxTablePanel table.contents caption { 
+    text-align: left; 
 }
 
-.collectionContentsAsAjaxTablePanel table.contents tr th a {
-    font-weight: normal;
-}
 .collectionContentsAsAjaxTablePanel table.contents #message {
     padding-left: 3px;
 }
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 c55bb2a34d..42be9061bf 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
@@ -204,7 +204,7 @@ implements CollectionCountProvider {
     private SingularColumn createSingularColumn(final OneToOneAssociation 
property) {
         val collectionModel = getModel();
         final String parentTypeName = 
property.getDeclaringType().getLogicalTypeName();
-        final Optional<String> sortability = 
property.getElementType().isComparable()
+        final Optional<String> sortability = 
property.getElementType().isComparableOrOrdered()
                 ? Optional.of(property.getId())
                 : Optional.empty();
 
diff --git 
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/table/head/HeadersToolbar.html
 
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/table/head/HeadersToolbar.html
index c01ae0aa14..b393acee4e 100644
--- 
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/table/head/HeadersToolbar.html
+++ 
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/table/head/HeadersToolbar.html
@@ -20,7 +20,7 @@
         <wicket:container wicket:id="headers">
             <th wicket:id="header">
                 <div>
-                    <strong wicket:id="label">[header-label]</strong>
+                    <strong wicket:id="label" 
class="column-header-label">[header-label]</strong>
                                        <span wicket:id="sortIcon" 
class="table-header-sortIcon" style="margin-left: 0.2em"></span>
                 </div>
             </th>
diff --git 
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/table/head/HeadersToolbarAbstract.java
 
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/table/head/HeadersToolbarAbstract.java
index 3a1cb26930..3a055901be 100644
--- 
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/table/head/HeadersToolbarAbstract.java
+++ 
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/table/head/HeadersToolbarAbstract.java
@@ -40,7 +40,6 @@ import org.apache.wicket.markup.repeater.Item;
 import org.apache.wicket.markup.repeater.RefreshingView;
 import org.apache.wicket.model.IModel;
 import org.apache.wicket.model.Model;
-import org.apache.wicket.util.string.Strings;
 
 import org.apache.causeway.commons.internal.base._Casts;
 import org.apache.causeway.core.config.CausewayConfiguration;
@@ -70,10 +69,7 @@ abstract class HeadersToolbarAbstract<S> extends 
AbstractToolbar {
          */
         @Override
         public void onComponentTag(final Component component, final 
ComponentTag tag) {
-            String className = getCssClass();
-            if (!Strings.isEmpty(className)) {
-                tag.append("class", className, " ");
-            }
+            Wkt.cssAppend(tag, getCssClass());
         }
     }
 
@@ -118,17 +114,13 @@ abstract class HeadersToolbarAbstract<S> extends 
AbstractToolbar {
                     header = newSortableHeader("header", 
column.getSortProperty(), stateLocator);
 
                     if (column instanceof IStyledColumn) {
-                        CssAttributeBehavior cssAttributeBehavior = new 
CssAttributeBehavior() {
+                        header.add(new CssAttributeBehavior() {
                             private static final long serialVersionUID = 1L;
-
                             @Override
-                            protected String getCssClass()
-                            {
+                            protected String getCssClass() {
                                 return ((IStyledColumn<?, 
S>)column).getCssClass();
                             }
-                        };
-
-                        header.add(cssAttributeBehavior);
+                        });
                     }
                 } else {
                     header = new WebMarkupContainer("header");
@@ -143,6 +135,9 @@ abstract class HeadersToolbarAbstract<S> extends 
AbstractToolbar {
                 if(column instanceof TitleColumn) {
                     Wkt.cssAppend(header, "title-column");
                 }
+                Wkt.cssAppend(header, column.isSortable()
+                        ? "column-sortable"
+                        : "column-nonsortable");
             }
         };
         add(headers);

Reply via email to