You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@causeway.apache.org by ah...@apache.org on 2023/11/20 14:35:47 UTC

(causeway) branch master updated: CAUSEWAY-3646: style fixes

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 f3067235ff CAUSEWAY-3646: style fixes
f3067235ff is described below

commit f3067235ff888b8f95719d2bfcd2015d2df79837
Author: Andi Huber <ah...@apache.org>
AuthorDate: Mon Nov 20 15:35:42 2023 +0100

    CAUSEWAY-3646: style fixes
---
 .../causeway/applib/fa/FontAwesomeLayers.java      | 77 +++++++++++++++-------
 .../members/iconfa/FaStaticFacetAbstract.java      |  2 +-
 .../iconfa/FontAwesomeLayersFacetMethodTest.java   |  2 +-
 .../bootstrap/css/bootstrap-overrides-all-v2.css   |  5 +-
 4 files changed, 58 insertions(+), 28 deletions(-)

diff --git a/api/applib/src/main/java/org/apache/causeway/applib/fa/FontAwesomeLayers.java b/api/applib/src/main/java/org/apache/causeway/applib/fa/FontAwesomeLayers.java
index aebf24339a..3c97b26c6b 100644
--- a/api/applib/src/main/java/org/apache/causeway/applib/fa/FontAwesomeLayers.java
+++ b/api/applib/src/main/java/org/apache/causeway/applib/fa/FontAwesomeLayers.java
@@ -30,9 +30,13 @@ import org.apache.causeway.commons.collections.Can;
 import org.apache.causeway.commons.internal.base._NullSafe;
 import org.apache.causeway.commons.internal.base._Strings;
 
