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 fdddf90e13 Improved: Set uniqueItemName as unique on ScreenWidget
(OFBIZ-13315)
fdddf90e13 is described below
commit fdddf90e13ecde42d5fd64c08fa829c0002e8155
Author: Nicolas Malin <[email protected]>
AuthorDate: Tue Dec 2 10:44:39 2025 +0100
Improved: Set uniqueItemName as unique on ScreenWidget (OFBIZ-13315)
When you use a menu item with an iterate-section, the widget engine failed
to set a correct unique id
Example :
*****
<ws:screen name="ListElement">
<ws:section>
<ws:iterate-section entry="element" list="elements">
<ws:section>
<ws:widgets>
<ws:include-grid name="ListElementFrom" .../>
<ws:include-grid name="ListElementTo" .../>
</ws:widgets>
</ws:section>
</ws:iterate-section>
</ws:section>
</[code]ws:screen>
<wf:grid name="ListElementFrom" > ....
<wf:field name="menuAction" title=" ">
<wf:include-menu name="ListElementInLineBar"/>
</wf:field>
</wf:grid>
<wf:grid name="ListElementTro" >...
<wf:field name="menuAction" title=" ">
<wf:include-menu name="ListElementInLineBar"/>
</wf:field>
</wf:grid>
<wm:menu name="ListElementInLineBar" >
<wm:menu-item name="delete">
<wm:link target="Element/delete">...</wm:link>
</wm:menu-item>
</wm:menu>
****
When you click on delete link, you have twice the submission, each menu
present because the menu id is the same.
The reason come from the process to build a unique name use on the js
script to submit.
MacroMenuRenderer.java:223 where we concat the menu name, menu item name
and different index present in context ('menuUniqueItemIndex', 'itemIndex' and
'parentItemIndex'). It's possible if we manage different index on this screen
to escape this issue, but after ready and taking a step back, this will be
increase the screen complexity for nothing link to this problematic.
We simplify it to generate each time a real unique name that we can prefix
and if we need to spot an element from a custom js script I suggest to use
index instead name and a unique name to build correctly through multiple
context index.
Follow this way, we introduce a new class UtilRandom to centralize methods
to manage a unique id/name and propagate this logic on all unique item name
using on the screen widget engine.
---
.../org/apache/ofbiz/base/util/UtilRandom.java | 46 ++++++++++++++++++++++
.../widget/renderer/html/HtmlMenuRenderer.java | 6 +--
.../widget/renderer/macro/MacroFormRenderer.java | 4 +-
.../widget/renderer/macro/MacroMenuRenderer.java | 21 +++-------
.../widget/renderer/macro/MacroScreenRenderer.java | 5 +--
.../macro/RenderableFtlFormElementsBuilder.java | 4 +-
6 files changed, 59 insertions(+), 27 deletions(-)
diff --git
a/framework/base/src/main/java/org/apache/ofbiz/base/util/UtilRandom.java
b/framework/base/src/main/java/org/apache/ofbiz/base/util/UtilRandom.java
new file mode 100644
index 0000000000..95224913ce
--- /dev/null
+++ b/framework/base/src/main/java/org/apache/ofbiz/base/util/UtilRandom.java
@@ -0,0 +1,46 @@
+/*******************************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+
*******************************************************************************/
+
+package org.apache.ofbiz.base.util;
+
+import java.util.UUID;
+
+public final class UtilRandom {
+
+ private static final String MODULE = UtilRandom.class.getName();
+
+ public static String getUnique(String prefix, boolean onlyWord) {
+ String unique = getId(onlyWord);
+ return prefix != null
+ ? prefix + unique
+ : unique;
+ }
+
+ public static String getId(boolean onlyWord) {
+ String id = String.valueOf(UUID.randomUUID());
+ if (onlyWord) {
+ id = id.replaceAll("\\W", "");
+ }
+ return id;
+ }
+
+ public static String getId() {
+ return getId(true);
+ }
+}
diff --git
a/framework/widget/src/main/java/org/apache/ofbiz/widget/renderer/html/HtmlMenuRenderer.java
b/framework/widget/src/main/java/org/apache/ofbiz/widget/renderer/html/HtmlMenuRenderer.java
index 81065265f5..5e2ece4684 100644
---
a/framework/widget/src/main/java/org/apache/ofbiz/widget/renderer/html/HtmlMenuRenderer.java
+++
b/framework/widget/src/main/java/org/apache/ofbiz/widget/renderer/html/HtmlMenuRenderer.java
@@ -19,7 +19,6 @@
package org.apache.ofbiz.widget.renderer.html;
import java.io.IOException;
-import java.math.BigDecimal;
import java.net.URI;
import java.util.List;
import java.util.Map;
@@ -31,7 +30,7 @@ import jakarta.servlet.http.HttpSession;
import org.apache.ofbiz.base.util.StringUtil;
import org.apache.ofbiz.base.util.UtilCodec;
-import org.apache.ofbiz.base.util.UtilMisc;
+import org.apache.ofbiz.base.util.UtilRandom;
import org.apache.ofbiz.base.util.UtilValidate;
import org.apache.ofbiz.entity.GenericValue;
import org.apache.ofbiz.webapp.control.RequestHandler;
@@ -424,8 +423,7 @@ public class HtmlMenuRenderer extends HtmlWidgetRenderer
implements MenuStringRe
HttpServletRequest request = (HttpServletRequest)
context.get("request");
String targetWindow = link.getTargetWindow(context);
- String uniqueItemName = menuItem.getModelMenu().getName() + "_" +
menuItem.getName() + "_LF_"
- + UtilMisc.<String>addToBigDecimalInMap(context,
"menuUniqueItemIndex", BigDecimal.ONE);
+ String uniqueItemName =
UtilRandom.getUnique(menuItem.getModelMenu().getName() + "_" +
menuItem.getName() + "_", true);
String linkType =
WidgetWorker.determineAutoLinkType(link.getLinkType(), target,
link.getUrlMode(), request);
boolean isHiddenForm = "hidden-form".equals(linkType);
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 a99a01b8c9..1f8dd195d2 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
@@ -30,7 +30,6 @@ import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Set;
-import java.util.UUID;
import java.util.stream.Collectors;
import jakarta.servlet.http.HttpServletRequest;
@@ -45,6 +44,7 @@ import org.apache.ofbiz.base.util.UtilGenerics;
import org.apache.ofbiz.base.util.UtilHttp;
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.string.FlexibleStringExpander;
import org.apache.ofbiz.entity.Delegator;
@@ -2274,7 +2274,7 @@ public final class MacroFormRenderer implements
FormStringRenderer {
}
} else {
if ("layered-modal".equals(realLinkType)) {
- String uniqueItemName =
"Modal_".concat(UUID.randomUUID().toString().replace("-", "_"));
+ String uniqueItemName = UtilRandom.getUnique("Modal_", true);
String width = (String) this.request.getAttribute("width");
if (UtilValidate.isEmpty(width)) {
width =
String.valueOf(modelTheme.getLinkDefaultLayeredModalWidth());
diff --git
a/framework/widget/src/main/java/org/apache/ofbiz/widget/renderer/macro/MacroMenuRenderer.java
b/framework/widget/src/main/java/org/apache/ofbiz/widget/renderer/macro/MacroMenuRenderer.java
index 21afc6f0d5..13148312f6 100644
---
a/framework/widget/src/main/java/org/apache/ofbiz/widget/renderer/macro/MacroMenuRenderer.java
+++
b/framework/widget/src/main/java/org/apache/ofbiz/widget/renderer/macro/MacroMenuRenderer.java
@@ -22,7 +22,6 @@ import java.io.IOException;
import java.io.Reader;
import java.io.StringReader;
import java.io.StringWriter;
-import java.math.BigDecimal;
import java.net.URI;
import java.util.HashMap;
import java.util.List;
@@ -36,6 +35,7 @@ import org.apache.ofbiz.base.util.StringUtil;
import org.apache.ofbiz.base.util.UtilCodec;
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.string.FlexibleStringExpander;
import org.apache.ofbiz.base.util.template.FreeMarkerWorker;
@@ -220,20 +220,9 @@ public class MacroMenuRenderer implements
MenuStringRenderer {
String linkWidth = link.getWidth();
if (UtilValidate.isNotEmpty(linkWidth)) parameters.put("width",
linkWidth);
- StringBuffer uniqueItemName = new
StringBuffer(menuItem.getModelMenu().getName());
-
uniqueItemName.append("_").append(menuItem.getName()).append("_LF_").append(UtilMisc.<String>addToBigDecimalInMap(context,
- "menuUniqueItemIndex", BigDecimal.ONE));
- if (menuItem.getModelMenu().getExtraIndex(context) != null) {
-
uniqueItemName.append("_").append(menuItem.getModelMenu().getExtraIndex(context));
- }
- if (context.containsKey("itemIndex")) {
- if (context.containsKey("parentItemIndex")) {
-
uniqueItemName.append(context.get("parentItemIndex")).append("_").append(context.get("itemIndex"));
- } else {
- uniqueItemName.append("_").append(context.get("itemIndex"));
- }
- }
- parameters.put("uniqueItemName", uniqueItemName.toString());
+ String uniqueItemName =
UtilRandom.getUnique(menuItem.getModelMenu().getName()
+ + "_" + menuItem.getName() + "_", true);
+ parameters.put("uniqueItemName", uniqueItemName);
String linkType = "";
if (UtilValidate.isNotEmpty(target)) {
@@ -279,7 +268,7 @@ public class MacroMenuRenderer implements
MenuStringRenderer {
targetParameters.append("]");
}
- if (targetParameters.length() == 0) {
+ if (targetParameters.isEmpty()) {
targetParameters.append("\"\"");
}
parameters.put("linkUrl",
MacroCommonRenderer.getLinkUrl(link.getLink(), linkType, context));
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 a5893639f3..5e31eb4ede 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
@@ -22,7 +22,6 @@ import java.io.IOException;
import java.io.Reader;
import java.io.StringReader;
import java.io.StringWriter;
-import java.math.BigDecimal;
import java.net.URI;
import java.util.HashMap;
import java.util.HashSet;
@@ -41,6 +40,7 @@ import org.apache.ofbiz.base.util.UtilGenerics;
import org.apache.ofbiz.base.util.UtilHttp;
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.template.FreeMarkerWorker;
import org.apache.ofbiz.entity.Delegator;
@@ -271,8 +271,7 @@ public class MacroScreenRenderer implements
ScreenStringRenderer {
String targetWindow = link.getTargetWindow(context);
String target = link.getTarget(context);
- String uniqueItemName = link.getModelScreen().getName() + "_LF_"
- + UtilMisc.<String>addToBigDecimalInMap(context,
"screenUniqueItemIndex", BigDecimal.ONE);
+ String uniqueItemName =
UtilRandom.getUnique(link.getModelScreen().getName() + "_", true);
String linkType =
WidgetWorker.determineAutoLinkType(link.getLinkType(), target,
link.getUrlMode(), request);
String actionUrl = "";
diff --git
a/framework/widget/src/main/java/org/apache/ofbiz/widget/renderer/macro/RenderableFtlFormElementsBuilder.java
b/framework/widget/src/main/java/org/apache/ofbiz/widget/renderer/macro/RenderableFtlFormElementsBuilder.java
index e53f28e348..da21a42152 100644
---
a/framework/widget/src/main/java/org/apache/ofbiz/widget/renderer/macro/RenderableFtlFormElementsBuilder.java
+++
b/framework/widget/src/main/java/org/apache/ofbiz/widget/renderer/macro/RenderableFtlFormElementsBuilder.java
@@ -30,7 +30,6 @@ import java.util.Map;
import java.util.Objects;
import java.util.Optional;
import java.util.Set;
-import java.util.UUID;
import java.util.function.Function;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
@@ -48,6 +47,7 @@ import org.apache.ofbiz.base.util.UtilGenerics;
import org.apache.ofbiz.base.util.UtilHttp;
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.string.FlexibleStringExpander;
import org.apache.ofbiz.webapp.control.RequestHandler;
@@ -848,7 +848,7 @@ public final class RenderableFtlFormElementsBuilder {
} else {
if ("layered-modal".equals(realLinkType)) {
- String uniqueItemName =
"Modal_".concat(UUID.randomUUID().toString().replace("-", "_"));
+ String uniqueItemName = UtilRandom.getUnique("Modal_", true);
String width = (String) request.getAttribute("width");
if (UtilValidate.isEmpty(width)) {
width =
String.valueOf(modelTheme.getLinkDefaultLayeredModalWidth());