You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ofbiz.apache.org by nm...@apache.org on 2022/07/01 16:24:04 UTC

[ofbiz-framework] branch release22.01 updated: Improved: Convert a display-entity to hyperlink if subhyperlink this empty (OFBIZ-12547)

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

nmalin pushed a commit to branch release22.01
in repository https://gitbox.apache.org/repos/asf/ofbiz-framework.git


The following commit(s) were added to refs/heads/release22.01 by this push:
     new 8cccb4b586 Improved: Convert a display-entity to hyperlink if subhyperlink this empty (OFBIZ-12547)
8cccb4b586 is described below

commit 8cccb4b586e120d5e550beeec820e72b73102455
Author: Nicolas Malin <ni...@nereide.fr>
AuthorDate: Fri Jul 1 18:21:17 2022 +0200

    Improved: Convert a display-entity to hyperlink if subhyperlink this empty (OFBIZ-12547)
    
    When you define a display-entity you have the possibility to add a sub-hyperlink related to the element displayed.
    
                 <field name="partyIdFrom">
                    <display-entity entity-name="PartyNameView" key-field-name="partyId" description="${groupName}${firstName} ${lastName}">
                        <sub-hyperlink target="viewprofile" description="view">...</sub-hyperlink>
                    </display-entity>
                <field>
    
    This display the party name with a link "view" connected.
    
    When you use the name as link without a dedicate sub link, you need to change all the form to resolve the information to display for creating an hyperlink
    
                <row-actions>
                    <entity-one entity-name="PartyNameView" value-field="partyName">
                            <field-map field-name="partyId" from-field="partyIdFrom"/>
                    </entity-one>
                    <set field="partyNameValue" value=" ${partyName.groupName}${partyName.firstName} ${partyName.lastName}"/>
                </row-actions>
                <field name="partyIdFrom">
                    <hyperlink target="viewprofile" description="${partyNameValue}">..</hyperlink>
                </field>
    
    We lost the advantage of the display-entity. With this case, we improve display-entity with the following rule :
    
    If the display-entity has a subhyperlink and the subhyperlink haven't description, the description of the link is the display-entity description.
    In the code, if a sub-hyperlink has an empty description, we convert the display entity as a hyperlink
---
 .../apache/ofbiz/widget/model/ModelFormField.java  | 31 ++++++++++++++++++++++
 .../widget/renderer/macro/MacroFormRenderer.java   | 22 ++++++++++-----
 .../renderer/macro/MacroFormRendererTest.java      |  4 +--
 3 files changed, 48 insertions(+), 9 deletions(-)

