From 0422d05487d3de6ce9e9bfdef07d109624f8564f Mon Sep 17 00:00:00 2001 From: Carlos Ruiz Date: Fri, 16 Jan 2015 16:51:38 -0500 Subject: [PATCH 01/20] IDEMPIERE-2403 System Master Roles not combining correctly with SaaS --- org.adempiere.base/src/org/compiere/model/MRole.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/org.adempiere.base/src/org/compiere/model/MRole.java b/org.adempiere.base/src/org/compiere/model/MRole.java index 5366fb0b7f..185d8b6ef3 100644 --- a/org.adempiere.base/src/org/compiere/model/MRole.java +++ b/org.adempiere.base/src/org/compiere/model/MRole.java @@ -1496,7 +1496,7 @@ public final class MRole extends X_AD_Role // first get the window access from the included and substitute roles mergeIncludedAccess("m_windowAccess"); // Load included accesses - metas-2009_0021_AP1_G94 // and now get the window access directly from this role - MClient client = MClient.get(getCtx(), getAD_Client_ID()); + MClient client = MClient.get(Env.getCtx()); String ASPFilter = ""; if (client.isUseASP()) ASPFilter = @@ -1583,7 +1583,7 @@ public final class MRole extends X_AD_Role // first get the process access from the included and substitute roles mergeIncludedAccess("m_processAccess"); // Load included accesses - metas-2009_0021_AP1_G94 // and now get the process access directly from this role - MClient client = MClient.get(getCtx(), getAD_Client_ID()); + MClient client = MClient.get(Env.getCtx()); String ASPFilter = ""; if (client.isUseASP()) ASPFilter = @@ -1665,7 +1665,7 @@ public final class MRole extends X_AD_Role // first get the task access from the included and substitute roles mergeIncludedAccess("m_taskAccess"); // Load included accesses - metas-2009_0021_AP1_G94 // and now get the task access directly from this role - MClient client = MClient.get(getCtx(), getAD_Client_ID()); + MClient client = MClient.get(Env.getCtx()); String ASPFilter = ""; if (client.isUseASP()) ASPFilter = @@ -1745,7 +1745,7 @@ public final class MRole extends X_AD_Role // first get the form access from the included and substitute roles mergeIncludedAccess("m_formAccess"); // Load included accesses - metas-2009_0021_AP1_G94 // and now get the form access directly from this role - MClient client = MClient.get(getCtx(), getAD_Client_ID()); + MClient client = MClient.get(Env.getCtx()); String ASPFilter = ""; if (client.isUseASP()) ASPFilter = @@ -1825,7 +1825,7 @@ public final class MRole extends X_AD_Role // first get the workflow access from the included and substitute roles mergeIncludedAccess("m_workflowAccess"); // Load included accesses - metas-2009_0021_AP1_G94 // and now get the workflow access directly from this role - MClient client = MClient.get(getCtx(), getAD_Client_ID()); + MClient client = MClient.get(Env.getCtx()); String ASPFilter = ""; if (client.isUseASP()) ASPFilter = From 2e8fce6fdeca909dc66da14e2e0710c29d34a4c8 Mon Sep 17 00:00:00 2001 From: Carlos Ruiz Date: Fri, 16 Jan 2015 16:57:40 -0500 Subject: [PATCH 02/20] IDEMPIERE-2404 Position in first pending node in Setup Wizard --- .../webui/apps/form/WSetupWizard.java | 87 +++++++++++-------- 1 file changed, 52 insertions(+), 35 deletions(-) diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/apps/form/WSetupWizard.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/apps/form/WSetupWizard.java index 9f6bdb209f..ac35b5c42e 100644 --- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/apps/form/WSetupWizard.java +++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/apps/form/WSetupWizard.java @@ -80,12 +80,14 @@ public class WSetupWizard extends SetupWizard implements IFormController, EventL private Borderlayout mainLayout = new Borderlayout(); private Panel northPanel = new Panel(); - private Progressmeter progressbar = new Progressmeter(); + private Progressmeter progressbar = new Progressmeter(); private Label progressLabel = new Label(); // private Tree wfnodeTree; private Treeitem prevti = null; - private Treeitem firstti = null; + private Treeitem firstOpenNode = null; + private Treeitem firstOpenWF = null; + private Treeitem firstWF = null; private Label pretitleLabel = new Label(Msg.getMsg(Env.getCtx(), "SetupTask")); private Label titleLabel = new Label(); @@ -201,8 +203,8 @@ public class WSetupWizard extends SetupWizard implements IFormController, EventL Treechildren treeChildren = wfnodeTree.getTreechildren(); Treeitem treeitemwf = new Treeitem(); treeChildren.appendChild(treeitemwf); - if (firstti == null) - firstti = treeitemwf; + if (firstWF == null) + firstWF = treeitemwf; Label wizardLabel = new Label(wfwizard.getName(true)); wizardLabel.setStyle(WIZARD_LABEL_STYLE); @@ -221,9 +223,17 @@ public class WSetupWizard extends SetupWizard implements IFormController, EventL if (openNodes.contains(wfwizard.getAD_Workflow_ID())) treeitemwf.setOpen(true); addNodes(wfwizard, treeitemwf); + if (firstOpenWF == treeitemwf && allPending) { + firstOpenNode = firstOpenWF; + } - if (showColors.isChecked() && (allFinished || !allPending)) - wizardLabel.setZclass(allFinished ? "tree-wsetupwizard-finished-all" : "tree-wsetupwizard-open-tasks"); + if (showColors.isChecked()) { + if (allFinished) { + wizardLabel.setZclass("tree-wsetupwizard-finished-all"); + } else if (!allPending) { + wizardLabel.setZclass("tree-wsetupwizard-open-tasks"); + } + } treeitemwf.setAttribute("AD_Workflow_ID", wfwizard.getAD_Workflow_ID()); if (prevti != null && prevti.getAttribute("AD_Workflow_ID") != null) { @@ -241,40 +251,32 @@ public class WSetupWizard extends SetupWizard implements IFormController, EventL } private void addWfNode(MWFNode node, Treeitem treeitemwf) { - /* TODO: Color of node according to wizard status */ + /* Color of node according to wizard status */ Label nodeLabel = new Label(node.getName(true)); - if (node != null && showColors.isChecked()) { - MWizardProcess wp = MWizardProcess.get(Env.getCtx(), node.getAD_WF_Node_ID(), Env.getAD_Client_ID(Env.getCtx())); - String status = wp.getWizardStatus(); - if (MWizardProcess.WIZARDSTATUS_Finished.equals(status)){ + MWizardProcess wp = MWizardProcess.get(Env.getCtx(), node.getAD_WF_Node_ID(), Env.getAD_Client_ID(Env.getCtx())); + String status = wp.getWizardStatus(); + if (showColors.isChecked()) { + if (MWizardProcess.WIZARDSTATUS_Finished.equals(status)) { nodeLabel.setZclass("tree-wsetupwizard-finished"); - allFinished = allFinished && true; - allPending = allPending && false; - }else if (MWizardProcess.WIZARDSTATUS_Skipped.equals(status)) { + } else if (MWizardProcess.WIZARDSTATUS_Skipped.equals(status)) { nodeLabel.setZclass("tree-wsetupwizard-skipped"); - allFinished = allFinished && true; - allPending = allPending && false; - }else if (MWizardProcess.WIZARDSTATUS_Delayed.equals(status)) { + } else if (MWizardProcess.WIZARDSTATUS_Delayed.equals(status)) { nodeLabel.setZclass("tree-wsetupwizard-delayed"); - allFinished = allFinished && false; - allPending = allPending && false; - }else if (MWizardProcess.WIZARDSTATUS_In_Progress.equals(status)) { + } else if (MWizardProcess.WIZARDSTATUS_In_Progress.equals(status)) { nodeLabel.setZclass("tree-wsetupwizard-in-progress"); - allFinished = allFinished && false; - allPending = allPending && false; - }else if (MWizardProcess.WIZARDSTATUS_Pending.equals(status)) { + } else if (MWizardProcess.WIZARDSTATUS_Pending.equals(status)) { nodeLabel.setZclass("tree-wsetupwizard-pending"); - allFinished = allFinished && false; - allPending = allPending && true; - }else { + } else { nodeLabel.setZclass("tree-setupwizard-nostatus"); - allFinished = false; - allPending = allPending && true; } - }else{ - nodeLabel.setStyle("margin-left:20px;"); } - + if ( MWizardProcess.WIZARDSTATUS_Finished.equals(status) + || MWizardProcess.WIZARDSTATUS_Skipped.equals(status)) { + allPending = false; + } else { + allFinished = false; + } + Div div = new Div(); div.setStyle("display:inline;"); div.appendChild(nodeLabel); @@ -300,13 +302,20 @@ public class WSetupWizard extends SetupWizard implements IFormController, EventL wfnodeTree.setSelectedItem(childItem); } nextItems.add(childItem); + + if (firstOpenNode == null) { + if (! ( MWizardProcess.WIZARDSTATUS_Finished.equals(status) + || MWizardProcess.WIZARDSTATUS_Skipped.equals(status))) { + firstOpenWF = treeitemwf; + firstOpenNode = childItem; + } + } } /** * Static init * @throws Exception */ - @SuppressWarnings("deprecation") private void jbInit () throws Exception { form.setWidth("99%"); @@ -428,7 +437,7 @@ public class WSetupWizard extends SetupWizard implements IFormController, EventL westdown.appendChild(bOK); westdown.appendChild(bNext); Div divButton = new Div(); - divButton.setAlign("right"); + divButton.setStyle("display: inline-block; float: right;"); divButton.appendChild(westdown); East east = new East(); @@ -443,8 +452,16 @@ public class WSetupWizard extends SetupWizard implements IFormController, EventL setNotesPanelVisible(false); - wfnodeTree.setSelectedItem(firstti); - showItem(firstti); + if (firstOpenNode == null) { + firstOpenWF = firstWF; + firstOpenNode = firstWF; + } + if (firstOpenWF != null) + firstOpenWF.setOpen(true); + if (firstOpenNode != null) { + wfnodeTree.setSelectedItem(firstOpenNode); + showItem(firstOpenNode); + } } // jbInit private void refreshProgress() { From 03fb5cbda73eb6f3f0f2f00b7f07fa069492ccdd Mon Sep 17 00:00:00 2001 From: Carlos Ruiz Date: Fri, 16 Jan 2015 18:44:33 -0500 Subject: [PATCH 03/20] IDEMPIERE-2405 Implement SaaS support for Setup Wizard --- .../oracle/201501161751_IDEMPIERE-2405.sql | 11 +++ .../201501161751_IDEMPIERE-2405.sql | 8 +++ .../webui/apps/form/WSetupWizard.java | 49 ++++++++++--- .../org/compiere/apps/form/SetupWizard.java | 70 +++++++++---------- 4 files changed, 92 insertions(+), 46 deletions(-) create mode 100644 migration/i2.1/oracle/201501161751_IDEMPIERE-2405.sql create mode 100644 migration/i2.1/postgresql/201501161751_IDEMPIERE-2405.sql diff --git a/migration/i2.1/oracle/201501161751_IDEMPIERE-2405.sql b/migration/i2.1/oracle/201501161751_IDEMPIERE-2405.sql new file mode 100644 index 0000000000..7ec30c2324 --- /dev/null +++ b/migration/i2.1/oracle/201501161751_IDEMPIERE-2405.sql @@ -0,0 +1,11 @@ +SET SQLBLANKLINES ON +SET DEFINE OFF + +-- Jan 16, 2015 5:50:47 PM COT +-- IDEMPIERE-2405 Implement SaaS support for Setup Wizard +UPDATE AD_Val_Rule SET Code='AD_Workflow.WorkflowType IN (''G'',''W'')',Updated=TO_DATE('2015-01-16 17:50:47','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Val_Rule_ID=52006 +; + +SELECT register_migration_script('201501161751_IDEMPIERE-2405.sql') FROM dual +; + diff --git a/migration/i2.1/postgresql/201501161751_IDEMPIERE-2405.sql b/migration/i2.1/postgresql/201501161751_IDEMPIERE-2405.sql new file mode 100644 index 0000000000..979843b2ee --- /dev/null +++ b/migration/i2.1/postgresql/201501161751_IDEMPIERE-2405.sql @@ -0,0 +1,8 @@ +-- Jan 16, 2015 5:50:47 PM COT +-- IDEMPIERE-2405 Implement SaaS support for Setup Wizard +UPDATE AD_Val_Rule SET Code='AD_Workflow.WorkflowType IN (''G'',''W'')',Updated=TO_TIMESTAMP('2015-01-16 17:50:47','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Val_Rule_ID=52006 +; + +SELECT register_migration_script('201501161751_IDEMPIERE-2405.sql') FROM dual +; + diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/apps/form/WSetupWizard.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/apps/form/WSetupWizard.java index ac35b5c42e..9ef0ce458d 100644 --- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/apps/form/WSetupWizard.java +++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/apps/form/WSetupWizard.java @@ -43,6 +43,7 @@ import org.adempiere.webui.util.TreeUtils; import org.compiere.apps.form.SetupWizard; import org.compiere.model.MLookup; import org.compiere.model.MLookupFactory; +import org.compiere.model.MRole; import org.compiere.model.X_AD_CtxHelp; import org.compiere.util.DisplayType; import org.compiere.util.Env; @@ -68,6 +69,7 @@ import org.zkoss.zul.Treechildren; import org.zkoss.zul.Treeitem; import org.zkoss.zul.Treerow; import org.zkoss.zul.Vbox; + /** * View for Setup Wizard * @@ -88,6 +90,8 @@ public class WSetupWizard extends SetupWizard implements IFormController, EventL private Treeitem firstOpenNode = null; private Treeitem firstOpenWF = null; private Treeitem firstWF = null; + private int cntNodes = 0; + private int cntSolved = 0; private Label pretitleLabel = new Label(Msg.getMsg(Env.getCtx(), "SetupTask")); private Label titleLabel = new Label(); @@ -181,6 +185,8 @@ public class WSetupWizard extends SetupWizard implements IFormController, EventL * Load Wizard Nodes */ private void loadWizardNodes() { + cntNodes = 0; + cntSolved = 0; nextItems.removeAll(nextItems); Treechildren treeChildren = wfnodeTree.getTreechildren(); List wfwizards = getWfWizards(); @@ -200,9 +206,19 @@ public class WSetupWizard extends SetupWizard implements IFormController, EventL protected void addWfEntry(MWorkflow wfwizard) { allFinished = true; allPending = true; - Treechildren treeChildren = wfnodeTree.getTreechildren(); Treeitem treeitemwf = new Treeitem(); + Treechildren treeChildren = wfnodeTree.getTreechildren(); treeChildren.appendChild(treeitemwf); + addNodes(wfwizard, treeitemwf); + if ( treeitemwf.getTreechildren() == null + || treeitemwf.getTreechildren().getChildren() == null + || treeitemwf.getTreechildren().getChildren().size() == 0) { + // no nodes + treeChildren.removeChild(treeitemwf); + treeitemwf = null; + return; + } + if (firstWF == null) firstWF = treeitemwf; @@ -211,7 +227,6 @@ public class WSetupWizard extends SetupWizard implements IFormController, EventL Div div = new Div(); div.setStyle("display:inline;"); div.appendChild(wizardLabel); - Treerow treerow = new Treerow(); treerow.setStyle("vertical-align:top;"); treeitemwf.appendChild(treerow); @@ -222,7 +237,6 @@ public class WSetupWizard extends SetupWizard implements IFormController, EventL nextItems.add(treeitemwf); if (openNodes.contains(wfwizard.getAD_Workflow_ID())) treeitemwf.setOpen(true); - addNodes(wfwizard, treeitemwf); if (firstOpenWF == treeitemwf && allPending) { firstOpenNode = firstOpenWF; } @@ -251,6 +265,20 @@ public class WSetupWizard extends SetupWizard implements IFormController, EventL } private void addWfNode(MWFNode node, Treeitem treeitemwf) { + if (MWFNode.ACTION_UserWindow.equals(node.getAction()) && node.getAD_Window_ID() > 0) { + if (MRole.getDefault().getWindowAccess(node.getAD_Window_ID()) == null) + return; + } else if (MWFNode.ACTION_UserForm.equals(node.getAction()) && node.getAD_Form_ID() > 0) { + if (MRole.getDefault().getFormAccess(node.getAD_Form_ID()) == null) + return; + } else if ((MWFNode.ACTION_AppsProcess.equals(node.getAction()) || MWFNode.ACTION_AppsReport.equals(node.getAction())) && node.getAD_Process_ID() > 0) { + if (MRole.getDefault().getProcessAccess(node.getAD_Process_ID()) == null) + return; + } else if (MWFNode.ACTION_AppsTask.equals(node.getAction()) && node.getAD_Task_ID() > 0) { + if (MRole.getDefault().getTaskAccess(node.getAD_Task_ID()) == null) + return; + } + /* Color of node according to wizard status */ Label nodeLabel = new Label(node.getName(true)); MWizardProcess wp = MWizardProcess.get(Env.getCtx(), node.getAD_WF_Node_ID(), Env.getAD_Client_ID(Env.getCtx())); @@ -270,9 +298,11 @@ public class WSetupWizard extends SetupWizard implements IFormController, EventL nodeLabel.setZclass("tree-setupwizard-nostatus"); } } + cntNodes++; if ( MWizardProcess.WIZARDSTATUS_Finished.equals(status) || MWizardProcess.WIZARDSTATUS_Skipped.equals(status)) { allPending = false; + cntSolved++; } else { allFinished = false; } @@ -465,14 +495,12 @@ public class WSetupWizard extends SetupWizard implements IFormController, EventL } // jbInit private void refreshProgress() { - int nodes = getNodesCnt(); - int solved = getWizardCnt(); - int percent = solved * 100; - if (nodes > 0) - percent = percent / nodes; + int percent = cntSolved * 100; + if (cntNodes > 0) + percent = percent / cntNodes; else percent = 0; - Object[] args = new Object[] {solved, nodes, percent}; + Object[] args = new Object[] {cntSolved, cntNodes, percent}; String msg = Msg.getMsg(Env.getCtx(), "SetupWizardProgress", args); progressLabel.setText(msg); progressbar.setValue(percent); @@ -496,7 +524,7 @@ public class WSetupWizard extends SetupWizard implements IFormController, EventL if (e.getTarget() == wfnodeTree) { onTreeSelection(e); } else if (e.getTarget() == bRefresh) { - showInRightPanel(0, m_node.getAD_WF_Node_ID()); + repaintTree(); } else if (e.getTarget() == bOK) { int userid = 0; allFinished=true; @@ -672,7 +700,6 @@ public class WSetupWizard extends SetupWizard implements IFormController, EventL private void setNotesPanelVisible(boolean visible) { notesLabel.setVisible(visible); notesField.setVisible(visible); - bRefresh.setVisible(visible); bOK.setVisible(visible); statusLabel.setVisible(visible); statusField.setVisible(visible); diff --git a/org.adempiere.ui/src/org/compiere/apps/form/SetupWizard.java b/org.adempiere.ui/src/org/compiere/apps/form/SetupWizard.java index 96401d2eca..9e5dbd18c0 100644 --- a/org.adempiere.ui/src/org/compiere/apps/form/SetupWizard.java +++ b/org.adempiere.ui/src/org/compiere/apps/form/SetupWizard.java @@ -18,9 +18,9 @@ package org.compiere.apps.form; import java.util.List; import org.adempiere.model.MWizardProcess; +import org.compiere.model.MClient; import org.compiere.model.Query; import org.compiere.util.CLogger; -import org.compiere.util.DB; import org.compiere.util.Env; import org.compiere.wf.MWFNode; import org.compiere.wf.MWorkflow; @@ -39,41 +39,41 @@ public class SetupWizard public MWFNode m_node; - /** - * Get the number of workflow wizard nodes - */ - public int getNodesCnt() { - /* TODO: SaaS filter */ - final String sql = "SELECT COUNT(1) " + - "FROM AD_Workflow w " + - "JOIN AD_WF_Node n ON (n.AD_Workflow_ID=w.AD_Workflow_ID) " + - "WHERE w.WorkflowType='W' " + // Wizard - "AND w.IsActive='Y' " + - "AND n.IsActive='Y'"; - return DB.getSQLValue(null, sql); - } - - /** - * Get the number of wizard nodes that has been finished or skipped by user - */ - public int getWizardCnt() { - /* TODO: SaaS filter */ - final String sql = "SELECT COUNT(DISTINCT z.AD_WF_Node_ID) " + - "FROM AD_Workflow w " + - "JOIN AD_WF_Node n ON (n.AD_Workflow_ID=w.AD_Workflow_ID) " + - "JOIN AD_WizardProcess z ON (n.AD_WF_Node_ID=z.AD_WF_Node_ID) " + - "WHERE w.WorkflowType='W' " + // Wizard - "AND w.IsActive='Y' " + - "AND n.IsActive='Y' " + - "AND z.AD_Client_ID=" + Env.getAD_Client_ID(Env.getCtx()) + - " AND z.IsActive='Y' " + - "AND z.WizardStatus IN ('F','S')"; // Finished/Skipped - return DB.getSQLValue(null, sql); - } - public List getWfWizards() { - /* TODO: SaaS filter */ - return new Query(Env.getCtx(), MWorkflow.Table_Name, "WorkflowType=? AND IsActive='Y' AND AD_Client_ID IN (0, ?)", null) + MClient client = MClient.get(Env.getCtx()); + String ASPFilter = ""; + if (client.isUseASP()) + ASPFilter = + " AND ( AD_Workflow.AD_Workflow_ID IN ( " + // Just ASP subscribed workflows for client " + + " SELECT w.AD_Workflow_ID " + + " FROM ASP_Workflow w, ASP_Level l, ASP_ClientLevel cl " + + " WHERE w.ASP_Level_ID = l.ASP_Level_ID " + + " AND cl.AD_Client_ID = " + client.getAD_Client_ID() + + " AND cl.ASP_Level_ID = l.ASP_Level_ID " + + " AND w.IsActive = 'Y' " + + " AND l.IsActive = 'Y' " + + " AND cl.IsActive = 'Y' " + + " AND w.ASP_Status = 'S') " // Show + + " OR AD_Workflow.AD_Workflow_ID IN ( " + // + show ASP exceptions for client + + " SELECT AD_Workflow_ID " + + " FROM ASP_ClientException ce " + + " WHERE ce.AD_Client_ID = " + client.getAD_Client_ID() + + " AND ce.IsActive = 'Y' " + + " AND ce.AD_Workflow_ID IS NOT NULL " + + " AND ce.ASP_Status = 'S') " // Show + + " ) " + + " AND AD_Workflow.AD_Workflow_ID NOT IN ( " + // minus hide ASP exceptions for client + + " SELECT AD_Workflow_ID " + + " FROM ASP_ClientException ce " + + " WHERE ce.AD_Client_ID = " + client.getAD_Client_ID() + + " AND ce.IsActive = 'Y' " + + " AND ce.AD_Workflow_ID IS NOT NULL " + + " AND ce.ASP_Status = 'H')"; // Hide + String where = "WorkflowType=? AND IsActive='Y' AND AD_Client_ID IN (0, ?)" + ASPFilter; + return new Query(Env.getCtx(), MWorkflow.Table_Name, where, null) .setParameters(MWorkflow.WORKFLOWTYPE_Wizard, Env.getAD_Client_ID(Env.getCtx())) .setOnlyActiveRecords(true) .setOrderBy(MWorkflow.COLUMNNAME_Priority) From a19706d7389a2154e245918a0dd6de7df2b77d5d Mon Sep 17 00:00:00 2001 From: Carlos Ruiz Date: Fri, 16 Jan 2015 18:45:19 -0500 Subject: [PATCH 04/20] IDEMPIERE-2406 Recent Items showing windows that role cannot access --- .../src/org/adempiere/webui/dashboard/DPRecentItems.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/dashboard/DPRecentItems.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/dashboard/DPRecentItems.java index 2fa707fe79..764fe0f1c7 100644 --- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/dashboard/DPRecentItems.java +++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/dashboard/DPRecentItems.java @@ -24,6 +24,7 @@ import org.adempiere.webui.theme.ThemeManager; import org.adempiere.webui.util.ServerPushTemplate; import org.compiere.model.MQuery; import org.compiere.model.MRecentItem; +import org.compiere.model.MRole; import org.compiere.model.MSysConfig; import org.compiere.model.MTable; import org.compiere.util.Env; @@ -227,6 +228,8 @@ public class DPRecentItems extends DashboardPanel implements EventListener ris = MRecentItem.getFromUser(ctx, AD_User_ID); int riShown = 0; for (MRecentItem ri : ris) { + if (ri.getAD_Window_ID() > 0 && MRole.getDefault().getWindowAccess(ri.getAD_Window_ID()) == null) + continue; String label = ri.getLabel(); if (label == null) continue; From 1ff06a26682eda4a9f575f649d196d3084a9c8c5 Mon Sep 17 00:00:00 2001 From: Carlos Ruiz Date: Fri, 16 Jan 2015 19:58:10 -0500 Subject: [PATCH 05/20] IDEMPIERE-2404 Position in first pending node in Setup Wizard --- .../src/org/adempiere/webui/apps/form/WSetupWizard.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/apps/form/WSetupWizard.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/apps/form/WSetupWizard.java index 9ef0ce458d..adea18ffbb 100644 --- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/apps/form/WSetupWizard.java +++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/apps/form/WSetupWizard.java @@ -209,12 +209,14 @@ public class WSetupWizard extends SetupWizard implements IFormController, EventL Treeitem treeitemwf = new Treeitem(); Treechildren treeChildren = wfnodeTree.getTreechildren(); treeChildren.appendChild(treeitemwf); + nextItems.add(treeitemwf); addNodes(wfwizard, treeitemwf); if ( treeitemwf.getTreechildren() == null || treeitemwf.getTreechildren().getChildren() == null || treeitemwf.getTreechildren().getChildren().size() == 0) { // no nodes treeChildren.removeChild(treeitemwf); + nextItems.remove(treeitemwf); treeitemwf = null; return; } @@ -234,7 +236,6 @@ public class WSetupWizard extends SetupWizard implements IFormController, EventL Treecell treecell = new Treecell(); treerow.appendChild(treecell); treecell.appendChild(div); - nextItems.add(treeitemwf); if (openNodes.contains(wfwizard.getAD_Workflow_ID())) treeitemwf.setOpen(true); if (firstOpenWF == treeitemwf && allPending) { @@ -660,6 +661,7 @@ public class WSetupWizard extends SetupWizard implements IFormController, EventL SessionManager.getAppDesktop().updateHelpContext(X_AD_CtxHelp.CTXTYPE_Workflow, wfid); } else if (ti.getAttribute("AD_WF_Node_ID") != null) { // MWFNode + ((Treeitem)ti.getParent().getParent()).setOpen(true); int nodeid = (Integer) ti.getAttribute("AD_WF_Node_ID"); showInRightPanel(0, nodeid); SessionManager.getAppDesktop().updateHelpContext(X_AD_CtxHelp.CTXTYPE_Node, nodeid); From f2cda463d12a133449568fb4a5151f091c7f049a Mon Sep 17 00:00:00 2001 From: Carlos Ruiz Date: Sat, 17 Jan 2015 10:48:54 -0500 Subject: [PATCH 06/20] IDEMPIERE-2404 Position in first pending node in Setup Wizard / when opening Setup Wizard the first time the context help of the node is not shown --- org.adempiere.base/src/org/compiere/model/SystemIDs.java | 1 + .../src/org/adempiere/webui/apps/form/WSetupWizard.java | 2 +- .../src/org/adempiere/webui/desktop/DefaultDesktop.java | 5 +++++ 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/org.adempiere.base/src/org/compiere/model/SystemIDs.java b/org.adempiere.base/src/org/compiere/model/SystemIDs.java index 5efa618a48..5685464606 100644 --- a/org.adempiere.base/src/org/compiere/model/SystemIDs.java +++ b/org.adempiere.base/src/org/compiere/model/SystemIDs.java @@ -50,6 +50,7 @@ public class SystemIDs public final static int FORM_PAYMENT_PRINT_EXPORT = 106; public final static int FORM_ARCHIVEVIEWER = 118; public final static int FORM_REPORT_WIZARD = 200002; + public final static int FORM_SETUP_WIZARD = 200000; public final static int MENU_NOTICE = 233; diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/apps/form/WSetupWizard.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/apps/form/WSetupWizard.java index adea18ffbb..f0153de01e 100644 --- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/apps/form/WSetupWizard.java +++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/apps/form/WSetupWizard.java @@ -137,7 +137,7 @@ public class WSetupWizard extends SetupWizard implements IFormController, EventL } catch (Exception ex) { - log.log(Level.SEVERE, "VTreeMaintenance.init", ex); + log.log(Level.SEVERE, "WSetupWizard.init", ex); } } // init diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/desktop/DefaultDesktop.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/desktop/DefaultDesktop.java index 9f6cc44898..aa8ce5ac48 100644 --- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/desktop/DefaultDesktop.java +++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/desktop/DefaultDesktop.java @@ -61,6 +61,7 @@ import org.compiere.model.GridTab; import org.compiere.model.MQuery; import org.compiere.model.MRole; import org.compiere.model.MTable; +import org.compiere.model.SystemIDs; import org.compiere.model.X_AD_CtxHelp; import org.compiere.util.CLogger; import org.compiere.util.Env; @@ -669,6 +670,10 @@ public class DefaultDesktop extends TabbedDesktop implements MenuListener, Seria @Override public void updateHelpContext(String ctxType, int recordId) { + // don't show context for SetupWizard Form, is managed internally using wf and node ctxhelp + if (recordId == SystemIDs.FORM_SETUP_WIZARD && X_AD_CtxHelp.CTXTYPE_Form.equals(ctxType)) + return; + Clients.response(new AuScript("zWatch.fire('onFieldTooltip', this);")); helpController.renderCtxHelp(ctxType, recordId); From 3caf738eaeb4031067077ecf792758e2014f2cb9 Mon Sep 17 00:00:00 2001 From: Carlos Ruiz Date: Sat, 17 Jan 2015 10:51:23 -0500 Subject: [PATCH 07/20] IDEMPIERE-2409 Improve Context Help performance using Cache --- .../src/org/compiere/model/MCtxHelp.java | 62 ++++++ .../src/org/compiere/model/MCtxHelpMsg.java | 196 ++++++++++++++++++ .../adempiere/webui/panel/HelpController.java | 154 +------------- 3 files changed, 264 insertions(+), 148 deletions(-) create mode 100644 org.adempiere.base/src/org/compiere/model/MCtxHelp.java create mode 100644 org.adempiere.base/src/org/compiere/model/MCtxHelpMsg.java diff --git a/org.adempiere.base/src/org/compiere/model/MCtxHelp.java b/org.adempiere.base/src/org/compiere/model/MCtxHelp.java new file mode 100644 index 0000000000..05d0851590 --- /dev/null +++ b/org.adempiere.base/src/org/compiere/model/MCtxHelp.java @@ -0,0 +1,62 @@ +/*********************************************************************** + * This file is part of iDempiere ERP Open Source * + * http://www.idempiere.org * + * * + * Copyright (C) Contributors * + * * + * This program is free software; you can redistribute it and/or * + * modify it under the terms of the GNU General Public License * + * as published by the Free Software Foundation; either version 2 * + * of the License, or (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the Free Software * + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * + * MA 02110-1301, USA. * + * * + * Contributors: * + * - Carlos Ruiz - globalqss * + **********************************************************************/ + +package org.compiere.model; + +import java.sql.ResultSet; +import java.util.Properties; + +/** + * Context Help Model + * + * @author Carlos Ruiz + */ +public class MCtxHelp extends X_AD_CtxHelp { + /** + * + */ + private static final long serialVersionUID = 2824732566905179805L; + + /** + * Standard Constructor + * @param ctx context + * @param AD_CtxHelp_ID + * @param trxName transaction + */ + public MCtxHelp (Properties ctx, int AD_CtxHelp_ID, String trxName) { + super (ctx, AD_CtxHelp_ID, trxName); + } // MCtxHelp + + /** + * Load Constructor + * @param ctx context + * @param rs result set + * @param trxName transaction + */ + public MCtxHelp (Properties ctx, ResultSet rs, String trxName) { + super(ctx, rs, trxName); + } // MCtxHelp + +} // MCtxHelp diff --git a/org.adempiere.base/src/org/compiere/model/MCtxHelpMsg.java b/org.adempiere.base/src/org/compiere/model/MCtxHelpMsg.java new file mode 100644 index 0000000000..d3b48f32b7 --- /dev/null +++ b/org.adempiere.base/src/org/compiere/model/MCtxHelpMsg.java @@ -0,0 +1,196 @@ +/*********************************************************************** + * This file is part of iDempiere ERP Open Source * + * http://www.idempiere.org * + * * + * Copyright (C) Contributors * + * * + * This program is free software; you can redistribute it and/or * + * modify it under the terms of the GNU General Public License * + * as published by the Free Software Foundation; either version 2 * + * of the License, or (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the Free Software * + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * + * MA 02110-1301, USA. * + * * + * Contributors: * + * - Carlos Ruiz - globalqss * + **********************************************************************/ + +package org.compiere.model; + +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.util.Properties; +import java.util.logging.Level; + +import org.adempiere.exceptions.AdempiereException; +import org.compiere.util.CCache; +import org.compiere.util.CLogger; +import org.compiere.util.DB; +import org.compiere.util.Env; + +/** + * Context Help Message Model + * + * @author Carlos Ruiz + */ +public class MCtxHelpMsg extends X_AD_CtxHelpMsg { + /** + * + */ + private static final long serialVersionUID = -7892179461720143685L; + + /** Logging */ + private static CLogger s_log = CLogger.getCLogger(MCtxHelpMsg.class); + /** Context Help Message Cache */ + private static CCache s_cache = new CCache(Table_Name, 10); + + /** + * Standard Constructor + * @param ctx context + * @param AD_CtxHelpMsg_ID + * @param trxName transaction + */ + public MCtxHelpMsg (Properties ctx, int AD_CtxHelpMsg_ID, String trxName) { + super (ctx, AD_CtxHelpMsg_ID, trxName); + } // MCtxHelpMsg + + /** + * Load Constructor + * @param ctx context + * @param rs result set + * @param trxName transaction + */ + public MCtxHelpMsg (Properties ctx, ResultSet rs, String trxName) { + super(ctx, rs, trxName); + } // MCtxHelpMsg + + /** + * Get the context help message defined for the type, recordid, language, client, org + * @param ctx + * @param ctxtype + * @param recordId + * @return the message translated + */ + public static String get(Properties ctx, String ctxType, int recordId) { + StringBuilder key = new StringBuilder() + .append(ctxType).append("|") + .append(recordId).append("|") + .append(Env.getAD_Client_ID(ctx)).append("|") + .append(Env.getAD_Org_ID(ctx)).append("|") + .append(Env.getAD_Language(Env.getCtx())); + String retValue = null; + if (s_cache.containsKey(key.toString())) { + retValue = s_cache.get(key.toString()); + if (s_log.isLoggable(Level.FINEST)) s_log.finest("Cache: " + retValue); + return retValue; + } + + int AD_CtxHelp_ID = getCtxHelpID(ctxType, recordId); + if (AD_CtxHelp_ID > 0) { + StringBuilder sql = new StringBuilder(); + if (Env.isBaseLanguage(Env.getCtx(), X_AD_CtxHelpMsg.Table_Name)) { + sql.append("SELECT MsgText "); + sql.append("FROM AD_CtxHelpMsg "); + sql.append("WHERE IsActive = 'Y' "); + sql.append("AND AD_Client_ID IN (0, ?) "); + sql.append("AND AD_Org_ID IN (0, ?) "); + sql.append("AND AD_CtxHelp_ID = ? "); + sql.append("ORDER BY AD_Client_ID DESC, AD_Org_ID DESC, AD_CtxHelpMsg_ID DESC"); + } else { + sql.append("SELECT mt.MsgText "); + sql.append("FROM AD_CtxHelpMsg m "); + sql.append("LEFT JOIN AD_CtxHelpMsg_Trl mt ON (mt.AD_CtxHelpMsg_ID = m.AD_CtxHelpMsg_ID AND mt.AD_Language = ?) "); + sql.append("WHERE mt.IsActive = 'Y' "); + sql.append("AND m.AD_Client_ID IN (0, ?) "); + sql.append("AND m.AD_Org_ID IN (0, ?) "); + sql.append("AND m.AD_CtxHelp_ID = ? "); + sql.append("ORDER BY m.AD_Client_ID DESC, m.AD_Org_ID DESC, m.AD_CtxHelpMsg_ID DESC"); + } + + PreparedStatement pstmt = null; + ResultSet rs = null; + + try { + pstmt = DB.prepareStatement(sql.toString(), null); + int count = 1; + if (!Env.isBaseLanguage(Env.getCtx(), X_AD_CtxHelpMsg.Table_Name)) + pstmt.setString(count++, Env.getAD_Language(Env.getCtx())); + pstmt.setInt(count++, Env.getAD_Client_ID(ctx)); + pstmt.setInt(count++, Env.getAD_Org_ID(ctx)); + pstmt.setInt(count++, AD_CtxHelp_ID); + rs = pstmt.executeQuery(); + if (rs.next()) + retValue = rs.getString(X_AD_CtxHelpMsg.COLUMNNAME_MsgText); + } catch (Exception e) { + throw new AdempiereException(e); + } finally { + DB.close(rs, pstmt); + rs=null; pstmt=null; + } + } + + if (retValue == null) + retValue = ""; + s_cache.put(key.toString(), retValue); + return retValue; + } + + private static int getCtxHelpID(String ctxType, int recordId) { + Properties ctx = Env.getCtx(); + String column; + String table; + if (ctxType == X_AD_CtxHelp.CTXTYPE_Tab) { + column = X_AD_Tab.COLUMNNAME_AD_Tab_ID; + table = X_AD_Tab.Table_Name; + } else if (ctxType == X_AD_CtxHelp.CTXTYPE_Process) { + column = X_AD_Process.COLUMNNAME_AD_Process_ID; + table = X_AD_Process.Table_Name; + } else if (ctxType == X_AD_CtxHelp.CTXTYPE_Form) { + column = X_AD_Form.COLUMNNAME_AD_Form_ID; + table = X_AD_Form.Table_Name; + } else if (ctxType == X_AD_CtxHelp.CTXTYPE_Info) { + column = X_AD_InfoWindow.COLUMNNAME_AD_InfoWindow_ID; + table = X_AD_InfoWindow.Table_Name; + } else if (ctxType == X_AD_CtxHelp.CTXTYPE_Workflow) { + column = X_AD_Workflow.COLUMNNAME_AD_Workflow_ID; + table = X_AD_Workflow.Table_Name; + } else if (ctxType == X_AD_CtxHelp.CTXTYPE_Task) { + column = X_AD_Task.COLUMNNAME_AD_Task_ID; + table = X_AD_Task.Table_Name; + } else if (ctxType == X_AD_CtxHelp.CTXTYPE_Node) { + column = X_AD_WF_Node.COLUMNNAME_AD_WF_Node_ID; + table = X_AD_WF_Node.Table_Name; + } else { + column = ""; + table = X_AD_CtxHelp.Table_Name; + } + + StringBuilder sql = new StringBuilder(); + sql.append("SELECT t.AD_CtxHelp_ID FROM "); + sql.append(table); + sql.append(" t, AD_CtxHelp h WHERE t.AD_CtxHelp_ID=h.AD_CtxHelp_ID AND t.IsActive='Y' AND h.IsActive='Y' AND h.AD_Client_ID IN (0, ?) AND h.AD_Org_ID IN (0, ?) "); + if (ctxType == X_AD_CtxHelp.CTXTYPE_Home) { + sql.append("AND h.CtxType"); + } else if (ctxType == X_AD_CtxHelp.CTXTYPE_Tab || ctxType == X_AD_CtxHelp.CTXTYPE_Process || + ctxType == X_AD_CtxHelp.CTXTYPE_Form || ctxType == X_AD_CtxHelp.CTXTYPE_Info || + ctxType == X_AD_CtxHelp.CTXTYPE_Workflow || ctxType == X_AD_CtxHelp.CTXTYPE_Task || + ctxType == X_AD_CtxHelp.CTXTYPE_Node) { + sql.append("AND t."); + sql.append(column); + } else { + sql.append("AND 1"); // must not happen + } + sql.append("=? "); + sql.append("ORDER BY h.AD_Client_ID DESC, h.AD_Org_ID DESC, h.AD_CtxHelp_ID DESC"); + return DB.getSQLValue(null, sql.toString(), Env.getAD_Client_ID(ctx), Env.getAD_Org_ID(ctx), ctxType == X_AD_CtxHelp.CTXTYPE_Home ? ctxType : recordId); + } + +} // MCtxHelpMsg diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/panel/HelpController.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/panel/HelpController.java index 1f0f4f1e7c..b7c62f993e 100644 --- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/panel/HelpController.java +++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/panel/HelpController.java @@ -14,29 +14,18 @@ package org.adempiere.webui.panel; -import java.sql.PreparedStatement; -import java.sql.ResultSet; import java.util.Properties; -import org.adempiere.exceptions.AdempiereException; import org.adempiere.webui.desktop.IDesktop; import org.compiere.model.GridField; import org.compiere.model.GridTab; +import org.compiere.model.MCtxHelpMsg; import org.compiere.model.MForm; import org.compiere.model.MInfoWindow; import org.compiere.model.MProcess; import org.compiere.model.MTab; import org.compiere.model.MTask; import org.compiere.model.X_AD_CtxHelp; -import org.compiere.model.X_AD_CtxHelpMsg; -import org.compiere.model.X_AD_Form; -import org.compiere.model.X_AD_InfoWindow; -import org.compiere.model.X_AD_Process; -import org.compiere.model.X_AD_Tab; -import org.compiere.model.X_AD_Task; -import org.compiere.model.X_AD_WF_Node; -import org.compiere.model.X_AD_Workflow; -import org.compiere.util.DB; import org.compiere.util.Env; import org.compiere.util.Msg; import org.compiere.wf.MWFNode; @@ -500,145 +489,14 @@ public class HelpController .replace("<", "<"); return htmlString; } - - private int getCtxHelpID(String ctxType, int recordId) + + private String getCtxHelpMsgList(String ctxType, int recordId) { Properties ctx = Env.getCtx(); - - StringBuilder sql = new StringBuilder(); - sql.append("SELECT t."); - if (ctxType == X_AD_CtxHelp.CTXTYPE_Tab) - sql.append(X_AD_Tab.COLUMNNAME_AD_CtxHelp_ID); - else if (ctxType == X_AD_CtxHelp.CTXTYPE_Process) - sql.append(X_AD_Process.COLUMNNAME_AD_CtxHelp_ID); - else if (ctxType == X_AD_CtxHelp.CTXTYPE_Form) - sql.append(X_AD_Form.COLUMNNAME_AD_CtxHelp_ID); - else if (ctxType == X_AD_CtxHelp.CTXTYPE_Info) - sql.append(X_AD_InfoWindow.COLUMNNAME_AD_CtxHelp_ID); - else if (ctxType == X_AD_CtxHelp.CTXTYPE_Workflow) - sql.append(X_AD_Workflow.COLUMNNAME_AD_CtxHelp_ID); - else if (ctxType == X_AD_CtxHelp.CTXTYPE_Task) - sql.append(X_AD_Task.COLUMNNAME_AD_CtxHelp_ID); - else if (ctxType == X_AD_CtxHelp.CTXTYPE_Node) - sql.append(X_AD_WF_Node.COLUMNNAME_AD_CtxHelp_ID); - else - sql.append(X_AD_CtxHelp.COLUMNNAME_AD_CtxHelp_ID); - - sql.append(" FROM "); - if (ctxType == X_AD_CtxHelp.CTXTYPE_Tab) - sql.append(X_AD_Tab.Table_Name); - else if (ctxType == X_AD_CtxHelp.CTXTYPE_Process) - sql.append(X_AD_Process.Table_Name); - else if (ctxType == X_AD_CtxHelp.CTXTYPE_Form) - sql.append(X_AD_Form.Table_Name); - else if (ctxType == X_AD_CtxHelp.CTXTYPE_Info) - sql.append(X_AD_InfoWindow.Table_Name); - else if (ctxType == X_AD_CtxHelp.CTXTYPE_Workflow) - sql.append(X_AD_Workflow.Table_Name); - else if (ctxType == X_AD_CtxHelp.CTXTYPE_Task) - sql.append(X_AD_Task.Table_Name); - else if (ctxType == X_AD_CtxHelp.CTXTYPE_Node) - sql.append(X_AD_WF_Node.Table_Name); - else - sql.append(X_AD_CtxHelp.Table_Name); - sql.append(" t, AD_CtxHelp h "); - - sql.append("WHERE t.AD_CtxHelp_ID = h.AD_CtxHelp_ID "); - sql.append("AND t.IsActive = 'Y' "); - sql.append("AND h.IsActive = 'Y' "); - sql.append("AND h.AD_Client_ID IN (0, ?) "); - sql.append("AND h.AD_Org_ID IN (0, ?) "); - - if (ctxType == X_AD_CtxHelp.CTXTYPE_Home) - sql.append("AND h." + X_AD_CtxHelp.COLUMNNAME_CtxType); - else if (ctxType == X_AD_CtxHelp.CTXTYPE_Tab || ctxType == X_AD_CtxHelp.CTXTYPE_Process || - ctxType == X_AD_CtxHelp.CTXTYPE_Form || ctxType == X_AD_CtxHelp.CTXTYPE_Info || - ctxType == X_AD_CtxHelp.CTXTYPE_Workflow || ctxType == X_AD_CtxHelp.CTXTYPE_Task || - ctxType == X_AD_CtxHelp.CTXTYPE_Node) - { - sql.append("AND t."); - if (ctxType == X_AD_CtxHelp.CTXTYPE_Tab) - sql.append(X_AD_Tab.COLUMNNAME_AD_Tab_ID); - else if (ctxType == X_AD_CtxHelp.CTXTYPE_Process) - sql.append(X_AD_Process.COLUMNNAME_AD_Process_ID); - else if (ctxType == X_AD_CtxHelp.CTXTYPE_Form) - sql.append(X_AD_Form.COLUMNNAME_AD_Form_ID); - else if (ctxType == X_AD_CtxHelp.CTXTYPE_Info) - sql.append(X_AD_InfoWindow.COLUMNNAME_AD_InfoWindow_ID); - else if (ctxType == X_AD_CtxHelp.CTXTYPE_Workflow) - sql.append(X_AD_Workflow.COLUMNNAME_AD_Workflow_ID); - else if (ctxType == X_AD_CtxHelp.CTXTYPE_Task) - sql.append(X_AD_Task.COLUMNNAME_AD_Task_ID); - else if (ctxType == X_AD_CtxHelp.CTXTYPE_Node) - sql.append(X_AD_WF_Node.COLUMNNAME_AD_WF_Node_ID); - } - else - sql.append("1"); - sql.append(" = ? "); - sql.append("ORDER BY h.AD_Client_ID DESC, h.AD_Org_ID DESC, h.AD_CtxHelp_ID DESC"); - return DB.getSQLValue(null, sql.toString(), Env.getAD_Client_ID(ctx), Env.getAD_Org_ID(ctx), ctxType == X_AD_CtxHelp.CTXTYPE_Home ? ctxType : recordId); + String retValue = MCtxHelpMsg.get(ctx, ctxType, recordId); + return retValue; } - - private String getCtxHelpMsgList(String ctxType, int recordId) - { - Properties ctx = Env.getCtx(); - - int AD_CtxHelp_ID = getCtxHelpID(ctxType, recordId); - if (AD_CtxHelp_ID > 0) - { - StringBuilder sql = new StringBuilder(); - if (Env.isBaseLanguage(Env.getCtx(), X_AD_CtxHelpMsg.Table_Name)) - { - sql.append("SELECT MsgText "); - sql.append("FROM AD_CtxHelpMsg "); - sql.append("WHERE IsActive = 'Y' "); - sql.append("AND AD_Client_ID IN (0, ?) "); - sql.append("AND AD_Org_ID IN (0, ?) "); - sql.append("AND AD_CtxHelp_ID = ? "); - sql.append("ORDER BY AD_Client_ID DESC, AD_Org_ID DESC, AD_CtxHelpMsg_ID DESC"); - } - else - { - sql.append("SELECT mt.MsgText "); - sql.append("FROM AD_CtxHelpMsg m "); - sql.append("LEFT JOIN AD_CtxHelpMsg_Trl mt ON (mt.AD_CtxHelpMsg_ID = m.AD_CtxHelpMsg_ID AND mt.AD_Language = ?) "); - sql.append("WHERE mt.IsActive = 'Y' "); - sql.append("AND m.AD_Client_ID IN (0, ?) "); - sql.append("AND m.AD_Org_ID IN (0, ?) "); - sql.append("AND m.AD_CtxHelp_ID = ? "); - sql.append("ORDER BY m.AD_Client_ID DESC, m.AD_Org_ID DESC, m.AD_CtxHelpMsg_ID DESC"); - } - - PreparedStatement pstmt = null; - ResultSet rs = null; - - try - { - pstmt = DB.prepareStatement(sql.toString(), null); - int count = 1; - if (!Env.isBaseLanguage(Env.getCtx(), X_AD_CtxHelpMsg.Table_Name)) - pstmt.setString(count++, Env.getAD_Language(Env.getCtx())); - pstmt.setInt(count++, Env.getAD_Client_ID(ctx)); - pstmt.setInt(count++, Env.getAD_Org_ID(ctx)); - pstmt.setInt(count++, AD_CtxHelp_ID); - rs = pstmt.executeQuery(); - if (rs.next()) - return rs.getString(X_AD_CtxHelpMsg.COLUMNNAME_MsgText); - } - catch (Exception e) - { - throw new AdempiereException(e); - } - finally - { - DB.close(rs, pstmt); - rs=null; pstmt=null; - } - } - - return ""; - } - + /** * @param content content * @return masked content or empty string if the content is null From 1eae9f71bcd9d0abe9a218e6343741cefe0daec7 Mon Sep 17 00:00:00 2001 From: Carlos Ruiz Date: Wed, 28 Jan 2015 09:19:37 -0500 Subject: [PATCH 08/20] IDEMPIERE-386 IDEMPIERE-1770 minor - drop unused code and improve order by --- org.adempiere.base/src/org/compiere/model/MInventory.java | 7 ------- .../src/org/compiere/model/MStorageOnHand.java | 2 +- 2 files changed, 1 insertion(+), 8 deletions(-) diff --git a/org.adempiere.base/src/org/compiere/model/MInventory.java b/org.adempiere.base/src/org/compiere/model/MInventory.java index 765f682429..8431080b4b 100644 --- a/org.adempiere.base/src/org/compiere/model/MInventory.java +++ b/org.adempiere.base/src/org/compiere/model/MInventory.java @@ -617,8 +617,6 @@ public class MInventory extends X_M_Inventory implements DocAction if(qtyDiff.compareTo(Env.ZERO)==0) return; - // Check Line - boolean needSave = false; // Attribute Set Instance if (line.getM_AttributeSetInstance_ID() == 0) { @@ -693,11 +691,6 @@ public class MInventory extends X_M_Inventory implements DocAction if (log.isLoggable(Level.FINE)) log.fine("##: " + lineMA); } } // outgoing Trx - - if (needSave) - { - line.saveEx(); - } } // for all lines } // checkMaterialPolicy diff --git a/org.adempiere.base/src/org/compiere/model/MStorageOnHand.java b/org.adempiere.base/src/org/compiere/model/MStorageOnHand.java index 67b4c8b140..997afc20c6 100644 --- a/org.adempiere.base/src/org/compiere/model/MStorageOnHand.java +++ b/org.adempiere.base/src/org/compiere/model/MStorageOnHand.java @@ -375,7 +375,7 @@ public class MStorageOnHand extends X_M_StorageOnHand MProduct product = MProduct.get(Env.getCtx(), M_Product_ID); if(product.isUseGuaranteeDateForMPolicy()){ - sql += "ORDER BY l.PriorityNo DESC, asi.GuaranteeDate"; + sql += "ORDER BY l.PriorityNo DESC, COALESCE(asi.GuaranteeDate,s.DateMaterialPolicy)"; if (!FiFo) sql += " DESC"; } From d7a63afd5493f6c9edf3e61d05f0cec64c932ed6 Mon Sep 17 00:00:00 2001 From: Carlos Ruiz Date: Thu, 29 Jan 2015 08:34:19 -0500 Subject: [PATCH 09/20] IDEMPIERE-2283 Print format - footer hardcoded idempiere instead installation name / based on patch from Nicolas Micoud (nmicoud) --- .../src/org/compiere/model/MSysConfig.java | 3 ++- org.adempiere.base/src/org/compiere/util/Env.java | 9 +++++++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/org.adempiere.base/src/org/compiere/model/MSysConfig.java b/org.adempiere.base/src/org/compiere/model/MSysConfig.java index c8b19c466e..f79f1fb876 100644 --- a/org.adempiere.base/src/org/compiere/model/MSysConfig.java +++ b/org.adempiere.base/src/org/compiere/model/MSysConfig.java @@ -42,7 +42,7 @@ public class MSysConfig extends X_AD_SysConfig /** * */ - private static final long serialVersionUID = -1248226696518701944L; + private static final long serialVersionUID = 7367738851235987225L; public static final String ADDRESS_VALIDATION = "ADDRESS_VALIDATION"; public static final String ALERT_SEND_ATTACHMENT_AS_XLS = "ALERT_SEND_ATTACHMENT_AS_XLS"; @@ -118,6 +118,7 @@ public class MSysConfig extends X_AD_SysConfig public static final String RecentItems_MaxShown = "RecentItems_MaxShown"; public static final String REPORT_SWAP_MAX_ROWS = "REPORT_SWAP_MAX_ROWS"; public static final String SHIPPING_DEFAULT_WEIGHT_PER_PACKAGE = "SHIPPING_DEFAULT_WEIGHT_PER_PACKAGE"; + public static final String STANDARD_REPORT_FOOTER_TRADEMARK_TEXT = "STANDARD_REPORT_FOOTER_TRADEMARK_TEXT"; public static final String START_VALUE_BPLOCATION_NAME = "START_VALUE_BPLOCATION_NAME"; public static final String SWING_LOGIN_ALLOW_REMEMBER_ME = "SWING_LOGIN_ALLOW_REMEMBER_ME"; public static final String SWING_OVERRIDE_TEXT_AREA_BEHAVIOUR = "SWING_OVERRIDE_TEXT_AREA_BEHAVIOUR"; diff --git a/org.adempiere.base/src/org/compiere/util/Env.java b/org.adempiere.base/src/org/compiere/util/Env.java index b62e2ca110..cb16c61577 100644 --- a/org.adempiere.base/src/org/compiere/util/Env.java +++ b/org.adempiere.base/src/org/compiere/util/Env.java @@ -59,6 +59,7 @@ import org.compiere.model.MLookupCache; import org.compiere.model.MQuery; import org.compiere.model.MRole; import org.compiere.model.MSession; +import org.compiere.model.MSysConfig; import org.compiere.model.MTable; import org.compiere.model.MZoomCondition; import org.compiere.model.PO; @@ -1819,8 +1820,12 @@ public final class Env * @return trademark text for standard report footer */ public static String getStandardReportFooterTrademarkText() { - String s = Env.getContext(Env.getCtx(), STANDARD_REPORT_FOOTER_TRADEMARK_TEXT); - return Util.isEmpty(s) ? Adempiere.ADEMPIERE_R : s; + String s = MSysConfig.getValue(MSysConfig.STANDARD_REPORT_FOOTER_TRADEMARK_TEXT, Env.getAD_Client_ID(Env.getCtx())); + if (Util.isEmpty(s)) + s = Env.getContext(Env.getCtx(), STANDARD_REPORT_FOOTER_TRADEMARK_TEXT); + if (Util.isEmpty(s)) + s = Adempiere.ADEMPIERE_R; + return s; } public static int getZoomWindowID(MQuery query) From bfc00ae6a8eedad61bf05015454d741959784489 Mon Sep 17 00:00:00 2001 From: Carlos Ruiz Date: Thu, 29 Jan 2015 08:53:15 -0500 Subject: [PATCH 10/20] IDEMPIERE-2050 Improvement to Menu Lookup / IDEMPIERE-2407 --- migration/i2.1/oracle/201501290852_IDEMPIERE-2050.sql | 11 +++++++++++ .../i2.1/postgresql/201501290852_IDEMPIERE-2050.sql | 8 ++++++++ 2 files changed, 19 insertions(+) create mode 100644 migration/i2.1/oracle/201501290852_IDEMPIERE-2050.sql create mode 100644 migration/i2.1/postgresql/201501290852_IDEMPIERE-2050.sql diff --git a/migration/i2.1/oracle/201501290852_IDEMPIERE-2050.sql b/migration/i2.1/oracle/201501290852_IDEMPIERE-2050.sql new file mode 100644 index 0000000000..ea7f1b0d98 --- /dev/null +++ b/migration/i2.1/oracle/201501290852_IDEMPIERE-2050.sql @@ -0,0 +1,11 @@ +SET SQLBLANKLINES ON +SET DEFINE OFF + +-- 29/01/2015 08:52:11 AM COT +-- IDEMPIERE-2050 Improvement to Menu Lookup +INSERT INTO AD_SysConfig (AD_SysConfig_ID,AD_Client_ID,AD_Org_ID,Created,Updated,CreatedBy,UpdatedBy,IsActive,Name,Value,Description,EntityType,ConfigurationLevel,AD_SysConfig_UU) VALUES (200060,0,0,TO_DATE('2015-01-29 08:52:10','YYYY-MM-DD HH24:MI:SS'),TO_DATE('2015-01-29 08:52:10','YYYY-MM-DD HH24:MI:SS'),100,100,'Y','MAX_RESULTS_PER_SEARCH_IN_DOCUMENT_CONTROLLER','3','Max results in document controller search (IDEMPIERE-2050)','D','C','2342e731-5157-42c3-986b-28ed24862694') +; + +SELECT register_migration_script('201501290852_IDEMPIERE-2050.sql') FROM dual +; + diff --git a/migration/i2.1/postgresql/201501290852_IDEMPIERE-2050.sql b/migration/i2.1/postgresql/201501290852_IDEMPIERE-2050.sql new file mode 100644 index 0000000000..7dcd1d05b9 --- /dev/null +++ b/migration/i2.1/postgresql/201501290852_IDEMPIERE-2050.sql @@ -0,0 +1,8 @@ +-- 29/01/2015 08:52:11 AM COT +-- IDEMPIERE-2050 Improvement to Menu Lookup +INSERT INTO AD_SysConfig (AD_SysConfig_ID,AD_Client_ID,AD_Org_ID,Created,Updated,CreatedBy,UpdatedBy,IsActive,Name,Value,Description,EntityType,ConfigurationLevel,AD_SysConfig_UU) VALUES (200060,0,0,TO_TIMESTAMP('2015-01-29 08:52:10','YYYY-MM-DD HH24:MI:SS'),TO_TIMESTAMP('2015-01-29 08:52:10','YYYY-MM-DD HH24:MI:SS'),100,100,'Y','MAX_RESULTS_PER_SEARCH_IN_DOCUMENT_CONTROLLER','3','Max results in document controller search (IDEMPIERE-2050)','D','C','2342e731-5157-42c3-986b-28ed24862694') +; + +SELECT register_migration_script('201501290852_IDEMPIERE-2050.sql') FROM dual +; + From a75477d81db1591e3fa4f4ac18f29b9dd53c9966 Mon Sep 17 00:00:00 2001 From: Carlos Ruiz Date: Mon, 2 Feb 2015 18:37:33 -0500 Subject: [PATCH 11/20] IDEMPIERE-2229 CSV export/import not working on tables with ad_ref_list / integrate patch from Claudemir Todo Bom (allgood) * improve exporter not taking into account customized fields shown in grid when displaygrid=N * improve the importer to allow zero ID for tables having record ID=0 * FileImportAction showing tip instead of message --- .../adempiere/impexp/GridTabCSVExporter.java | 27 +++++++++---------- .../adempiere/impexp/GridTabCSVImporter.java | 2 +- .../webui/panel/action/FileImportAction.java | 4 +-- 3 files changed, 16 insertions(+), 17 deletions(-) diff --git a/org.adempiere.base/src/org/adempiere/impexp/GridTabCSVExporter.java b/org.adempiere.base/src/org/adempiere/impexp/GridTabCSVExporter.java index 86b86425bc..d0bf8d3c8c 100644 --- a/org.adempiere.base/src/org/adempiere/impexp/GridTabCSVExporter.java +++ b/org.adempiere.base/src/org/adempiere/impexp/GridTabCSVExporter.java @@ -463,11 +463,10 @@ public class GridTabCSVExporter implements IGridTabExporter if (DisplayType.isLookup(column.getAD_Reference_ID())) { // resolve to identifier - search for value first, if not search for name - if not use the ID String foreignTable = column.getReferenceTableName(); - if ( ! ("AD_Language".equals(foreignTable) || "AD_EntityType".equals(foreignTable))) { + if ( ! ("AD_Language".equals(foreignTable) || "AD_EntityType".equals(foreignTable) || "AD_Ref_List".equals(foreignTable))) { MTable fTable = MTable.get(Env.getCtx(), foreignTable); // Hardcoded / do not check for Value on AD_Org, AD_User and AD_Ref_List, must use name for these two tables - if (! ("AD_Org".equals(foreignTable) || "AD_User".equals(foreignTable) || "AD_Ref_List".equals(foreignTable)) - && fTable.getColumn("Value") != null) { + if (! ("AD_Org".equals(foreignTable) || "AD_User".equals(foreignTable)) && fTable.getColumn("Value") != null) { name.append("[Value]"); // fully qualified } else if (fTable.getColumn("Name") != null) { name.append("[Name]"); @@ -540,17 +539,17 @@ public class GridTabCSVExporter implements IGridTabExporter int AD_Field_ID = Integer.parseInt(fieldIdStr); for (GridField gridField : tmpFields) { - if ( gridField.isVirtualColumn() - || gridField.isEncrypted() - || gridField.isEncryptedColumn() - || !(gridField.isDisplayed() || gridField.isDisplayedGrid())) - continue; - - if (gridField.getAD_Field_ID() == AD_Field_ID) - { - if (!gridField.isReadOnly() && gridField.isDisplayedGrid() && !(DisplayType.Button == MColumn.get(Env.getCtx(),gridField.getAD_Column_ID()).getAD_Reference_ID())) - fieldList.add(gridField); - + if (gridField.getAD_Field_ID() == AD_Field_ID) { + if ( gridField.isVirtualColumn() + || gridField.isEncrypted() + || gridField.isEncryptedColumn() + || !(gridField.isDisplayed() || gridField.isDisplayedGrid()) + || gridField.isReadOnly() + || (DisplayType.Button == MColumn.get(Env.getCtx(),gridField.getAD_Column_ID()).getAD_Reference_ID()) + ) + continue; + + fieldList.add(gridField); break; } } diff --git a/org.adempiere.base/src/org/adempiere/impexp/GridTabCSVImporter.java b/org.adempiere.base/src/org/adempiere/impexp/GridTabCSVImporter.java index 04c0deb397..5314bbdb48 100644 --- a/org.adempiere.base/src/org/adempiere/impexp/GridTabCSVImporter.java +++ b/org.adempiere.base/src/org/adempiere/impexp/GridTabCSVImporter.java @@ -866,7 +866,7 @@ public class GridTabCSVImporter implements IGridTabImporter if(value == null) continue; - if(columnName.endsWith("_ID") && "0".equals(value)) + if (columnName.endsWith("_ID") && "0".equals(value) && ! MTable.isZeroIDTable(gridTab.getTableName())) continue; boolean isKeyColumn= columnName.indexOf("/") > 0; diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/panel/action/FileImportAction.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/panel/action/FileImportAction.java index 5ebfb85a30..f0ebe7ccef 100644 --- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/panel/action/FileImportAction.java +++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/panel/action/FileImportAction.java @@ -185,13 +185,13 @@ public class FileImportAction implements EventListener Row row = new Row(); rows.appendChild(row); - row.appendChild(new Label(Msg.getMsg(Env.getCtx(), "FilesOfType"))); + row.appendChild(new Label(Msg.getMsg(Env.getCtx(), "FilesOfType", true))); row.appendChild(cboType); cboType.setHflex("1"); row = new Row(); rows.appendChild(row); - row.appendChild(new Label(Msg.getMsg(Env.getCtx(), "Charset", false) + ": ")); + row.appendChild(new Label(Msg.getMsg(Env.getCtx(), "Charset", true) + ": ")); fCharset.setMold("select"); fCharset.setRows(0); fCharset.setTooltiptext(Msg.getMsg(Env.getCtx(), "Charset", false)); From 833c03ddc0123359166ecdeda20ff292895bea55 Mon Sep 17 00:00:00 2001 From: Carlos Ruiz Date: Wed, 4 Feb 2015 10:16:19 -0500 Subject: [PATCH 12/20] IDEMPIERE-2447 Migration script from packin adding unnecessary updates --- .../src/org/compiere/dbPort/Convert.java | 12 ++++++------ .../src/org/adempiere/pipo2/PoFiller.java | 8 +++++--- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/org.adempiere.base/src/org/compiere/dbPort/Convert.java b/org.adempiere.base/src/org/compiere/dbPort/Convert.java index 9b314fe0f8..eec01ba7b0 100644 --- a/org.adempiere.base/src/org/compiere/dbPort/Convert.java +++ b/org.adempiere.base/src/org/compiere/dbPort/Convert.java @@ -577,12 +577,6 @@ public abstract class Convert prm_COMMENT = MSysConfig.getValue(MSysConfig.PROJECT_ID_COMMENTS); else prm_COMMENT = MSysConfig.getValue(MSysConfig.DICTIONARY_ID_COMMENTS); - // log time and date - SimpleDateFormat format = DisplayType.getDateFormat(DisplayType.DateTime); - String dateTimeText = format.format(new Timestamp(System.currentTimeMillis())); - w.append("-- "); - w.append(dateTimeText); - w.append("\n"); if (prm_COMMENT != null && ! m_oldprm_COMMENT.equals(prm_COMMENT)) { // log sysconfig comment w.append("-- "); @@ -591,6 +585,12 @@ public abstract class Convert if (w == writerPg) m_oldprm_COMMENT = prm_COMMENT; } + // log time and date + SimpleDateFormat format = DisplayType.getDateFormat(DisplayType.DateTime); + String dateTimeText = format.format(new Timestamp(System.currentTimeMillis())); + w.append("-- "); + w.append(dateTimeText); + w.append("\n"); // log statement w.append(statement); // close statement diff --git a/org.adempiere.pipo/src/org/adempiere/pipo2/PoFiller.java b/org.adempiere.pipo/src/org/adempiere/pipo2/PoFiller.java index f69f718da3..39f4d16b35 100644 --- a/org.adempiere.pipo/src/org/adempiere/pipo2/PoFiller.java +++ b/org.adempiere.pipo/src/org/adempiere/pipo2/PoFiller.java @@ -195,14 +195,16 @@ public class PoFiller{ String sAD_Client_ID = clientElement != null ? clientElement.contents.toString() : null; if (sAD_Client_ID != null && sAD_Client_ID.equals("0")) { - po.set_ValueNoCheck("AD_Client_ID", 0); - po.setAD_Org_ID(0); + if (po.getAD_Client_ID() != 0) + po.set_ValueNoCheck("AD_Client_ID", 0); + if (po.getAD_Org_ID() != 0) + po.setAD_Org_ID(0); } else { Element orgElement = element.properties.get("AD_Org_ID"); String sAD_Org_ID = orgElement != null ? orgElement.contents.toString() : null; - if (sAD_Org_ID != null && sAD_Org_ID.equals("0")) + if (sAD_Org_ID != null && sAD_Org_ID.equals("0") && po.getAD_Org_ID() != 0) po.setAD_Org_ID(0); else if (sAD_Org_ID != null && sAD_Org_ID.equals("@AD_Org_ID@")) po.setAD_Org_ID(Env.getAD_Org_ID(ctx.ctx)); From 7338f2958fd71a596bacec97474cf3f41a95983d Mon Sep 17 00:00:00 2001 From: Nicolas Micoud Date: Wed, 4 Feb 2015 10:20:02 -0500 Subject: [PATCH 13/20] IDEMPIERE-2430 MConversionRate.getRate should retrieve only active rates --- org.adempiere.base/src/org/compiere/model/MConversionRate.java | 1 + 1 file changed, 1 insertion(+) diff --git a/org.adempiere.base/src/org/compiere/model/MConversionRate.java b/org.adempiere.base/src/org/compiere/model/MConversionRate.java index 9c2874da9e..e3b81bfb02 100644 --- a/org.adempiere.base/src/org/compiere/model/MConversionRate.java +++ b/org.adempiere.base/src/org/compiere/model/MConversionRate.java @@ -222,6 +222,7 @@ public class MConversionRate extends X_C_Conversion_Rate + " AND ? BETWEEN ValidFrom AND ValidTo" // #4 TRUNC (?) ORA-00932: inconsistent datatypes: expected NUMBER got TIMESTAMP + " AND AD_Client_ID IN (0,?)" // #5 + " AND AD_Org_ID IN (0,?) " // #6 + + " AND IsActive = 'Y' " + "ORDER BY AD_Client_ID DESC, AD_Org_ID DESC, ValidFrom DESC"; BigDecimal retValue = null; PreparedStatement pstmt = null; From 62e7adb3bfe0e7ba82f0648189494ff766e82b99 Mon Sep 17 00:00:00 2001 From: Carlos Ruiz Date: Wed, 4 Feb 2015 10:57:18 -0500 Subject: [PATCH 14/20] IDEMPIERE-2449 Could not invoke Toolbar listener method: onSave - NPE on GridTab.fireDataStatusChanged --- org.adempiere.base/src/org/compiere/model/GridTab.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/org.adempiere.base/src/org/compiere/model/GridTab.java b/org.adempiere.base/src/org/compiere/model/GridTab.java index d5dbd16dcc..07c2a0c33e 100644 --- a/org.adempiere.base/src/org/compiere/model/GridTab.java +++ b/org.adempiere.base/src/org/compiere/model/GridTab.java @@ -182,7 +182,7 @@ public class GridTab implements DataStatusListener, Evaluatee, Serializable /** A list of event listeners for this component. */ protected EventListenerList m_listenerList = new EventListenerList(); /** Current Data Status Event */ - private DataStatusEvent m_DataStatusEvent = null; + private volatile DataStatusEvent m_DataStatusEvent = null; /** Query */ private MQuery m_query = new MQuery(); private String m_oldQuery = "0=9"; @@ -2346,6 +2346,10 @@ public class GridTab implements DataStatusListener, Evaluatee, Serializable */ private void fireDataStatusChanged (DataStatusEvent e) { + if (e == null) { + log.warning("IDEMPIERE-2449 - event must not arrive null here -> " + Thread.currentThread().getStackTrace()); + return; // avoid NPE below + } DataStatusListener[] listeners = m_listenerList.getListeners(DataStatusListener.class); if (listeners.length == 0) return; From 80c885c5b4006a594a2510630b4c4f39b8f01239 Mon Sep 17 00:00:00 2001 From: Carlos Ruiz Date: Wed, 4 Feb 2015 10:58:04 -0500 Subject: [PATCH 15/20] IDEMPIERE-2283 Print format - footer hardcoded idempiere instead installation name / integrate patch from Nicolas Micoud (nmicoud) --- .../src/org/compiere/model/MSysConfig.java | 4 +++- .../org/compiere/print/layout/LayoutEngine.java | 14 ++++++++++++-- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/org.adempiere.base/src/org/compiere/model/MSysConfig.java b/org.adempiere.base/src/org/compiere/model/MSysConfig.java index f79f1fb876..70cb6bb958 100644 --- a/org.adempiere.base/src/org/compiere/model/MSysConfig.java +++ b/org.adempiere.base/src/org/compiere/model/MSysConfig.java @@ -42,7 +42,7 @@ public class MSysConfig extends X_AD_SysConfig /** * */ - private static final long serialVersionUID = 7367738851235987225L; + private static final long serialVersionUID = 6107779915945715515L; public static final String ADDRESS_VALIDATION = "ADDRESS_VALIDATION"; public static final String ALERT_SEND_ATTACHMENT_AS_XLS = "ALERT_SEND_ATTACHMENT_AS_XLS"; @@ -143,6 +143,8 @@ public class MSysConfig extends X_AD_SysConfig public static final String ZK_DASHBOARD_REFRESH_INTERVAL = "ZK_DASHBOARD_REFRESH_INTERVAL"; public static final String ZK_DECIMALBOX_PROCESS_DOTKEYPAD = "ZK_DECIMALBOX_PROCESS_DOTKEYPAD"; public static final String ZK_DESKTOP_CLASS = "ZK_DESKTOP_CLASS"; + public static final String ZK_FOOTER_SERVER_DATETIME_FORMAT = "ZK_FOOTER_SERVER_DATETIME_FORMAT"; + public static final String ZK_FOOTER_SERVER_MSG = "ZK_FOOTER_SERVER_MSG"; public static final String ZK_GRID_EDIT_MODELESS = "ZK_GRID_EDIT_MODELESS"; public static final String ZK_LOGIN_ALLOW_REMEMBER_ME = "ZK_LOGIN_ALLOW_REMEMBER_ME"; public static final String ZK_LOGO_LARGE = "ZK_LOGO_LARGE"; diff --git a/org.adempiere.base/src/org/compiere/print/layout/LayoutEngine.java b/org.adempiere.base/src/org/compiere/print/layout/LayoutEngine.java index aad77cff3e..300bfb287e 100644 --- a/org.adempiere.base/src/org/compiere/print/layout/LayoutEngine.java +++ b/org.adempiere.base/src/org/compiere/print/layout/LayoutEngine.java @@ -37,6 +37,7 @@ import java.io.Reader; import java.io.Serializable; import java.net.URL; import java.sql.Timestamp; +import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.HashMap; import java.util.Properties; @@ -48,6 +49,7 @@ import javax.print.attribute.DocAttributeSet; import org.compiere.model.MClientInfo; import org.compiere.model.MQuery; +import org.compiere.model.MSysConfig; import org.compiere.model.MTable; import org.compiere.model.PrintInfo; import org.compiere.print.ArchiveEngine; @@ -70,6 +72,7 @@ import org.compiere.util.Env; import org.compiere.util.KeyNamePair; import org.compiere.util.Msg; import org.compiere.util.NamePair; +import org.compiere.util.Util; import org.compiere.util.ValueNamePair; /** @@ -969,12 +972,19 @@ public class LayoutEngine implements Pageable, Printable, Doc element.setLocation(ft); m_headerFooter.addElement(element); // - element = new StringElement("@*Header@", font, color, null, true); + String s = MSysConfig.getValue(MSysConfig.ZK_FOOTER_SERVER_MSG, "@*Header@", Env.getAD_Client_ID(Env.getCtx())); + element = new StringElement(s, font, color, null, true); element.layout (m_footer.width, 0, true, MPrintFormatItem.FIELDALIGNMENTTYPE_Center); element.setLocation(ft); m_headerFooter.addElement(element); // - element = new StringElement("@*CurrentDateTime@", font, color, null, true); + String timestamp = ""; + s = MSysConfig.getValue(MSysConfig.ZK_FOOTER_SERVER_DATETIME_FORMAT, Env.getAD_Client_ID(Env.getCtx())); + if (!Util.isEmpty(s)) + timestamp = new SimpleDateFormat(s).format(System.currentTimeMillis()); + else + timestamp = "@*CurrentDateTime@"; + element = new StringElement(timestamp, font, color, null, true); element.layout (m_footer.width, 0, true, MPrintFormatItem.FIELDALIGNMENTTYPE_TrailingRight); element.setLocation(ft); m_headerFooter.addElement(element); From 1e9681173a2cce3c7c820301524efdb88eac93fb Mon Sep 17 00:00:00 2001 From: Carlos Ruiz Date: Wed, 4 Feb 2015 11:02:34 -0500 Subject: [PATCH 16/20] IDEMPIERE-2435 Open Balance is wrong calculated with payment selection --- org.adempiere.base/src/org/compiere/model/MPayment.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/org.adempiere.base/src/org/compiere/model/MPayment.java b/org.adempiere.base/src/org/compiere/model/MPayment.java index 11225b5447..2d4edd1cd4 100644 --- a/org.adempiere.base/src/org/compiere/model/MPayment.java +++ b/org.adempiere.base/src/org/compiere/model/MPayment.java @@ -1957,13 +1957,14 @@ public class MPayment extends X_C_Payment if (log.isLoggable(Level.INFO)) log.info(toString()); // Charge Handling + boolean createdAllocationRecords = false; if (getC_Charge_ID() != 0) { setIsAllocated(true); } else { - allocateIt(); // Create Allocation Records + createdAllocationRecords = allocateIt(); // Create Allocation Records testAllocation(); } @@ -1973,7 +1974,7 @@ public class MPayment extends X_C_Payment // MProject project = new MProject(getCtx(), getC_Project_ID()); } // Update BP for Prepayments - if (getC_BPartner_ID() != 0 && getC_Invoice_ID() == 0 && getC_Charge_ID() == 0 && MPaymentAllocate.get(this).length == 0) + if (getC_BPartner_ID() != 0 && getC_Invoice_ID() == 0 && getC_Charge_ID() == 0 && MPaymentAllocate.get(this).length == 0 && !createdAllocationRecords) { MBPartner bp = new MBPartner (getCtx(), getC_BPartner_ID(), get_TrxName()); DB.getDatabase().forUpdate(bp, 0); From 56ee761d61f2bb770a032a101cb4d62858573f7b Mon Sep 17 00:00:00 2001 From: Nicolas Micoud Date: Wed, 4 Feb 2015 11:10:03 -0500 Subject: [PATCH 17/20] IDEMPIERE-2448 Hardcoded values in WRC3SortCriteriaPanel --- .../org/adempiere/webui/panel/WRC3SortCriteriaPanel.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/panel/WRC3SortCriteriaPanel.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/panel/WRC3SortCriteriaPanel.java index 8d56a2bbf0..d630ec55fc 100644 --- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/panel/WRC3SortCriteriaPanel.java +++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/panel/WRC3SortCriteriaPanel.java @@ -30,7 +30,9 @@ import org.adempiere.webui.component.Listbox; import org.adempiere.webui.component.SimpleListModel; import org.adempiere.webui.theme.ThemeManager; import org.compiere.print.MPrintFormatItem; +import org.compiere.util.Env; import org.compiere.util.KeyNamePair; +import org.compiere.util.Msg; import org.compiere.util.NamePair; import org.zkoss.zk.au.out.AuFocus; import org.zkoss.zk.ui.event.DropEvent; @@ -39,7 +41,6 @@ import org.zkoss.zk.ui.event.EventListener; import org.zkoss.zk.ui.event.Events; import org.zkoss.zk.ui.util.Clients; import org.zkoss.zul.Hlayout; - import org.zkoss.zul.Vbox; public class WRC3SortCriteriaPanel extends WRCTabPanel implements EventListener @@ -47,7 +48,7 @@ public class WRC3SortCriteriaPanel extends WRCTabPanel implements EventListener /** * */ - private static final long serialVersionUID = -2798618953887598651L; + private static final long serialVersionUID = -3178046711328450398L; // UI variables private Label noLabel = new Label(); @@ -71,8 +72,8 @@ public class WRC3SortCriteriaPanel extends WRCTabPanel implements EventListener public void init() { // - noLabel.setValue("Available"); - yesLabel.setValue("Order By"); + noLabel.setValue(Msg.getMsg(Env.getCtx(), "Available")); + yesLabel.setValue(Msg.getMsg(Env.getCtx(), "OrderBy")); yesList.setVflex(true); noList.setVflex(true); From c8004908e445adb63a54b014475ea719c22c2228 Mon Sep 17 00:00:00 2001 From: hieplq Date: Mon, 2 Feb 2015 15:47:14 +0700 Subject: [PATCH 18/20] IDEMPIERE-2112:improve shortcuts for master detail data entry windows fix esc key handle --- .../src/org/adempiere/webui/panel/InfoPanel.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/panel/InfoPanel.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/panel/InfoPanel.java index db8f57b446..9bea87bc00 100644 --- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/panel/InfoPanel.java +++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/panel/InfoPanel.java @@ -206,7 +206,7 @@ public abstract class InfoPanel extends Window implements EventListener, infoWindow = MInfoWindow.get(p_keyColumn.replace("_ID", ""), null); addEventListener(WindowContainer.ON_WINDOW_CONTAINER_SELECTION_CHANGED_EVENT, this); addEventListener(ON_RUN_PROCESS, this); - + } // InfoPanel private void init() @@ -249,7 +249,8 @@ public abstract class InfoPanel extends Window implements EventListener, this.setMaximizable(true); this.addEventListener(Events.ON_OK, this); - + if (isLookup()) + addEventListener(Events.ON_CANCEL, this); contentPanel.setOddRowSclass(null); // contentPanel.setSizedByContent(true); contentPanel.setWidgetAttribute(AdempiereWebUI.WIDGET_INSTANCE_NAME, "infoListbox"); @@ -1374,6 +1375,9 @@ public abstract class InfoPanel extends Window implements EventListener, // do nothing when parameter not change and at window mode, or at dialog mode but select non record onOk(); } + }else if (event.getName().equals(Events.ON_CANCEL)){ + m_cancel = true; + dispose(false); } //when user push enter keyboard at input parameter field else @@ -1395,10 +1399,6 @@ public abstract class InfoPanel extends Window implements EventListener, } } else if (keyEvent.getKeyCode() == VK_ENTER) { // Enter // do nothing, let on_ok at infoWindo do, at this is too soon to get value from control, it's not bind - } else if (keyEvent.getKeyCode() == VK_ESCAPE) { // Escape - // Escape for cancel - m_cancel = true; - dispose(false); } } From 050d1ccba067fc45a5219e8380a92aeea3eb5104 Mon Sep 17 00:00:00 2001 From: hieplq Date: Tue, 3 Feb 2015 12:52:52 +0700 Subject: [PATCH 19/20] IDEMPIERE-1492:when login with Organization = *, run "Bank Transfer" make error "Fill mandatory fields: : Organization" mistake when set convertType for payment to --- org.adempiere.base/src/org/eevolution/process/BankTransfer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/org.adempiere.base/src/org/eevolution/process/BankTransfer.java b/org.adempiere.base/src/org/eevolution/process/BankTransfer.java index a282f690d7..83374c1f7f 100644 --- a/org.adempiere.base/src/org/eevolution/process/BankTransfer.java +++ b/org.adempiere.base/src/org/eevolution/process/BankTransfer.java @@ -189,7 +189,7 @@ public class BankTransfer extends SvrProcess paymentBankTo.setC_BPartner_ID (p_C_BPartner_ID); paymentBankTo.setC_Currency_ID(p_C_Currency_ID); if (p_C_ConversionType_ID > 0) - paymentBankFrom.setC_ConversionType_ID(p_C_ConversionType_ID); + paymentBankTo.setC_ConversionType_ID(p_C_ConversionType_ID); paymentBankTo.setPayAmt(p_Amount); paymentBankTo.setOverUnderAmt(Env.ZERO); paymentBankTo.setC_DocType_ID(true); From a003c8317726b9290aa690cbd97cbc85af212839 Mon Sep 17 00:00:00 2001 From: Carlos Ruiz Date: Wed, 4 Feb 2015 11:38:55 -0500 Subject: [PATCH 20/20] IDEMPIERE-1616 reversing of reconciled payments makes database inconsistent --- org.adempiere.base/src/org/compiere/model/MPayment.java | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/org.adempiere.base/src/org/compiere/model/MPayment.java b/org.adempiere.base/src/org/compiere/model/MPayment.java index 2d4edd1cd4..74958be833 100644 --- a/org.adempiere.base/src/org/compiere/model/MPayment.java +++ b/org.adempiere.base/src/org/compiere/model/MPayment.java @@ -2599,9 +2599,6 @@ public class MPayment extends X_C_Payment } MPeriod.testPeriodOpen(getCtx(), dateAcct, getC_DocType_ID(), getAD_Org_ID()); - // Auto Reconcile if not on Bank Statement - boolean reconciled = getC_BankStatementLine_ID() == 0; //AZ Goodwill - // Create Reversal MPayment reversal = new MPayment (getCtx(), 0, get_TrxName()); copyValues(this, reversal); @@ -2620,7 +2617,7 @@ public class MPayment extends X_C_Payment reversal.setOverUnderAmt(getOverUnderAmt().negate()); // reversal.setIsAllocated(true); - reversal.setIsReconciled(reconciled); // to put on bank statement + reversal.setIsReconciled(false); reversal.setIsOnline(false); reversal.setIsApproved(true); reversal.setR_PnRef(null); @@ -2650,7 +2647,6 @@ public class MPayment extends X_C_Payment // Unlink & De-Allocate deAllocate(accrual); - setIsReconciled (reconciled); setIsAllocated (true); // the allocation below is overwritten // Set Status addDescription("(" + reversal.getDocumentNo() + "<-)");