From e5eebba4a6fd9a1fa4c763d9c3f9686a56d0d381 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20Tak=C3=A1cs?= <93127072+PeterTakacs300@users.noreply.github.com> Date: Wed, 31 Jan 2024 05:08:00 +0100 Subject: [PATCH] IDEMPIERE-5992 - Move the getIdentifier methods from WRecordEditor to MLookup class (#2183) * IDEMPIERE-5992 - Move the getIdentifier methods from WRecordEditor to MLookup class * IDEMPIERE-5992 - refactor logic * IDEMPIERE-5992 - replace keyColumn parameter with useUUIDKey --- .../src/org/compiere/model/MLookup.java | 82 ++++++++++++++++ .../adempiere/webui/editor/WRecordEditor.java | 95 ++++--------------- .../webui/editor/WRecordIDEditor.java | 5 +- .../webui/editor/WRecordUUIDEditor.java | 5 +- .../webui/window/WRecordIDDialog.java | 25 +++-- 5 files changed, 125 insertions(+), 87 deletions(-) diff --git a/org.adempiere.base/src/org/compiere/model/MLookup.java b/org.adempiere.base/src/org/compiere/model/MLookup.java index 2cbb8c1e56..65731d521b 100644 --- a/org.adempiere.base/src/org/compiere/model/MLookup.java +++ b/org.adempiere.base/src/org/compiere/model/MLookup.java @@ -38,6 +38,7 @@ import org.compiere.util.DisplayType; import org.compiere.util.Env; import org.compiere.util.KeyNamePair; import org.compiere.util.NamePair; +import org.compiere.util.Util; import org.compiere.util.ValueNamePair; /** @@ -995,6 +996,87 @@ public final class MLookup extends Lookup implements Serializable return vnpCache; } + /** + * Get Lookup + * @param tableID + * @param windowNo + * @param tabNo + * @return null if tableID <= 0 or the table doesn't have any key column, else {@link MLookup} + */ + public static MLookup getRecordsLookup(int tableID, int windowNo, int tabNo) { + return getRecordsLookup(tableID, windowNo, tabNo, false); + } + + /** + * Get Lookup + * @param tableID + * @param windowNo + * @param tabNo + * @param useUUIDKey - default false + * @return null if tableID <= 0 or the table doesn't have any key column, else {@link MLookup} + */ + public static MLookup getRecordsLookup(int tableID, int windowNo, int tabNo, boolean useUUIDKey) { + if(tableID <= 0) + return null; + MTable mTable = MTable.get(Env.getCtx(), tableID, null); + + // load key column + String keyColumn = ""; + if(!useUUIDKey) { + String[] keyColumns = mTable.getKeyColumns(); + // the table has a single key column + if(keyColumns != null && keyColumns.length == 1) + keyColumn = keyColumns[0]; + } + if(Util.isEmpty(keyColumn)) { + keyColumn = PO.getUUIDColumnName(mTable.getTableName()); + } + + if(Util.isEmpty(keyColumn)) + return null; + + MColumn mColumn = MColumn.get(Env.getCtx(), mTable.getTableName(), keyColumn); + + MLookupInfo lookupInfo = MLookupFactory.getLookupInfo (Env.getCtx(), windowNo, tabNo, mColumn.getAD_Column_ID(), DisplayType.Search); + return new MLookup(lookupInfo, tabNo); + } + + /** + * Get Identifier String from AD_Table_ID and Record_ID + * @param tableID + * @param recordID + * @return String + */ + public static String getIdentifier(int tableID, Serializable recordID) { + return getIdentifier(tableID, recordID, 0, 0); + } + + /** + * Get Identifier String from AD_Table_ID and Record_ID + * @param tableID + * @param recordID + * @param windowNo + * @param tabNo + * @return String + */ + public static String getIdentifier(int tableID, Serializable recordID, int windowNo, int tabNo) { + return getIdentifier(tableID, recordID, windowNo, tabNo, false); + } + + /** + * Get Identifier String from AD_Table_ID and Record_ID + * @param tableID + * @param recordID + * @param windowNo + * @param tabNo + * @param useUUIDKey - default false + * @return String + */ + public static String getIdentifier(int tableID, Serializable recordID, int windowNo, int tabNo, boolean useUUIDKey) { + MLookup lookup = getRecordsLookup(tableID, windowNo, tabNo, useUUIDKey); + return lookup != null ? lookup.getDisplay(recordID) : ""; + } + /** * Background Data Loader */ diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/editor/WRecordEditor.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/editor/WRecordEditor.java index 35a517fcd6..ca88d663f5 100644 --- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/editor/WRecordEditor.java +++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/editor/WRecordEditor.java @@ -25,6 +25,8 @@ **********************************************************************/ package org.adempiere.webui.editor; +import java.io.Serializable; + import org.adempiere.util.GridRowCtx; import org.adempiere.webui.ValuePreference; import org.adempiere.webui.component.Textbox; @@ -39,11 +41,7 @@ import org.adempiere.webui.window.WFieldRecordInfo; import org.adempiere.webui.window.WRecordIDDialog; import org.compiere.model.GridField; import org.compiere.model.Lookup; -import org.compiere.model.MColumn; import org.compiere.model.MLookup; -import org.compiere.model.MLookupFactory; -import org.compiere.model.MLookupInfo; -import org.compiere.model.MTable; import org.compiere.util.DisplayType; import org.compiere.util.Env; import org.compiere.util.Msg; @@ -72,6 +70,10 @@ public abstract class WRecordEditor extends WEditor implements ContextMenuLis /** Current tab's AD_Table_ID GridField */ protected GridField tableIDGridField; + /** Window Number */ + int windowNo; + /** Tab Number */ + int tabNo; // UI components protected Textbox recordTextBox; @@ -90,7 +92,8 @@ public abstract class WRecordEditor extends WEditor implements ContextMenuLis */ public WRecordEditor(GridField gridField, boolean tableEditor, IEditorConfiguration editorConfiguration) { super(new Div(), gridField, tableEditor, editorConfiguration); - + tabNo = gridTab != null ? gridTab.getTabNo() : FindWindow.TABNO; + windowNo = gridTab != null ? gridTab.getWindowNo() : gridField.getWindowNo(); getComponent().setSclass("recordid-editor"); getComponent().addEventListener(Events.ON_RIGHT_CLICK, this); @@ -261,9 +264,10 @@ public abstract class WRecordEditor extends WEditor implements ContextMenuLis if(value != null && tableIDValue != null) { int tableID = Integer.parseInt(String.valueOf(tableIDValue)); if (tableID > 0) { - Object recordID = toKeyValue(value); - if(recordID != null && tableID > 0) - recordTextBox.setValue(getIdentifier(tableID, recordID)); + Serializable recordID = (Serializable) toKeyValue(value); + if(recordID != null && tableID > 0) { + recordTextBox.setValue(MLookup.getIdentifier(tableID, recordID, tabNo, windowNo, isUseUUIDKey())); + } } } } @@ -292,14 +296,14 @@ public abstract class WRecordEditor extends WEditor implements ContextMenuLis return ""; if((tableIDValue != null) && (recordIDValue != null)) { int tableID; - Object recordID; + Serializable recordID; try { tableID = Integer.parseInt(String.valueOf(tableIDValue)); - recordID = toKeyValue(recordIDValue); + recordID = (Serializable) toKeyValue(recordIDValue); } catch (NumberFormatException e) { return recordIDValue.toString(); } - return getIdentifier(tableID, recordID); + return MLookup.getIdentifier(tableID, recordID, tabNo, windowNo, isUseUUIDKey()); } else { return recordIDValue.toString(); @@ -314,14 +318,14 @@ public abstract class WRecordEditor extends WEditor implements ContextMenuLis String key = gridTab.getWindowNo() + "|AD_Table_ID"; Object rowTableIdValue = gridRowCtx.get(key); int rowTableID; - Object rowRecordID; + Serializable rowRecordID; try { rowTableID = Integer.parseInt(String.valueOf(rowTableIdValue)); - rowRecordID = toKeyValue(value); + rowRecordID = (Serializable) toKeyValue(value); } catch (NumberFormatException e) { return value.toString(); } - return getIdentifier(rowTableID, rowRecordID); + return MLookup.getIdentifier(rowTableID, rowRecordID, tabNo, windowNo, isUseUUIDKey()); } else { return value.toString(); } @@ -360,65 +364,6 @@ public abstract class WRecordEditor extends WEditor implements ContextMenuLis } } - /** - * Get Lookup - * @param tableID - * @return null if tableID <= 0 or the table doesn't have any key column, else {@link MLookup} - */ - public MLookup getRecordsLookup(int tableID) { - return getRecordsLookup(tableID, false); - } - - /** - * Get Lookup - * @param tableID - * @param tableBased - if the lookup checks for the UUID Key Column based on the table (true), or on the columnName (false) - * @return null if tableID <= 0 or the table doesn't have any key column, else {@link MLookup} - */ - private MLookup getRecordsLookup(int tableID, boolean tableBased) { - if(tableID <= 0) - return null; - MTable mTable = MTable.get(Env.getCtx(), tableID, null); - String keyColumn = ""; - if (tableBased) { - String[] keyColumns = mTable.getKeyColumns(); - keyColumn = keyColumns != null && keyColumns.length > 0 ? keyColumns[0] : null; - } else { - keyColumn = getKeyColumn(mTable); - } - if (Util.isEmpty(keyColumn)) - return null; - - MColumn mColumn = MColumn.get(Env.getCtx(), mTable.getTableName(), keyColumn); - - int tabNo = gridTab != null ? gridTab.getTabNo() : FindWindow.TABNO; - int windowNo = gridTab != null ? gridTab.getWindowNo() : gridField.getWindowNo(); - MLookupInfo lookupInfo = MLookupFactory.getLookupInfo (Env.getCtx(), windowNo, tabNo, mColumn.getAD_Column_ID(), DisplayType.Search); - return new MLookup(lookupInfo, tabNo); - } - - /** - * Get Identifier String from AD_Table_ID and Record_ID - * @param tableID - * @param recordID - * @return String - */ - public String getIdentifier(int tableID, Object recordID) { - MLookup lookup = getRecordsLookup(tableID); - return lookup != null ? lookup.getDisplay(recordID) : ""; - } - - /** - * Get Parent Identifier String from AD_Table_ID and Record_ID - * @param tableID - * @param recordID - * @return String - */ - public String getParentIdentifier(int tableID, Object recordID) { - MLookup lookup = getRecordsLookup(tableID, true); - return lookup != null ? lookup.getDisplay(recordID) : ""; - } - /** * Get AD_Table_ID * @return AD_Table_ID value @@ -453,10 +398,10 @@ public abstract class WRecordEditor extends WEditor implements ContextMenuLis } /** - * @param mTable Reference table + * Use UUID as key column * @return Key column name */ - protected abstract String getKeyColumn(MTable mTable); + public abstract boolean isUseUUIDKey(); /** * Convert value to key value type diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/editor/WRecordIDEditor.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/editor/WRecordIDEditor.java index 7be94a6173..40d5f1cf6d 100644 --- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/editor/WRecordIDEditor.java +++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/editor/WRecordIDEditor.java @@ -95,9 +95,8 @@ public class WRecordIDEditor extends WRecordEditor { } @Override - protected String getKeyColumn(MTable mTable) { - String[] keyColumns = mTable.getKeyColumns(); - return keyColumns != null && keyColumns.length > 0 ? keyColumns[0] : null; + public boolean isUseUUIDKey() { + return false; } @Override diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/editor/WRecordUUIDEditor.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/editor/WRecordUUIDEditor.java index 93cbe96ca1..e77f54e43a 100644 --- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/editor/WRecordUUIDEditor.java +++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/editor/WRecordUUIDEditor.java @@ -36,7 +36,6 @@ import org.adempiere.webui.window.WRecordIDDialog; import org.compiere.model.GridField; import org.compiere.model.MRole; import org.compiere.model.MTable; -import org.compiere.model.PO; import org.compiere.util.DisplayType; import org.compiere.util.Env; import org.compiere.util.Msg; @@ -96,8 +95,8 @@ public class WRecordUUIDEditor extends WRecordEditor { } @Override - protected String getKeyColumn(MTable mTable) { - return PO.getUUIDColumnName(mTable.getTableName()); + public boolean isUseUUIDKey() { + return true; } @Override diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/window/WRecordIDDialog.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/window/WRecordIDDialog.java index 41223dc087..6af88b304d 100644 --- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/window/WRecordIDDialog.java +++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/window/WRecordIDDialog.java @@ -24,6 +24,7 @@ **********************************************************************/ package org.adempiere.webui.window; +import java.io.Serializable; import java.util.Objects; import org.adempiere.webui.component.Button; @@ -38,6 +39,7 @@ import org.adempiere.webui.event.ValueChangeEvent; import org.adempiere.webui.event.ValueChangeListener; import org.adempiere.webui.factory.ButtonFactory; import org.compiere.model.GridField; +import org.compiere.model.GridTab; import org.compiere.model.MLookup; import org.compiere.model.MTable; import org.compiere.model.PO; @@ -74,6 +76,14 @@ public class WRecordIDDialog extends Window implements EventListener, Val private Object recordIDValue; /** Current AD_Table_ID value from {@link #editor} */ private Integer tableIDValue; + /** Grid Tab */ + GridTab gridTab; + /** Grid Field */ + GridField gridField; + /** Window Number */ + int windowNo; + /** Tab Number */ + int tabNo; // UI components private Div contentDiv; @@ -97,7 +107,10 @@ public class WRecordIDDialog extends Window implements EventListener, Val super(); this.editor = editor; - + gridTab = editor.getGridField().getGridTab(); + gridField = editor.getGridField(); + tabNo = gridTab != null ? gridTab.getTabNo() : FindWindow.TABNO; + windowNo = gridTab != null ? gridTab.getWindowNo() : gridField.getWindowNo(); if (editor.getAD_Table_ID() instanceof Integer) { tableIDValue = (Integer) editor.getAD_Table_ID(); } else { @@ -137,7 +150,7 @@ public class WRecordIDDialog extends Window implements EventListener, Val tableIDEditor.setValue(tableIDValue); int tableID = tableIDValue != null ? tableIDValue.intValue() : 0; - MLookup recordsLookup = editor.getRecordsLookup(tableID); + MLookup recordsLookup = MLookup.getRecordsLookup(tableID, tabNo, windowNo, editor.isUseUUIDKey()); if(recordsLookup != null) recordsEditor = new WSearchEditor(editor.getColumnName(), false, false, true, recordsLookup); @@ -154,12 +167,12 @@ public class WRecordIDDialog extends Window implements EventListener, Val parentTextBox = new Textbox(); parentTextBox.setReadonly(true); MTable parentTable = MTable.get(editor.getGridField().getGridTab().getAD_Table_ID()); - Object parentRecordId; + Serializable parentRecordId; if (parentTable.isUUIDKeyTable()) - parentRecordId = editor.getGridField().getGridTab().getValue(PO.getUUIDColumnName(parentTable.getTableName())); + parentRecordId = (Serializable) editor.getGridField().getGridTab().getValue(PO.getUUIDColumnName(parentTable.getTableName())); else parentRecordId = editor.getGridField().getGridTab().getRecord_ID(); - parentTextBox.setValue(editor.getParentIdentifier(parentTable.getAD_Table_ID(), parentRecordId)); + parentTextBox.setValue(MLookup.getIdentifier(parentTable.getAD_Table_ID(), parentRecordId, tabNo, windowNo)); } if (recordsEditor != null) @@ -239,7 +252,7 @@ public class WRecordIDDialog extends Window implements EventListener, Val recordsEditorLabel.detach(); recordsEditor.getComponent().detach(); } - MLookup recordsLookup = editor.getRecordsLookup(tableID); + MLookup recordsLookup = MLookup.getRecordsLookup(tableID, tabNo, windowNo, editor.isUseUUIDKey()); if(recordsLookup != null) { recordsEditor = new WSearchEditor(editor.getColumnName(), false, false, true, recordsLookup); labelsDiv.appendChild(recordsEditorLabel);