+import lombok.NonNull;
 import lombok.experimental.Accessors;
 
 /**
+ * <h1>EXPERIMENTAL FEATURE WARNING</h1>
+ * This class is still subject to changes without warning or notice!
+ * <p>
  * Model for a single or multiple (layered) <i>Font Awesome</i> icon(s).
  *
  * @since 2.0 {@index}
@@ -53,23 +57,34 @@ public class FontAwesomeLayers implements Serializable {
         return singleIcon("fa-blank");
     }
 
+    public static FontAwesomeLayers fallback() {
+        return singleIcon("fa-cube");
+    }
+
     public static FontAwesomeLayers singleIcon(final String faClasses) {
-        return new FontAwesomeLayers(null, null, List.of(new IconEntry(normalizeFaClasses(faClasses), null)), null);
+        return new FontAwesomeLayers(null, null, List.of(new IconEntry(normalizeCssClasses(faClasses, "fa"), null)), null);
     }
 
-    public static FontAwesomeLayers iconStack(final IconEntry baseEntry, final IconEntry overlayEntry) {
-        return new FontAwesomeLayers(null, null, List.of(baseEntry, overlayEntry), null);
+    public static FontAwesomeLayers iconStack(
+            final @Nullable String containerCssClasses,
+            final @Nullable String containerCssStyle,
+            final @NonNull IconEntry baseEntry,
+            final @NonNull IconEntry overlayEntry) {
+        return new FontAwesomeLayers(
+                normalizeCssClasses(containerCssClasses, "fa-stack"),
+                containerCssStyle,
+                List.of(baseEntry, overlayEntry), null);
     }
 
     // -- UTILITIES
 
-    public static String normalizeFaClasses(final String faClasses) {
-        var elements = _Strings.splitThenStream(faClasses, " ")
-                .map(String::trim)
-                .filter(_Strings::isNotEmpty)
-                .sorted((a, b)->a.compareTo(b))
-                .collect(Collectors.toCollection(TreeSet::new));
-        elements.add("fa"); // mandatory
+    public static String normalizeCssClasses(final String cssClasses, final String... mandatory) {
+        var elements = _Strings.splitThenStream(cssClasses, " ")
+            .map(String::trim)
+            .filter(_Strings::isNotEmpty)
+            .collect(Collectors.toCollection(TreeSet::new));
+        _NullSafe.stream(mandatory)
+            .forEach(elements::add);
         return elements.stream().collect(Collectors.joining(" "));
     }
 
@@ -79,6 +94,18 @@ public class FontAwesomeLayers implements Serializable {
     public static class IconEntry {
         @Nullable String cssClasses;
         @Nullable String cssStyle;
+        public String toHtml() {
+            return faIconHtml(cssClasses, cssStyle);
+        }
+        // -- HELPER
+        private static String faIconHtml(final @Nullable String faClasses) {
+            if(_Strings.isEmpty(faClasses)) return "";
+            return String.format("<i class=\"%s\"></i>", faClasses);
+        }
+        private static String faIconHtml(final @Nullable String faClasses, final @Nullable String faStyle) {
+            if(_Strings.isEmpty(faStyle)) return faIconHtml(faClasses);
+            return String.format("<i class=\"%s\" style=\"%s\"></i>", faClasses, faStyle);
+        }
     }
 
     @lombok.Value @Accessors(fluent=true) // record candidate
@@ -103,22 +130,15 @@ public class FontAwesomeLayers implements Serializable {
         var iconEntries = Can.ofCollection(iconEntries());
         if(iconEntries.isEmpty()) {
             // fallback to cube icon
-            return "<span>"
-                + faIcon("fa-cube")
-                + "</span>";
+            return fallback().toHtml();
         }
         if(iconEntries.isCardinalityOne()) {
             // use simple rendering (not a stack nor layered)
-            return "<span>"
-                + faIcon(iconEntries.getFirstElseFail().cssClasses())
-                + "</span>";
+            return faSpanHtml(iconEntries.getFirstElseFail().toHtml(), null, null);
         }
         var sb = new StringBuilder();
-        iconEntries.forEach(iconEntry->sb.append(faIcon(iconEntry.cssClasses())));
-        //TODO[CAUSEWAY-3646] remove hardcoded tweaks
-        return "<span class=\"fa-stack\" style=\"width: 1.2rem;\">"
-                + sb.toString()
-                + "</span>";
+        iconEntries.forEach(iconEntry->sb.append(iconEntry.toHtml()));
+        return faSpanHtml(sb.toString(), containerCssClasses, containerCssStyle);
     }
 
     // -- UTILITY
@@ -132,8 +152,17 @@ public class FontAwesomeLayers implements Serializable {
 
     // -- HELPER
 
-    private String faIcon(final String faClasses) {
-        return String.format("<i class=\"%s\"></i>", faClasses);
+    private static String faSpanHtml(
+            final @Nullable String innerHtml,
+            final @Nullable String cssClasses,
+            final @Nullable String cssStyle) {
+        if(_Strings.isEmpty(innerHtml)) return "";
+        var attrClass = _Strings.nonEmpty(cssClasses)
+                .map(s->String.format(" class=\"%s\"", s))
+                .orElse("");
+        var attrStyle = _Strings.nonEmpty(cssStyle)
+                .map(s->String.format(" style=\"%s\"", s))
+                .orElse("");
+        return String.format("<span%s%s>%s</span>", attrClass, attrStyle, innerHtml);
     }
-
 }
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/members/iconfa/FaStaticFacetAbstract.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/members/iconfa/FaStaticFacetAbstract.java
index d06db05f3d..4d42e4b943 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/members/iconfa/FaStaticFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/members/iconfa/FaStaticFacetAbstract.java
@@ -85,7 +85,7 @@ implements FaStaticFacet {
 
     @Override
     public final FontAwesomeLayers getLayers() {
-        return FontAwesomeLayers.singleIcon(asSpaceSeparatedWithAdditional(FIXED_WIDTH));
+        return FontAwesomeLayers.singleIcon(asSpaceSeparatedWithAdditional("fa-lg"));
     }
 
     @Override
diff --git a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/object/ident/iconfa/FontAwesomeLayersFacetMethodTest.java b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/object/ident/iconfa/FontAwesomeLayersFacetMethodTest.java
index 6f5fa7a50e..7552b1d025 100644
--- a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/object/ident/iconfa/FontAwesomeLayersFacetMethodTest.java
+++ b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/object/ident/iconfa/FontAwesomeLayersFacetMethodTest.java
@@ -78,7 +78,7 @@ extends FacetFactoryTestAbstract {
             var actual = imperativeCssClassFacet.getFaLayersProvider(domainObject).getLayers();
             assertEquals(FONTAWESOME_LAYERS_SAMPLE, actual);
             assertEquals(
-                    FontAwesomeLayers.normalizeFaClasses("fa-solid fa-bookmark"),
+                    FontAwesomeLayers.normalizeCssClasses("fa-solid fa-bookmark", "fa"),
                     actual.iconEntries().get(0).cssClasses());
         });
     }
diff --git a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/pages/common/bootstrap/css/bootstrap-overrides-all-v2.css b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/pages/common/bootstrap/css/bootstrap-overrides-all-v2.css
index 1e9e8b1b59..5115e9df19 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/pages/common/bootstrap/css/bootstrap-overrides-all-v2.css
+++ b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/pages/common/bootstrap/css/bootstrap-overrides-all-v2.css
@@ -573,8 +573,9 @@ span.containedButtonPanel {
 }
 
 /* fa icon size for page titles */
-.entityHeaderPanel .fa {
-  font-size: 1.5em;
+.entityHeaderPanel .entityIconAndTitlePanel .fa,
+.entityHeaderPanel .entityIconAndTitlePanel .fa-stack {
+    font-size: calc(1.275rem + .3vw);
 }
 
 /** top alignment for additional buttons on scalar value inputs */