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 41dd06b72f Fixed: MenuItem doesn't follow correctly extended informations (OFBIZ-12628) 41dd06b72f is described below commit 41dd06b72f3b1606862b9e42fc8ec70d34b1ad06 Author: Nicolas Malin <nicolas.ma...@nereide.fr> AuthorDate: Fri Jun 17 11:19:22 2022 +0200 Fixed: MenuItem doesn't follow correctly extended informations (OFBIZ-12628) When you use two menus where the second extend the first, menu items and menu links aren't correctly propagated. The menu items and menu links presents on the second menu already have the first menu on their model. **** <menu name="FirstMenu" extends="CommonInlineBarMenu" extends-resource="component://common/widget/CommonMenus.xml"> <menu-item name="MyItem"> <link target="GoAction"/> </menu-item> </menu> <menu name="SecondMenu" extends="FirstMenu"/> **** The result, if during the rendering some information are generated from the menu, in the previous case, it's always the "FirstMenu" that would be use. Like when your menu generate a hidden-form, the SecondMenu link the bad form **** <form method="post" action="GoAction" onsubmit="javascript:submitFormDisableSubmits(this)" name="SecondMenu">...</form> <a href="javascript:ajaxSubmitFormUpdateAreas('FirstMenu', 'xxx')">MyItem</a> **** To solve it and don't break the thread safe pattern, I introduce two new constructor for ModelItem and MenuLink for duplicate the ModelMenuItem and MenuLink in memory with the new parent. With this, the SecondMenu iw now completely duplicated on memory and now share any reference with the extended menu. Thanks to Marco Rodrigues that detect this problem --- .../org/apache/ofbiz/widget/model/ModelMenu.java | 7 ++- .../apache/ofbiz/widget/model/ModelMenuItem.java | 52 ++++++++++++++++++---- 2 files changed, 48 insertions(+), 11 deletions(-) diff --git a/framework/widget/src/main/java/org/apache/ofbiz/widget/model/ModelMenu.java b/framework/widget/src/main/java/org/apache/ofbiz/widget/model/ModelMenu.java index bf919a5a8e..60a424f241 100644 --- a/framework/widget/src/main/java/org/apache/ofbiz/widget/model/ModelMenu.java +++ b/framework/widget/src/main/java/org/apache/ofbiz/widget/model/ModelMenu.java @@ -170,8 +170,11 @@ public class ModelMenu extends ModelWidget { defaultWidgetStyle = parent.defaultWidgetStyle; defaultTooltipStyle = parent.defaultTooltipStyle; defaultMenuItemName = parent.defaultMenuItemName; - menuItemList.addAll(parent.menuItemList); - menuItemMap.putAll(parent.menuItemMap); + for (ModelMenuItem originModelMenuItem: parent.menuItemList) { + ModelMenuItem modelMenuItem = new ModelMenuItem(originModelMenuItem, this, null); + menuItemList.add(modelMenuItem); + menuItemMap.put(modelMenuItem.getName(), modelMenuItem); + } defaultPermissionOperation = parent.defaultPermissionOperation; defaultPermissionEntityAction = parent.defaultPermissionEntityAction; defaultAssociatedContentId = parent.defaultAssociatedContentId; diff --git a/framework/widget/src/main/java/org/apache/ofbiz/widget/model/ModelMenuItem.java b/framework/widget/src/main/java/org/apache/ofbiz/widget/model/ModelMenuItem.java index 5898bcbfbc..5c54bb3225 100644 --- a/framework/widget/src/main/java/org/apache/ofbiz/widget/model/ModelMenuItem.java +++ b/framework/widget/src/main/java/org/apache/ofbiz/widget/model/ModelMenuItem.java @@ -22,6 +22,7 @@ import java.io.IOException; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; +import java.util.LinkedList; import java.util.List; import java.util.Locale; import java.util.Map; @@ -106,15 +107,9 @@ public class ModelMenuItem extends ModelWidget { this.tooltipStyle = menuItemElement.getAttribute("tooltip-style"); this.selectedStyle = menuItemElement.getAttribute("selected-style"); String hideIfSelected = menuItemElement.getAttribute("hide-if-selected"); - if (!hideIfSelected.isEmpty()) { - if ("true".equalsIgnoreCase(hideIfSelected)) { - this.hideIfSelected = Boolean.TRUE; - } else { - this.hideIfSelected = Boolean.FALSE; - } - } else { - this.hideIfSelected = null; - } + this.hideIfSelected = !hideIfSelected.isEmpty() + ? "true".equalsIgnoreCase(hideIfSelected) + : null; this.disableIfEmpty = menuItemElement.getAttribute("disable-if-empty"); this.align = menuItemElement.getAttribute("align"); this.alignStyle = menuItemElement.getAttribute("align-style"); @@ -171,6 +166,40 @@ public class ModelMenuItem extends ModelWidget { this.overrideName = ""; } + public ModelMenuItem(ModelMenuItem originMenuItem, ModelMenu modelMenu, ModelMenuItem parentMenuItem) { + super(modelMenu.getName() + originMenuItem.getName()); + this.modelMenu = modelMenu; + this.parentMenuItem = parentMenuItem; + this.entityName = originMenuItem.entityName; + this.title = originMenuItem.title; + this.tooltip = originMenuItem.tooltip; + this.parentPortalPageId = originMenuItem.parentPortalPageId; + this.titleStyle = originMenuItem.titleStyle; + this.disabledTitleStyle = originMenuItem.disabledTitleStyle; + this.widgetStyle = originMenuItem.widgetStyle; + this.tooltipStyle = originMenuItem.tooltipStyle; + this.selectedStyle = originMenuItem.selectedStyle; + this.hideIfSelected = originMenuItem.hideIfSelected; + this.disableIfEmpty = originMenuItem.disableIfEmpty; + this.align = originMenuItem.align; + this.alignStyle = originMenuItem.alignStyle; + this.position = originMenuItem.position; + this.associatedContentId = originMenuItem.associatedContentId; + this.cellWidth = originMenuItem.cellWidth; + this.subMenu = originMenuItem.subMenu; + this.link = new MenuLink(originMenuItem.link, this); + List<ModelMenuItem> menuItems = new LinkedList<>(); + originMenuItem.menuItemList.forEach(item -> { + menuItems.add(new ModelMenuItem(item, modelMenu, this)); + }); + this.menuItemList = menuItems.isEmpty() + ? Collections.emptyList() + : Collections.unmodifiableList(menuItems); + this.condition = originMenuItem.condition; + this.actions = originMenuItem.actions; + this.overrideName = originMenuItem.overrideName; + } + // Portal constructor private ModelMenuItem(GenericValue portalPage, ModelMenuItem parentMenuItem, Locale locale) { super(portalPage.getString("portalPageId")); @@ -660,6 +689,11 @@ public class ModelMenuItem extends ModelWidget { this.link = new Link(linkElement); } + public MenuLink(MenuLink originLink, ModelMenuItem parentMenuItem) { + this.linkMenuItem = parentMenuItem; + this.link = originLink.link; + } + public MenuLink(GenericValue portalPage, ModelMenuItem parentMenuItem, Locale locale) { this.linkMenuItem = parentMenuItem; List<Parameter> parameterList = new ArrayList<>();