diff --git a/framework/widget/src/main/java/org/apache/ofbiz/widget/model/ModelFormField.java b/framework/widget/src/main/java/org/apache/ofbiz/widget/model/ModelFormField.java
index 26db8ebae3..c1d16e3f26 100644
--- a/framework/widget/src/main/java/org/apache/ofbiz/widget/model/ModelFormField.java
+++ b/framework/widget/src/main/java/org/apache/ofbiz/widget/model/ModelFormField.java
@@ -1568,6 +1568,30 @@ public final class ModelFormField {
         public SubHyperlink getSubHyperlink() {
             return this.subHyperlink;
         }
+
+        /**
+         * Analyze if a sub hyperlink is associate to the display entity with an empty description
+         * @param context
+         * @return
+         */
+        public boolean needConvertAsHyperlink(Map<String, Object> context) {
+            return getSubHyperlink() != null
+                    && getSubHyperlink().shouldUse(context)
+                    && getSubHyperlink().getDescription(context).isEmpty();
+        }
+
+        /**
+         * Convert the display entity as a Hyperlink for the rendering
+         * @param context
+         * @return
+         */
+        public HyperlinkField asHyperlink(Map<String, Object> context) {
+            return new HyperlinkField(getModelFormField(),
+                    getDescription(context),
+                    getSubHyperlink().getLink(),
+                    getAlsoHidden());
+        }
+
     }
 
     /**
@@ -2801,6 +2825,13 @@ public final class ModelFormField {
             this.link = new Link(element);
         }
 
+        public HyperlinkField(ModelFormField modelFormField, String description, Link link, boolean alsoHidden) {
+            super(FieldInfo.SOURCE_EXPLICIT, FieldInfo.HYPERLINK, modelFormField);
+            this.alsoHidden = alsoHidden;
+            this.description = FlexibleStringExpander.getInstance(description);
+            this.link = link;
+        }
+
         private HyperlinkField(HyperlinkField original, ModelFormField modelFormField) {
             super(original.getFieldSource(), original.getFieldType(), modelFormField);
             this.alsoHidden = original.alsoHidden;
diff --git a/framework/widget/src/main/java/org/apache/ofbiz/widget/renderer/macro/MacroFormRenderer.java b/framework/widget/src/main/java/org/apache/ofbiz/widget/renderer/macro/MacroFormRenderer.java
index d7501ae6a9..38fb5ebfdd 100644
--- a/framework/widget/src/main/java/org/apache/ofbiz/widget/renderer/macro/MacroFormRenderer.java
+++ b/framework/widget/src/main/java/org/apache/ofbiz/widget/renderer/macro/MacroFormRenderer.java
@@ -183,14 +183,21 @@ public final class MacroFormRenderer implements FormStringRenderer {
     }
 
     @Override
-    public void renderDisplayField(Appendable writer, Map<String, Object> context, DisplayField displayField) {
-        writeFtlElement(writer,
-                renderableFtlFormElementsBuilder.displayField(context, displayField, this.javaScriptEnabled));
+    public void renderDisplayField(Appendable writer, Map<String, Object> context, DisplayField displayField)
+            throws IOException {
+        if (displayField instanceof DisplayEntityField
+                && ((DisplayEntityField) displayField).needConvertAsHyperlink(context)) {
 
-        if (displayField instanceof DisplayEntityField) {
+            // When we have a subHyperlink on a display entity, display all as a hyperlink
+            renderHyperlinkField(writer, context, ((DisplayEntityField) displayField).asHyperlink(context));
+        } else {
             writeFtlElement(writer,
-                    renderableFtlFormElementsBuilder.makeHyperlinkString(((DisplayEntityField) displayField).getSubHyperlink(),
-                            context));
+                    renderableFtlFormElementsBuilder.displayField(context, displayField, this.javaScriptEnabled));
+            if (displayField instanceof DisplayEntityField) {
+                writeFtlElement(writer,
+                        renderableFtlFormElementsBuilder.makeHyperlinkString(((DisplayEntityField) displayField).getSubHyperlink(),
+                                context));
+            }
         }
 
         final ModelFormField modelFormField = displayField.getModelFormField();
@@ -198,7 +205,8 @@ public final class MacroFormRenderer implements FormStringRenderer {
     }
 
     @Override
-    public void renderHyperlinkField(Appendable writer, Map<String, Object> context, HyperlinkField hyperlinkField) throws IOException {
+    public void renderHyperlinkField(Appendable writer, Map<String, Object> context, HyperlinkField hyperlinkField)
+            throws IOException {
         this.request.setAttribute("image", hyperlinkField.getImageLocation(context));
         ModelFormField modelFormField = hyperlinkField.getModelFormField();
         String encodedAlternate = encode(hyperlinkField.getAlternate(context), modelFormField, context);
diff --git a/framework/widget/src/test/java/org/apache/ofbiz/widget/renderer/macro/MacroFormRendererTest.java b/framework/widget/src/test/java/org/apache/ofbiz/widget/renderer/macro/MacroFormRendererTest.java
index 9951a29a0e..a30fb15b01 100644
--- a/framework/widget/src/test/java/org/apache/ofbiz/widget/renderer/macro/MacroFormRendererTest.java
+++ b/framework/widget/src/test/java/org/apache/ofbiz/widget/renderer/macro/MacroFormRendererTest.java
@@ -145,7 +145,7 @@ public class MacroFormRendererTest {
     }
 
     @Test
-    public void displayFieldRendersFieldWithTooltip(@Mocked ModelFormField.DisplayField displayField) {
+    public void displayFieldRendersFieldWithTooltip(@Mocked ModelFormField.DisplayField displayField) throws IOException {
         new Expectations() {
             {
                 renderableFtlFormElementsBuilder.displayField(withNotNull(), withNotNull(), anyBoolean);
@@ -163,7 +163,7 @@ public class MacroFormRendererTest {
     @Test
     public void displayEntityFieldRendersFieldWithLinkAndTooltip(
             @Mocked ModelFormField.DisplayEntityField displayEntityField,
-            @Mocked ModelFormField.SubHyperlink subHyperlink) {
+            @Mocked ModelFormField.SubHyperlink subHyperlink) throws IOException {
         new Expectations() {
             {
                 renderableFtlFormElementsBuilder.displayField(withNotNull(), withNotNull(), anyBoolean);