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

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


The following commit(s) were added to refs/heads/trunk by this push:
     new 0b9cbae4cb Implemented: Add header screen for the screenlet (#1342)
0b9cbae4cb is described below

commit 0b9cbae4cb808453971ec9bb3163579b1eb09599
Author: Nicolas Malin <[email protected]>
AuthorDate: Fri Jun 19 15:06:24 2026 +0200

    Implemented: Add header screen for the screenlet (#1342)
    
    The screenlet can receive a title to describe the content's body,
    and you can collapse it to optimize the page.
    
    If you want to define an advanced layouts display, the title isn't enough 
so we
    improved it by adding a header screen.
    
    This way you can prepare your screenlet like :
    ```xml
        <screen ...>...
            <screenlet screen-header-name="MyScreenletHeader" 
collapsible="true">
                <include-grid name="ComplexeGrid" location=".../>
            </screenlet>
        </screen>
        <screen name="MyScreenletHeader">
           <column-container>
               <column>
                   <label>My Title</label>
                   <label>My Desc</label>
               </column>
               <column>
                   <label>${numberElement}</label>
                   <label>${warnElement}</label>
               </column>
            </column-container>...
        </screen>
    ```
    
    With this, you can harness the screen engine's power without adding 
unnecessary complexity
    on the framework to manage complex cases.
---
 framework/webtools/config/WebtoolsUiLabels.xml       |  4 ++++
 framework/webtools/widget/MiscScreens.xml            | 13 +++++++++++++
 framework/widget/dtd/widget-screen.xsd               | 10 ++++++++++
 .../apache/ofbiz/widget/model/ModelScreenWidget.java | 20 ++++++++++++++++++++
 .../widget/renderer/macro/MacroScreenRenderer.java   | 10 ++++++++++
 .../template/macro/CsvScreenMacroLibrary.ftl         |  2 +-
 .../template/macro/FoScreenMacroLibrary.ftl          |  2 +-
 .../template/macro/HtmlScreenMacroLibrary.ftl        |  3 ++-
 .../template/macro/TextScreenMacroLibrary.ftl        |  2 +-
 .../template/macro/XlsScreenMacroLibrary.ftl         |  2 +-
 .../template/macro/XmlScreenMacroLibrary.ftl         |  2 +-
 11 files changed, 64 insertions(+), 6 deletions(-)

diff --git a/framework/webtools/config/WebtoolsUiLabels.xml 
b/framework/webtools/config/WebtoolsUiLabels.xml
index 1df293e5ed..786515d1b0 100644
--- a/framework/webtools/config/WebtoolsUiLabels.xml
+++ b/framework/webtools/config/WebtoolsUiLabels.xml
@@ -3325,6 +3325,10 @@
         <value xml:lang="zh">布局演示</value>
         <value xml:lang="zh-TW">佈局演示</value>
     </property>
+    <property key="WebtoolsLayoutDemoSimpleGridHeaderInfo">
+        <value xml:lang="en">Demonstration of a complex header for a collapsed 
screenlet</value>
+        <value xml:lang="fr">Démonstration d'entête complexe pour screenlet 
repliée</value>
+    </property>
     <property key="WebtoolsLayoutDemoText">
         <value xml:lang="en">Demonstrate layout best practices and provide a 
visual theme test page (it's recommended to use HTML source code).</value>
         <value xml:lang="fr">Démontre les bonnes pratiques de mise en page et 
fournit un page de test pour les thèmes (il est recommandé d'utiliser le code 
source HTML).</value>
diff --git a/framework/webtools/widget/MiscScreens.xml 
b/framework/webtools/widget/MiscScreens.xml
index 965eeea806..fe97701fb5 100644
--- a/framework/webtools/widget/MiscScreens.xml
+++ b/framework/webtools/widget/MiscScreens.xml
@@ -201,6 +201,10 @@ under the License.
                                             <include-form 
name="LayoutDemoList" location="component://webtools/widget/MiscForms.xml"/>
                                             <include-form 
name="LayoutDemoForm" location="component://webtools/widget/MiscForms.xml"/>
                                         </screenlet>
+                                        <screenlet id="screenlet-demo-header" 
collapsible="true" initially-collapsed="true"
+                                                   
screen-header-name="WebtoolsLayoutDemoSimpleGridHeader">
+                                            <include-grid 
name="LayoutDemoSimpleGrid" 
location="component://webtools/widget/MiscForms.xml"/>
+                                        </screenlet>
                                     </widgets>
                                 </section>
                             </widgets>
@@ -213,6 +217,15 @@ under the License.
             </widgets>
         </section>
     </screen>
+    <screen name="WebtoolsLayoutDemoSimpleGridHeader">
+        <section>
+            <widgets>
+                <label style="h2">${uiLabelMap.WebtoolsLayoutDemo}</label>
+                <horizontal-separator/>
+                
<label>${uiLabelMap.WebtoolsLayoutDemoSimpleGridHeaderInfo}</label>
+            </widgets>
+        </section>
+    </screen>
 
     <screen name="WebtoolsLayoutDemoFop">
         <section>
diff --git a/framework/widget/dtd/widget-screen.xsd 
b/framework/widget/dtd/widget-screen.xsd
index a75606732a..7e02513a07 100644
--- a/framework/widget/dtd/widget-screen.xsd
+++ b/framework/widget/dtd/widget-screen.xsd
@@ -312,6 +312,16 @@ under the License.
                     <xs:documentation>Name of the screenlet include-menu sub 
element that will be used for the screenlet tab bar.</xs:documentation>
                 </xs:annotation>
             </xs:attribute>
+            <xs:attribute type="xs:string" name="screen-header-name">
+                <xs:annotation>
+                    <xs:documentation>Name of the screen to define advanced 
layouts for a screenlet’s header. When the screenlet is minimized, the header 
remains visible</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute type="xs:string" name="screen-header-location">
+                <xs:annotation>
+                    <xs:documentation>Location of the screen to define 
advanced layouts for a screenlet’s header. If empty use the same location of 
the screenlet's parent screen.</xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
         </xs:complexType>
     </xs:element>
 
diff --git 
a/framework/widget/src/main/java/org/apache/ofbiz/widget/model/ModelScreenWidget.java
 
b/framework/widget/src/main/java/org/apache/ofbiz/widget/model/ModelScreenWidget.java
index 95806b46f5..0a220f3f8c 100644
--- 
a/framework/widget/src/main/java/org/apache/ofbiz/widget/model/ModelScreenWidget.java
+++ 
b/framework/widget/src/main/java/org/apache/ofbiz/widget/model/ModelScreenWidget.java
@@ -37,6 +37,7 @@ import org.apache.ofbiz.base.util.StringUtil;
 import org.apache.ofbiz.base.util.UtilCodec;
 import org.apache.ofbiz.base.util.UtilGenerics;
 import org.apache.ofbiz.base.util.UtilMisc;
+import org.apache.ofbiz.base.util.UtilValidate;
 import org.apache.ofbiz.base.util.UtilXml;
 import org.apache.ofbiz.base.util.collections.MapStack;
 import org.apache.ofbiz.base.util.string.FlexibleStringExpander;
@@ -542,6 +543,8 @@ public abstract class ModelScreenWidget extends ModelWidget 
{
         public static final String TAG_NAME = "screenlet";
         private final FlexibleStringExpander idExdr;
         private final FlexibleStringExpander titleExdr;
+        private final FlexibleStringExpander screenHeaderNameExpr;
+        private final FlexibleStringExpander screenHeaderLocationExpr;
         private final Menu navigationMenu;
         private final Menu tabMenu;
         private final Form navigationForm;
@@ -606,6 +609,11 @@ public abstract class ModelScreenWidget extends 
ModelWidget {
                     }
                 }
             }
+
+            this.screenHeaderNameExpr = FlexibleStringExpander.getInstance(
+                    screenletElement.getAttribute("screen-header-name"));
+            this.screenHeaderLocationExpr = FlexibleStringExpander.getInstance(
+                    screenletElement.getAttribute("screen-header-location"));
             this.subWidgets = Collections.unmodifiableList(subWidgets);
             this.navigationForm = navigationForm;
             this.padded = padded;
@@ -725,6 +733,18 @@ public abstract class ModelScreenWidget extends 
ModelWidget {
         public boolean getPadded() {
             return padded;
         }
+
+        public String getScreenHeader(Map<String, Object> context) {
+            String screenHeaderName = 
this.screenHeaderNameExpr.expandString(context);
+            if (UtilValidate.isEmpty(screenHeaderName)) {
+                return null;
+            }
+            String screenHeaderLocation = 
this.screenHeaderLocationExpr.expandString(context);
+            if (UtilValidate.isEmpty(screenHeaderLocation)) {
+                screenHeaderLocation = 
this.getModelScreen().getSourceLocation();
+            }
+            return screenHeaderLocation + "#" + screenHeaderName;
+        }
     }
 
     public static final class HorizontalSeparator extends ModelScreenWidget {
diff --git 
a/framework/widget/src/main/java/org/apache/ofbiz/widget/renderer/macro/MacroScreenRenderer.java
 
b/framework/widget/src/main/java/org/apache/ofbiz/widget/renderer/macro/MacroScreenRenderer.java
index 657167b257..4419cdf0b6 100644
--- 
a/framework/widget/src/main/java/org/apache/ofbiz/widget/renderer/macro/MacroScreenRenderer.java
+++ 
b/framework/widget/src/main/java/org/apache/ofbiz/widget/renderer/macro/MacroScreenRenderer.java
@@ -42,6 +42,7 @@ import org.apache.ofbiz.base.util.UtilMisc;
 import org.apache.ofbiz.base.util.UtilProperties;
 import org.apache.ofbiz.base.util.UtilRandom;
 import org.apache.ofbiz.base.util.UtilValidate;
+import org.apache.ofbiz.base.util.collections.MapStack;
 import org.apache.ofbiz.base.util.template.FreeMarkerWorker;
 import org.apache.ofbiz.entity.Delegator;
 import org.apache.ofbiz.entity.GenericValue;
@@ -709,6 +710,15 @@ public class MacroScreenRenderer implements 
ScreenStringRenderer {
         parameters.put("showMore", showMore);
         parameters.put("collapsed", collapsed);
         parameters.put("javaScriptEnabled", javaScriptEnabled);
+        String screenHeader = screenlet.getScreenHeader(context);
+        if (UtilValidate.isNotEmpty(screenHeader)) {
+            try {
+                StringWriter localWriter = new StringWriter();
+                ScreenRenderer screenRenderer = new 
ScreenRenderer(localWriter, MapStack.create(context), this);
+                screenRenderer.render(screenHeader);
+                parameters.put("screenHeader", 
localWriter.getBuffer().toString());
+            } catch (GeneralException | ParserConfigurationException | 
SAXException ignored) { }
+        }
         executeMacro(writer, "renderScreenletBegin", parameters);
     }
 
diff --git a/themes/common-theme/template/macro/CsvScreenMacroLibrary.ftl 
b/themes/common-theme/template/macro/CsvScreenMacroLibrary.ftl
index 2d184642b5..74499487da 100644
--- a/themes/common-theme/template/macro/CsvScreenMacroLibrary.ftl
+++ b/themes/common-theme/template/macro/CsvScreenMacroLibrary.ftl
@@ -48,7 +48,7 @@ under the License.
 <#macro renderImage src id style wid hgt border alt urlString></#macro>
 
 <#macro renderContentFrame fullUrl width height border></#macro>
-<#macro renderScreenletBegin id title collapsible saveCollapsed 
collapsibleAreaId expandToolTip collapseToolTip fullUrlString padded menuString 
showMore collapsed javaScriptEnabled></#macro>
+<#macro renderScreenletBegin id title collapsible saveCollapsed 
collapsibleAreaId expandToolTip collapseToolTip fullUrlString padded menuString 
showMore collapsed javaScriptEnabled title="" screenHeader=""></#macro>
 <#macro renderScreenletSubWidget></#macro>
 <#macro renderScreenletEnd></#macro>
 
diff --git a/themes/common-theme/template/macro/FoScreenMacroLibrary.ftl 
b/themes/common-theme/template/macro/FoScreenMacroLibrary.ftl
index d8c5cc9649..261a66c072 100644
--- a/themes/common-theme/template/macro/FoScreenMacroLibrary.ftl
+++ b/themes/common-theme/template/macro/FoScreenMacroLibrary.ftl
@@ -72,7 +72,7 @@ under the License.
 <#macro renderImage src id style wid hgt border alt 
urlString><fo:block><fo:external-graphic id="${id}" src="${src}" 
content-width="${wid}" content-height="${hgt}" 
scaling="non-uniform"/></fo:block></#macro>
 
 <#macro renderContentFrame></#macro>
-<#macro renderScreenletBegin id title collapsible saveCollapsed 
collapsibleAreaId expandToolTip collapseToolTip fullUrlString padded menuString 
showMore collapsed javaScriptEnabled></#macro>
+<#macro renderScreenletBegin id title collapsible saveCollapsed 
collapsibleAreaId expandToolTip collapseToolTip fullUrlString padded menuString 
showMore collapsed javaScriptEnabled title="" screenHeader=""></#macro>
 <#macro renderScreenletSubWidget></#macro>
 <#macro renderScreenletEnd></#macro>
 
diff --git a/themes/common-theme/template/macro/HtmlScreenMacroLibrary.ftl 
b/themes/common-theme/template/macro/HtmlScreenMacroLibrary.ftl
index 5062b74bab..6f10a05cb7 100644
--- a/themes/common-theme/template/macro/HtmlScreenMacroLibrary.ftl
+++ b/themes/common-theme/template/macro/HtmlScreenMacroLibrary.ftl
@@ -139,10 +139,11 @@ under the License.
 </#macro>
 
 <#macro renderContentFrame fullUrl width height border=""><iframe 
src="${fullUrl}" width="${width}" height="${height}" <#if 
border?has_content>border="${border}"</#if> /></#macro>
-<#macro renderScreenletBegin collapsible saveCollapsed collapsibleAreaId 
expandToolTip collapseToolTip fullUrlString padded menuString showMore 
collapsed javaScriptEnabled id="" title="">
+<#macro renderScreenletBegin collapsible saveCollapsed collapsibleAreaId 
expandToolTip collapseToolTip fullUrlString padded menuString showMore 
collapsed javaScriptEnabled id="" title="" screenHeader="">
 <div class="screenlet"<#if id?has_content> id="${id}"</#if>><#rt/>
 <#if showMore>
 <div class="screenlet-title-bar"><ul><#if title?has_content><li 
class="h3">${title}</li></#if>
+<#if screenHeader?has_content><li><div 
class="screenlet-header">${screenHeader}</div></li></#if>
 <#if collapsible>
 <li class="<#rt/>
 <#if collapsed>
diff --git a/themes/common-theme/template/macro/TextScreenMacroLibrary.ftl 
b/themes/common-theme/template/macro/TextScreenMacroLibrary.ftl
index f2c885487f..95c514108a 100644
--- a/themes/common-theme/template/macro/TextScreenMacroLibrary.ftl
+++ b/themes/common-theme/template/macro/TextScreenMacroLibrary.ftl
@@ -50,7 +50,7 @@ under the License.
 <#macro renderImage src id style wid hgt border alt urlString></#macro>
 
 <#macro renderContentFrame fullUrl width height border></#macro>
-<#macro renderScreenletBegin id title collapsible saveCollapsed 
collapsibleAreaId expandToolTip collapseToolTip fullUrlString padded menuString 
showMore collapsed javaScriptEnabled></#macro>
+<#macro renderScreenletBegin id title collapsible saveCollapsed 
collapsibleAreaId expandToolTip collapseToolTip fullUrlString padded menuString 
showMore collapsed javaScriptEnabled title="" screenHeader=""></#macro>
 <#macro renderScreenletSubWidget></#macro>
 <#macro renderScreenletEnd></#macro>
 
diff --git a/themes/common-theme/template/macro/XlsScreenMacroLibrary.ftl 
b/themes/common-theme/template/macro/XlsScreenMacroLibrary.ftl
index bc561590c7..fbead56157 100644
--- a/themes/common-theme/template/macro/XlsScreenMacroLibrary.ftl
+++ b/themes/common-theme/template/macro/XlsScreenMacroLibrary.ftl
@@ -44,7 +44,7 @@ under the License.
 <#macro renderImage src id style wid hgt border alt urlString></#macro>
 
 <#macro renderContentFrame fullUrl width height border></#macro>
-<#macro renderScreenletBegin id title collapsible saveCollapsed 
collapsibleAreaId expandToolTip collapseToolTip fullUrlString padded menuString 
showMore collapsed javaScriptEnabled></#macro>
+<#macro renderScreenletBegin id title collapsible saveCollapsed 
collapsibleAreaId expandToolTip collapseToolTip fullUrlString padded menuString 
showMore collapsed javaScriptEnabled title="" screenHeader=""></#macro>
 <#macro renderScreenletSubWidget></#macro>
 <#macro renderScreenletEnd></#macro>
 
diff --git a/themes/common-theme/template/macro/XmlScreenMacroLibrary.ftl 
b/themes/common-theme/template/macro/XmlScreenMacroLibrary.ftl
index 725c2c828a..cbd90c740a 100644
--- a/themes/common-theme/template/macro/XmlScreenMacroLibrary.ftl
+++ b/themes/common-theme/template/macro/XmlScreenMacroLibrary.ftl
@@ -58,7 +58,7 @@ under the License.
 </#macro>
 
 <#macro renderContentFrame fullUrl width height border></#macro>
-<#macro renderScreenletBegin id title collapsible saveCollapsed 
collapsibleAreaId expandToolTip collapseToolTip fullUrlString padded menuString 
showMore collapsed javaScriptEnabled>
+<#macro renderScreenletBegin id title collapsible saveCollapsed 
collapsibleAreaId expandToolTip collapseToolTip fullUrlString padded menuString 
showMore collapsed javaScriptEnabled title="" screenHeader="">
 </#macro>
 <#macro renderScreenletSubWidget></#macro>
 <#macro renderScreenletEnd></#macro>

Reply via email to