diff --git a/migration/i1.0b-release/oracle/20130612122145_IDEMPIERE-974.sql b/migration/i1.0b-release/oracle/20130612122145_IDEMPIERE-974.sql new file mode 100644 index 0000000000..14addc1020 --- /dev/null +++ b/migration/i1.0b-release/oracle/20130612122145_IDEMPIERE-974.sql @@ -0,0 +1,12 @@ +-- Jun 12, 2013 12:21:45 PM COT +-- IDEMPIERE-974 Issue with Quick Entry editor when a checkbox is added and a new record is created +INSERT INTO AD_Message (MsgType,MsgText,AD_Message_ID,EntityType,AD_Message_UU,Value,IsActive,Updated,CreatedBy,UpdatedBy,AD_Org_ID,Created,AD_Client_ID) VALUES ('I','Fill Minimum Information of:',200180,'D','03c360e6-3cdb-4058-818f-260e3aeff485','FillMinimumlInfo','Y',TO_DATE('2013-06-12 12:21:42','YYYY-MM-DD HH24:MI:SS'),100,100,0,TO_DATE('2013-06-12 12:21:42','YYYY-MM-DD HH24:MI:SS'),0) +; + +-- Jun 12, 2013 12:21:45 PM COT +-- IDEMPIERE-974 Issue with Quick Entry editor when a checkbox is added and a new record is created +INSERT INTO AD_Message_Trl (AD_Language,AD_Message_ID, MsgText,MsgTip, IsTranslated,AD_Client_ID,AD_Org_ID,Created,Createdby,Updated,UpdatedBy,AD_Message_Trl_UU ) SELECT l.AD_Language,t.AD_Message_ID, t.MsgText,t.MsgTip, 'N',t.AD_Client_ID,t.AD_Org_ID,t.Created,t.Createdby,t.Updated,t.UpdatedBy,Generate_UUID() FROM AD_Language l, AD_Message t WHERE l.IsActive='Y' AND l.IsSystemLanguage='Y' AND l.IsBaseLanguage='N' AND t.AD_Message_ID=200180 AND NOT EXISTS (SELECT * FROM AD_Message_Trl tt WHERE tt.AD_Language=l.AD_Language AND tt.AD_Message_ID=t.AD_Message_ID) +; + +SELECT register_migration_script('20130612122145_IDEMPIERE-974.sql') FROM dual +; diff --git a/migration/i1.0b-release/postgresql/20130612122145_IDEMPIERE-974.sql b/migration/i1.0b-release/postgresql/20130612122145_IDEMPIERE-974.sql new file mode 100644 index 0000000000..1f08c4a2fd --- /dev/null +++ b/migration/i1.0b-release/postgresql/20130612122145_IDEMPIERE-974.sql @@ -0,0 +1,13 @@ +-- Jun 12, 2013 12:21:45 PM COT +-- IDEMPIERE-974 Issue with Quick Entry editor when a checkbox is added and a new record is created +INSERT INTO AD_Message (MsgType,MsgText,AD_Message_ID,EntityType,AD_Message_UU,Value,IsActive,Updated,CreatedBy,UpdatedBy,AD_Org_ID,Created,AD_Client_ID) VALUES ('I','Fill Minimum Information of:',200180,'D','03c360e6-3cdb-4058-818f-260e3aeff485','FillMinimumlInfo','Y',TO_TIMESTAMP('2013-06-12 12:21:42','YYYY-MM-DD HH24:MI:SS'),100,100,0,TO_TIMESTAMP('2013-06-12 12:21:42','YYYY-MM-DD HH24:MI:SS'),0) +; + +-- Jun 12, 2013 12:21:45 PM COT +-- IDEMPIERE-974 Issue with Quick Entry editor when a checkbox is added and a new record is created +INSERT INTO AD_Message_Trl (AD_Language,AD_Message_ID, MsgText,MsgTip, IsTranslated,AD_Client_ID,AD_Org_ID,Created,Createdby,Updated,UpdatedBy,AD_Message_Trl_UU ) SELECT l.AD_Language,t.AD_Message_ID, t.MsgText,t.MsgTip, 'N',t.AD_Client_ID,t.AD_Org_ID,t.Created,t.Createdby,t.Updated,t.UpdatedBy,Generate_UUID() FROM AD_Language l, AD_Message t WHERE l.IsActive='Y' AND l.IsSystemLanguage='Y' AND l.IsBaseLanguage='N' AND t.AD_Message_ID=200180 AND NOT EXISTS (SELECT * FROM AD_Message_Trl tt WHERE tt.AD_Language=l.AD_Language AND tt.AD_Message_ID=t.AD_Message_ID) +; + +SELECT register_migration_script('20130612122145_IDEMPIERE-974.sql') FROM dual +; + diff --git a/org.adempiere.base/src/org/compiere/model/GridField.java b/org.adempiere.base/src/org/compiere/model/GridField.java index b4b281a41e..0795655642 100644 --- a/org.adempiere.base/src/org/compiere/model/GridField.java +++ b/org.adempiere.base/src/org/compiere/model/GridField.java @@ -348,7 +348,7 @@ public class GridField return false; // Numeric Keys and Created/Updated as well as - // DocumentNo/Value/ASI ars not mandatory (persistency layer manages them) + // DocumentNo/Value/ASI are not mandatory (persistence layer manages them) if (m_gridTab != null && // if gridtab doesn't exist then it's not a window field (probably a process parameter field) ( (m_vo.IsKey && m_vo.ColumnName.endsWith("_ID")) || m_vo.ColumnName.startsWith("Created") || m_vo.ColumnName.startsWith("Updated") diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/adwindow/ADTabpanel.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/adwindow/ADTabpanel.java index 78cf925f4e..c73227f84d 100644 --- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/adwindow/ADTabpanel.java +++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/adwindow/ADTabpanel.java @@ -601,9 +601,19 @@ DataStatusListener, IADTabpanel, IdSpace, IFieldEditorContainer //create tree if (gridTab.isTreeTab() && treePanel != null) { - int AD_Tree_ID = MTree.getDefaultAD_Tree_ID ( - Env.getAD_Client_ID(Env.getCtx()), gridTab.getKeyColumnName()); - treePanel.initTree(AD_Tree_ID, windowNo); + int AD_Tree_ID = Env.getContextAsInt (Env.getCtx(), getWindowNo(), "AD_Tree_ID", true); + int AD_Tree_ID_Default = MTree.getDefaultAD_Tree_ID (Env.getAD_Client_ID(Env.getCtx()), gridTab.getKeyColumnName()); + if (gridTab.getRecord_ID() >= 0) { + if (AD_Tree_ID != 0) { + treePanel.initTree(AD_Tree_ID, windowNo); + setSelectedNode(gridTab.getRecord_ID()); + } else if (AD_Tree_ID_Default != 0) { + treePanel.initTree(AD_Tree_ID_Default, windowNo); + setSelectedNode(gridTab.getRecord_ID()); + } + } else { + treePanel.getTree().clear(); + } } if (!gridTab.isSingleRow() && !isGridView()) @@ -1155,19 +1165,65 @@ DataStatusListener, IADTabpanel, IdSpace, IFieldEditorContainer createUI(); dynamicDisplay(col); - //sync tree - if (treePanel != null) { + //sync tree + if (treePanel != null) + { if ("Deleted".equalsIgnoreCase(e.getAD_Message())) - if (e.Record_ID != null - && e.Record_ID instanceof Integer - && ((Integer)e.Record_ID != gridTab.getRecord_ID())) + { + if (e.Record_ID != null && e.Record_ID instanceof Integer && ((Integer)e.Record_ID != gridTab.getRecord_ID())) deleteNode((Integer)e.Record_ID); else setSelectedNode(gridTab.getRecord_ID()); - else - setSelectedNode(gridTab.getRecord_ID()); + } + else if (!e.isInserting()) + { + boolean refresh=true; + Treeitem item = treePanel.getTree().getSelectedItem(); + if (item != null) + { + @SuppressWarnings("unchecked") + MTreeNode treeNode = ((DefaultTreeNode) item.getValue()).getData(); + if (treeNode.getNode_ID() == gridTab.getRecord_ID()){ + setSelectedNode(gridTab.getRecord_ID()); + refresh = false; + } + } + + if (refresh) + { + int AD_Tree_ID = Env.getContextAsInt (Env.getCtx(), getWindowNo(), "AD_Tree_ID", true); + if (gridTab.getRecord_ID()>=0) + { + if (AD_Tree_ID != 0) + { + treePanel.initTree(AD_Tree_ID, windowNo); + setSelectedNode(gridTab.getRecord_ID()); + } + else + { + AD_Tree_ID = MTree.getDefaultAD_Tree_ID (Env.getAD_Client_ID(Env.getCtx()), gridTab.getKeyColumnName()); + treePanel.initTree(AD_Tree_ID, windowNo); + } + } + else + { + treePanel.getTree().clear(); + } + } + + }else if(e.isInserting() && gridTab.getRecord_ID() < 0 && gridTab.getTabLevel() > 0 ) + { + int AD_Tree_ID = Integer.parseInt(gridTab.getParentTab().getValue("AD_Tree_ID").toString()); + MTreeNode root = new MTree (Env.getCtx(), AD_Tree_ID, true, true, null).getRoot(); + SimpleTreeModel treeModel = SimpleTreeModel.createFrom(root); + try { + treePanel.getTree().setItemRenderer(treeModel); + treePanel.getTree().setModel(treeModel); + } catch (Exception treeExc) { + logger.log(Level.SEVERE, "Failed to setup tree"); + } + } } - if (listPanel.isVisible()) { listPanel.updateListIndex(); listPanel.dynamicDisplay(col); @@ -1242,12 +1298,20 @@ DataStatusListener, IADTabpanel, IdSpace, IFieldEditorContainer } } - Boolean summary = (Boolean) gridTab.getValue("IsSummary"); - if (summary != null && !summary.booleanValue() == data.isSummary()) { + Object summaryobj = gridTab.getValue("IsSummary"); + boolean summary = false; + if (summaryobj != null) { + if (summaryobj instanceof Boolean) { + summary = ((Boolean)summaryobj).booleanValue(); + } else { + summary = "Y".equals(summaryobj.toString()); + } + } + if (summary != data.isSummary()) { data.setSummary(summary); changed = true; } - + if (changed) { treeNode.setData(data); } diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/adwindow/DetailPane.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/adwindow/DetailPane.java index 5b8bfa6a65..a09a61d695 100644 --- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/adwindow/DetailPane.java +++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/adwindow/DetailPane.java @@ -460,8 +460,7 @@ public class DetailPane extends Panel implements EventListener, IdSpace { Boolean error = (Boolean) messageContainer.getAttribute(STATUS_ERROR_ATTRIBUTE); String status = (String) messageContainer.getAttribute(STATUS_TEXT_ATTRIBUTE); - createPopupContent(status); - showPopup(error, messageContainer); + showPopup(error, status); } else if (event.getName().equals(ADTabpanel.ON_DYNAMIC_DISPLAY_EVENT)) { if (LayoutUtils.isReallyVisible(this)) updateProcessToolbar(); @@ -483,8 +482,8 @@ public class DetailPane extends Panel implements EventListener, IdSpace { msgPopupCnt.appendChild(t); } - private void showPopup(boolean error, Component messageContainer) { - LayoutUtils.openOverlappedWindow(messageContainer, msgPopup, "overlap_end"); + private void showPopup(boolean error, String msg) { + Clients.showNotification(buildNotificationText(msg), "error", findTabpanel(this), "at_pointer", 3500, true); } private void createPopup() { diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/component/SimpleTreeModel.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/component/SimpleTreeModel.java index 134ed8ef82..fcf0857c53 100644 --- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/component/SimpleTreeModel.java +++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/component/SimpleTreeModel.java @@ -81,11 +81,16 @@ public class SimpleTreeModel extends org.zkoss.zul.DefaultTreeModel impl SimpleTreeModel treeModel = SimpleTreeModel.createFrom(root); treeModel.setItemDraggable(true); treeModel.addOnDropEventListener(new ADTreeOnDropListener(tree, treeModel, vTree, windowNo)); - - Treecols treeCols = new Treecols(); - tree.appendChild(treeCols); - Treecol treeCol = new Treecol(); - treeCols.appendChild(treeCol); + + if (tree.getTreecols() == null) + { + Treecols treeCols = new Treecols(); + tree.getTreecols(); + tree.appendChild(treeCols); + Treecol treeCol = new Treecol(); + treeCols.appendChild(treeCol); + } + tree.setPageSize(-1); try { tree.setItemRenderer(treeModel); diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/grid/WQuickEntry.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/grid/WQuickEntry.java index 3d2ad55fd4..0017192e8b 100644 --- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/grid/WQuickEntry.java +++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/grid/WQuickEntry.java @@ -324,11 +324,14 @@ public class WQuickEntry extends Window implements EventListener, ValueCh int parentID = 0; String parentColumn = null; + String tabZeroName=null; + boolean isParentSave = (getRecord_ID() > 0); for (int idxt = 0; idxt < quickTabs.size(); idxt++) { GridTab gridtab = quickTabs.get(idxt); PO po = quickPOs.get(idxt); if (idxt == 0) { parentColumn = gridtab.getTableName() + "_ID"; + tabZeroName=gridtab.getName(); } boolean savePO = false; @@ -346,7 +349,6 @@ public class WQuickEntry extends Window implements EventListener, ValueCh boolean changed = (value != null && initialValue == null) || (value == null && initialValue != null) || (value != null && initialValue != null && !value.equals(initialValue)); - boolean thisMandatoryError = false; if (field.isMandatory(true)) { if (value == null || value.toString().length() == 0) { @@ -374,8 +376,24 @@ public class WQuickEntry extends Window implements EventListener, ValueCh po.set_ValueOfColumn(parentColumn, parentID); } } - + if(gridtab.getTabLevel()>0 && !isParentSave){ + FDialog.error(m_WindowNo, this, "FillMinimumInfo",tabZeroName); + return false; + } po.saveEx(); + if(gridtab.getTabLevel()==0){ + isParentSave=true; + } + for (int idxf = 0; idxf < quickFields.size(); idxf++) { + GridField field = quickFields.get(idxf); + if (field.getGridTab() != gridtab) + continue; + + WEditor we = quickEditors.get(idxf); + if (po.get_Value(we.getColumnName()) != null) { + we.setValue(po.get_Value(we.getColumnName())); + } + } } if (idxt == 0) { parentID = po.get_ID(); diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/panel/TreeSearchPanel.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/panel/TreeSearchPanel.java index 870f954283..09e247ca58 100644 --- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/panel/TreeSearchPanel.java +++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/panel/TreeSearchPanel.java @@ -335,8 +335,20 @@ public class TreeSearchPanel extends Panel implements EventListener, Tree cmbSearch.setText(null); return; } - - selectTreeitem(value); + + for(Component comp : cmbSearch.getChildren()) + { + Comboitem item = (Comboitem) comp; + if (item.getLabel().equals(value)) + { + String type = item.getContent(); + if (!Util.isEmpty(type)) + selectTreeitem(value+"."+type); + else + selectTreeitem(value); + return; + } + } } } else if (event.getName().equals(ON_POST_FIRE_TREE_EVENT))