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>