From 894ceb8c4fe3f04794fd7a1f720a434570abb324 Mon Sep 17 00:00:00 2001 From: hengsin Date: Sat, 5 Dec 2020 00:52:10 +0800 Subject: [PATCH] IDEMPIERE-4101 [Chosenbox] Multi select don't work in Firefox (#435) - add display of button - fix dropdown doesn't render properly at Firefox --- .../WEB-INF/src/metainfo/zk/lang-addon.xml | 1 + .../webui/component/ChosenSearchBox.java | 15 ++- .../webui/editor/WChosenboxListEditor.java | 102 +++++++++++++----- .../WEB-INF/src/web/js/chosenbox/Chosenbox.js | 1 + 4 files changed, 92 insertions(+), 27 deletions(-) diff --git a/org.adempiere.ui.zk/WEB-INF/src/metainfo/zk/lang-addon.xml b/org.adempiere.ui.zk/WEB-INF/src/metainfo/zk/lang-addon.xml index 5f52899552..9c713ce04b 100644 --- a/org.adempiere.ui.zk/WEB-INF/src/metainfo/zk/lang-addon.xml +++ b/org.adempiere.ui.zk/WEB-INF/src/metainfo/zk/lang-addon.xml @@ -51,6 +51,7 @@ Copyright (C) 2007 Ashley G Ramdass (ADempiere WebUI). + diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/component/ChosenSearchBox.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/component/ChosenSearchBox.java index e07a351337..7aec96e96c 100644 --- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/component/ChosenSearchBox.java +++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/component/ChosenSearchBox.java @@ -38,6 +38,18 @@ public class ChosenSearchBox extends Div { protected Chosenbox chosenbox; protected Button btn; + /** + * + * @param chosenbox custom implementation of Chosenbox + */ + public ChosenSearchBox(Chosenbox chosenbox) { + this.chosenbox = chosenbox; + initComponents(); + } + + /** + * default constructor + */ public ChosenSearchBox() { initComponents(); } @@ -50,7 +62,8 @@ public class ChosenSearchBox extends Div { } private void initComponents() { - chosenbox = new Chosenbox<>(); + if (chosenbox == null) + chosenbox = new Chosenbox<>(); chosenbox.setSclass("editor-input"); chosenbox.setWidth("100%"); appendChild(chosenbox); diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/editor/WChosenboxListEditor.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/editor/WChosenboxListEditor.java index 74ddadbef7..78a1c5c25d 100644 --- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/editor/WChosenboxListEditor.java +++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/editor/WChosenboxListEditor.java @@ -21,9 +21,11 @@ import java.util.Properties; import java.util.Set; import org.adempiere.webui.ValuePreference; +import org.adempiere.webui.component.ChosenSearchBox; import org.adempiere.webui.event.ContextMenuEvent; import org.adempiere.webui.event.ContextMenuListener; import org.adempiere.webui.event.ValueChangeEvent; +import org.adempiere.webui.theme.ThemeManager; import org.adempiere.webui.window.WFieldRecordInfo; import org.compiere.model.GridField; import org.compiere.model.Lookup; @@ -59,7 +61,7 @@ public class WChosenboxListEditor extends WEditor implements ContextMenuListener static { - logger = CLogger.getCLogger(WTableDirEditor.class); + logger = CLogger.getCLogger(WChosenboxListEditor.class); } private Lookup lookup; @@ -88,7 +90,7 @@ public class WChosenboxListEditor extends WEditor implements ContextMenuListener */ public WChosenboxListEditor(GridField gridField, boolean tableEditor, IEditorConfiguration editorConfiguration) { - this(new ChosenboxEditor(), gridField, tableEditor, editorConfiguration); + this(new ChosenSearchBox(new ChosenboxEditor()), gridField, tableEditor, editorConfiguration); } private WChosenboxListEditor(Component comp, GridField gridField, boolean tableEditor, IEditorConfiguration editorConfiguration) @@ -113,9 +115,19 @@ public class WChosenboxListEditor extends WEditor implements ContextMenuListener this(lookup, label, description, mandatory, readonly, updateable, false); } + /** + * + * @param lookup + * @param label + * @param description + * @param mandatory + * @param readonly + * @param updateable + * @param autocomplete + */ public WChosenboxListEditor(Lookup lookup, String label, String description, boolean mandatory, boolean readonly, boolean updateable, boolean autocomplete) { - this(new ChosenboxEditor(), lookup, label, description, mandatory, readonly, updateable); + this(new ChosenSearchBox(new ChosenboxEditor()), lookup, label, description, mandatory, readonly, updateable); } private WChosenboxListEditor(Component comp, Lookup lookup, String label, String description, boolean mandatory, boolean readonly, boolean updateable) @@ -145,9 +157,18 @@ public class WChosenboxListEditor extends WEditor implements ContextMenuListener this(columnName, mandatory, isReadOnly, isUpdateable, lookup, false); } + /** + * + * @param columnName + * @param mandatory + * @param isReadOnly + * @param isUpdateable + * @param lookup + * @param autocomplete + */ public WChosenboxListEditor(String columnName, boolean mandatory, boolean isReadOnly, boolean isUpdateable, Lookup lookup, boolean autocomplete) { - this(new ChosenboxEditor(), columnName, mandatory, isReadOnly, isUpdateable, lookup); + this(new ChosenSearchBox(new ChosenboxEditor()), columnName, mandatory, isReadOnly, isUpdateable, lookup); } private WChosenboxListEditor(Component comp, String columnName, boolean mandatory, boolean isReadOnly, boolean isUpdateable, Lookup lookup) @@ -164,9 +185,27 @@ public class WChosenboxListEditor extends WEditor implements ContextMenuListener private void init() { getComponent().setHflex("true"); - getComponent().editor = this; - getComponent().setModel(model); + ((ChosenboxEditor)getComponent().getChosenbox()).editor = this; + getComponent().getChosenbox().setModel(model); + String imageUrl; + if (ThemeManager.isUseFontIconForImage()) + imageUrl = "z-icon-More"; + else + imageUrl = ThemeManager.getThemeResource("images/ShowMore16.png"); + if (ThemeManager.isUseFontIconForImage()) + getComponent().getButton().setIconSclass(imageUrl); + else + getComponent().getButton().setImage(imageUrl); + getComponent().getButton().addEventListener(Events.ON_CLICK, e -> { + if (getComponent().isEnabled()) { + if (!getComponent().getChosenbox().isOpen()) { + getComponent().getChosenbox().setOpen(true); + getComponent().getChosenbox().focus(); + } + } + }); + if (lookup != null) { lookup.setMandatory(true); @@ -189,6 +228,9 @@ public class WChosenboxListEditor extends WEditor implements ContextMenuListener } } + /** + * refresh lookup list + */ protected void refreshLookup() { lookup.refresh(); updateModel(); @@ -198,7 +240,7 @@ public class WChosenboxListEditor extends WEditor implements ContextMenuListener public String getDisplay() { StringBuilder display = new StringBuilder(); - LinkedHashSet selected = getComponent().getSelectedObjects(); + LinkedHashSet selected = getComponent().getChosenbox().getSelectedObjects(); if (selected != null && selected.size() > 0) { for(ValueNamePair pair : selected) @@ -220,7 +262,7 @@ public class WChosenboxListEditor extends WEditor implements ContextMenuListener private String getValueFromComponent() { StringBuilder retVal = new StringBuilder(); - LinkedHashSet selected = getComponent().getSelectedObjects(); + LinkedHashSet selected = getComponent().getChosenbox().getSelectedObjects(); if (selected != null && selected.size() > 0) { for(ValueNamePair pair : selected) @@ -239,6 +281,9 @@ public class WChosenboxListEditor extends WEditor implements ContextMenuListener return retVal.length() > 0 ? retVal.toString() : null; } + /** + * @param value + */ public void setValue(Object value) { if (onselecting) { @@ -259,8 +304,8 @@ public class WChosenboxListEditor extends WEditor implements ContextMenuListener selected.add(pair); } } - getComponent().setSelectedObjects(selected); - if (getComponent().getSelectedObjects().size() != selected.size()) + getComponent().getChosenbox().setSelectedObjects(selected); + if (getComponent().getChosenbox().getSelectedObjects().size() != selected.size()) { Object curValue = oldValue; oldValue = value; @@ -273,12 +318,12 @@ public class WChosenboxListEditor extends WEditor implements ContextMenuListener { updateModel(); } - getComponent().setSelectedObjects(selected); + getComponent().getChosenbox().setSelectedObjects(selected); //still not in list, reset to zero - if (getComponent().getSelectedObjects().size() != selected.size()) + if (getComponent().getChosenbox().getSelectedObjects().size() != selected.size()) { - getComponent().setSelectedObjects(new LinkedHashSet()); + getComponent().getChosenbox().setSelectedObjects(new LinkedHashSet()); if (curValue == null) curValue = value; ValueChangeEvent changeEvent = new ValueChangeEvent(this, this.getColumnName(), curValue, null); @@ -293,14 +338,14 @@ public class WChosenboxListEditor extends WEditor implements ContextMenuListener } else { - getComponent().setSelectedObjects(new LinkedHashSet()); + getComponent().getChosenbox().setSelectedObjects(new LinkedHashSet()); oldValue = value; } } @Override - public ChosenboxEditor getComponent() { - return (ChosenboxEditor) component; + public ChosenSearchBox getComponent() { + return (ChosenSearchBox) component; } @Override @@ -364,6 +409,9 @@ public class WChosenboxListEditor extends WEditor implements ContextMenuListener model.addAll(list); } + /** + * @param event + */ public void onEvent(Event event) { if (Events.ON_SELECT.equalsIgnoreCase(event.getName())) @@ -394,12 +442,16 @@ public class WChosenboxListEditor extends WEditor implements ContextMenuListener || ((oldValue != null && newValue != null) && !oldValue.equals(newValue)); } + @Override public String[] getEvents() { return LISTENER_EVENTS; } - public void actionRefresh() + /** + * action for requery menu + */ + protected void actionRefresh() { if (lookup != null) { @@ -416,11 +468,16 @@ public class WChosenboxListEditor extends WEditor implements ContextMenuListener } } + /** + * + * @return {@link Lookup} + */ public Lookup getLookup() { return lookup; } + @Override public void onMenu(ContextMenuEvent evt) { if (WEditorPopupMenu.REQUERY_EVENT.equals(evt.getContextEvent())) @@ -439,6 +496,7 @@ public class WChosenboxListEditor extends WEditor implements ContextMenuListener } } + @Override public void propertyChange(PropertyChangeEvent evt) { if ("FieldValue".equals(evt.getPropertyName())) @@ -455,7 +513,7 @@ public class WChosenboxListEditor extends WEditor implements ContextMenuListener ((MLookup) lookup).getLookupInfo().ctx = ctx; } if ((lookup != null) && (!lookup.isValidated() || !lookup.isLoaded() - || (isReadWrite() && lookup.getSize() != getComponent().getModel().getSize()))) + || (isReadWrite() && lookup.getSize() != getComponent().getChosenbox().getModel().getSize()))) this.actionRefresh(); super.dynamicDisplay(ctx); @@ -484,14 +542,6 @@ public class WChosenboxListEditor extends WEditor implements ContextMenuListener protected ChosenboxEditor() { } - public void setEnabled(boolean readWrite) { - setDisabled(readWrite==false); - } - - public boolean isEnabled() { - return isDisabled() == false; - } - @Override public void setPage(Page page) { super.setPage(page); diff --git a/org.adempiere.ui.zk/WEB-INF/src/web/js/chosenbox/Chosenbox.js b/org.adempiere.ui.zk/WEB-INF/src/web/js/chosenbox/Chosenbox.js index 3085a640b6..7a5784f203 100644 --- a/org.adempiere.ui.zk/WEB-INF/src/web/js/chosenbox/Chosenbox.js +++ b/org.adempiere.ui.zk/WEB-INF/src/web/js/chosenbox/Chosenbox.js @@ -873,6 +873,7 @@ it will be useful, but WITHOUT ANY WARRANTY. this.setFloating_(true); this.setTopmost(); ppstyle.zIndex = n.style.zIndex; + ppstyle.display = 'block'; if (opts) { var inp = this.$n(); zk(pp).position(inp, "after_start");