IDEMPIERE-5520 Navigation between Tabs leave Detached DOM objects (Leak) (#1637)
- Partial fix plus workaround - Minor clean up and Javadoc fix - Create dynamic style for Detail Tabs only once
This commit is contained in:
parent
c28655af5f
commit
1a095d2d0e
|
@ -77,6 +77,7 @@ import org.zkoss.zk.ui.sys.DesktopCache;
|
||||||
import org.zkoss.zk.ui.sys.SessionCtrl;
|
import org.zkoss.zk.ui.sys.SessionCtrl;
|
||||||
import org.zkoss.zk.ui.sys.WebAppCtrl;
|
import org.zkoss.zk.ui.sys.WebAppCtrl;
|
||||||
import org.zkoss.zk.ui.util.Clients;
|
import org.zkoss.zk.ui.util.Clients;
|
||||||
|
import org.zkoss.zul.Style;
|
||||||
import org.zkoss.zul.Window;
|
import org.zkoss.zul.Window;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -329,6 +330,17 @@ public class AdempiereWebUI extends Window implements EventListener<Event>, IWeb
|
||||||
Env.setContext(ctx, Env.IS_CAN_APPROVE_OWN_DOC, MRole.getDefault().isCanApproveOwnDoc());
|
Env.setContext(ctx, Env.IS_CAN_APPROVE_OWN_DOC, MRole.getDefault().isCanApproveOwnDoc());
|
||||||
Clients.response(new AuScript("zAu.cmd0.clearBusy()"));
|
Clients.response(new AuScript("zAu.cmd0.clearBusy()"));
|
||||||
|
|
||||||
|
//add dynamic style
|
||||||
|
StringBuilder cssContent = new StringBuilder();
|
||||||
|
cssContent.append(".adtab-form-borderlayout .z-south-collapsed:before { ");
|
||||||
|
cssContent.append("content: \"");
|
||||||
|
cssContent.append(Util.cleanAmp(Msg.getMsg(Env.getCtx(), "Detail")));
|
||||||
|
cssContent.append("\"; ");
|
||||||
|
cssContent.append("} ");
|
||||||
|
Style style = new Style();
|
||||||
|
style.setContent(cssContent.toString());
|
||||||
|
appendChild(style);
|
||||||
|
|
||||||
//init favorite
|
//init favorite
|
||||||
FavouriteController.getInstance(currSess);
|
FavouriteController.getInstance(currSess);
|
||||||
|
|
||||||
|
|
|
@ -117,7 +117,6 @@ import org.zkoss.zul.RowRenderer;
|
||||||
import org.zkoss.zul.Separator;
|
import org.zkoss.zul.Separator;
|
||||||
import org.zkoss.zul.South;
|
import org.zkoss.zul.South;
|
||||||
import org.zkoss.zul.Space;
|
import org.zkoss.zul.Space;
|
||||||
import org.zkoss.zul.Style;
|
|
||||||
import org.zkoss.zul.Tabpanels;
|
import org.zkoss.zul.Tabpanels;
|
||||||
import org.zkoss.zul.Tabs;
|
import org.zkoss.zul.Tabs;
|
||||||
import org.zkoss.zul.Toolbar;
|
import org.zkoss.zul.Toolbar;
|
||||||
|
@ -204,7 +203,7 @@ DataStatusListener, IADTabpanel, IdSpace, IFieldEditorContainer
|
||||||
|
|
||||||
private ArrayList<Row> rowList;
|
private ArrayList<Row> rowList;
|
||||||
|
|
||||||
List<Group> allCollapsibleGroups;
|
protected List<Group> allCollapsibleGroups;
|
||||||
|
|
||||||
private Borderlayout formContainer = null;
|
private Borderlayout formContainer = null;
|
||||||
|
|
||||||
|
@ -411,16 +410,6 @@ DataStatusListener, IADTabpanel, IdSpace, IFieldEditorContainer
|
||||||
AD_Tree_ID = MTree.getDefaultAD_Tree_ID (
|
AD_Tree_ID = MTree.getDefaultAD_Tree_ID (
|
||||||
Env.getAD_Client_ID(Env.getCtx()), gridTab.getKeyColumnName());
|
Env.getAD_Client_ID(Env.getCtx()), gridTab.getKeyColumnName());
|
||||||
|
|
||||||
StringBuilder cssContent = new StringBuilder();
|
|
||||||
cssContent.append(".adtab-form-borderlayout .z-south-collapsed:before { ");
|
|
||||||
cssContent.append("content: \"");
|
|
||||||
cssContent.append(Util.cleanAmp(Msg.getMsg(Env.getCtx(), "Detail")));
|
|
||||||
cssContent.append("\"; ");
|
|
||||||
cssContent.append("} ");
|
|
||||||
Style style = new Style();
|
|
||||||
style.setContent(cssContent.toString());
|
|
||||||
appendChild(style);
|
|
||||||
|
|
||||||
if (gridTab.isTreeTab() && AD_Tree_ID != 0)
|
if (gridTab.isTreeTab() && AD_Tree_ID != 0)
|
||||||
{
|
{
|
||||||
Borderlayout layout = new Borderlayout();
|
Borderlayout layout = new Borderlayout();
|
||||||
|
@ -506,6 +495,10 @@ DataStatusListener, IADTabpanel, IdSpace, IFieldEditorContainer
|
||||||
createUI(false);
|
createUI(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param update true if it is update instead of create new
|
||||||
|
*/
|
||||||
protected void createUI(boolean update)
|
protected void createUI(boolean update)
|
||||||
{
|
{
|
||||||
if (update)
|
if (update)
|
||||||
|
@ -711,7 +704,6 @@ DataStatusListener, IADTabpanel, IdSpace, IFieldEditorContainer
|
||||||
Cell cell = (Cell) rowg.getFirstChild();
|
Cell cell = (Cell) rowg.getFirstChild();
|
||||||
cell.setSclass("z-group-inner");
|
cell.setSclass("z-group-inner");
|
||||||
cell.setColspan(numCols+1);
|
cell.setColspan(numCols+1);
|
||||||
// rowg.appendChild(cell);
|
|
||||||
|
|
||||||
allCollapsibleGroups.add(rowg);
|
allCollapsibleGroups.add(rowg);
|
||||||
if (X_AD_FieldGroup.FIELDGROUPTYPE_Tab.equals(field.getFieldGroupType()) || field.getIsCollapsedByDefault())
|
if (X_AD_FieldGroup.FIELDGROUPTYPE_Tab.equals(field.getFieldGroupType()) || field.getIsCollapsedByDefault())
|
||||||
|
@ -1390,6 +1382,7 @@ DataStatusListener, IADTabpanel, IdSpace, IFieldEditorContainer
|
||||||
/**
|
/**
|
||||||
* Refresh current row
|
* Refresh current row
|
||||||
*/
|
*/
|
||||||
|
@Override
|
||||||
public void refresh()
|
public void refresh()
|
||||||
{
|
{
|
||||||
gridTab.dataRefresh();
|
gridTab.dataRefresh();
|
||||||
|
@ -1399,6 +1392,7 @@ DataStatusListener, IADTabpanel, IdSpace, IFieldEditorContainer
|
||||||
* Activate/deactivate panel
|
* Activate/deactivate panel
|
||||||
* @param activate
|
* @param activate
|
||||||
*/
|
*/
|
||||||
|
@Override
|
||||||
public void activate(boolean activate)
|
public void activate(boolean activate)
|
||||||
{
|
{
|
||||||
if (activate) {
|
if (activate) {
|
||||||
|
@ -1471,6 +1465,7 @@ DataStatusListener, IADTabpanel, IdSpace, IFieldEditorContainer
|
||||||
* @see EventListener#onEvent(Event)
|
* @see EventListener#onEvent(Event)
|
||||||
*/
|
*/
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
|
@Override
|
||||||
public void onEvent(Event event)
|
public void onEvent(Event event)
|
||||||
{
|
{
|
||||||
if (event.getTarget() == listPanel.getListbox())
|
if (event.getTarget() == listPanel.getListbox())
|
||||||
|
@ -1606,9 +1601,6 @@ DataStatusListener, IADTabpanel, IdSpace, IFieldEditorContainer
|
||||||
MTreeNode treeNode = value.getData();
|
MTreeNode treeNode = value.getData();
|
||||||
// We Have a TreeNode
|
// We Have a TreeNode
|
||||||
int nodeID = treeNode.getNode_ID();
|
int nodeID = treeNode.getNode_ID();
|
||||||
// root of tree selected - ignore
|
|
||||||
//if (nodeID == 0)
|
|
||||||
//return;
|
|
||||||
|
|
||||||
// Search all rows for mode id
|
// Search all rows for mode id
|
||||||
int size = gridTab.getRowCount();
|
int size = gridTab.getRowCount();
|
||||||
|
@ -1639,6 +1631,7 @@ DataStatusListener, IADTabpanel, IdSpace, IFieldEditorContainer
|
||||||
* @param e
|
* @param e
|
||||||
* @see DataStatusListener#dataStatusChanged(DataStatusEvent)
|
* @see DataStatusListener#dataStatusChanged(DataStatusEvent)
|
||||||
*/
|
*/
|
||||||
|
@Override
|
||||||
public void dataStatusChanged(DataStatusEvent e)
|
public void dataStatusChanged(DataStatusEvent e)
|
||||||
{
|
{
|
||||||
//ignore background event
|
//ignore background event
|
||||||
|
@ -1946,6 +1939,7 @@ DataStatusListener, IADTabpanel, IdSpace, IFieldEditorContainer
|
||||||
/**
|
/**
|
||||||
* @see IADTabpanel#afterSave(boolean)
|
* @see IADTabpanel#afterSave(boolean)
|
||||||
*/
|
*/
|
||||||
|
@Override
|
||||||
public void afterSave(boolean onSaveEvent) {
|
public void afterSave(boolean onSaveEvent) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1977,6 +1971,7 @@ DataStatusListener, IADTabpanel, IdSpace, IFieldEditorContainer
|
||||||
/**
|
/**
|
||||||
* @see IADTabpanel#onEnterKey()
|
* @see IADTabpanel#onEnterKey()
|
||||||
*/
|
*/
|
||||||
|
@Override
|
||||||
public boolean onEnterKey() {
|
public boolean onEnterKey() {
|
||||||
if (listPanel.isVisible()) {
|
if (listPanel.isVisible()) {
|
||||||
return listPanel.onEnterKey();
|
return listPanel.onEnterKey();
|
||||||
|
@ -1987,6 +1982,7 @@ DataStatusListener, IADTabpanel, IdSpace, IFieldEditorContainer
|
||||||
/**
|
/**
|
||||||
* @return boolean
|
* @return boolean
|
||||||
*/
|
*/
|
||||||
|
@Override
|
||||||
public boolean isGridView() {
|
public boolean isGridView() {
|
||||||
return listPanel.isVisible();
|
return listPanel.isVisible();
|
||||||
}
|
}
|
||||||
|
@ -2022,8 +2018,13 @@ DataStatusListener, IADTabpanel, IdSpace, IFieldEditorContainer
|
||||||
private void attachDetailPane() {
|
private void attachDetailPane() {
|
||||||
if (formContainer.getSouth() != null) {
|
if (formContainer.getSouth() != null) {
|
||||||
formContainer.getSouth().setVisible(true);
|
formContainer.getSouth().setVisible(true);
|
||||||
if (formContainer.getSouth().isOpen() && detailPane != null && detailPane.getParent() == null) {
|
if (formContainer.getSouth().isOpen()) {
|
||||||
|
if (detailPane != null) {
|
||||||
|
if (detailPane.getParent() != formContainer.getSouth())
|
||||||
formContainer.appendSouth(detailPane);
|
formContainer.appendSouth(detailPane);
|
||||||
|
else
|
||||||
|
detailPane.setVisible(true);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2032,7 +2033,7 @@ DataStatusListener, IADTabpanel, IdSpace, IFieldEditorContainer
|
||||||
if (formContainer.getSouth() != null) {
|
if (formContainer.getSouth() != null) {
|
||||||
formContainer.getSouth().setVisible(false);
|
formContainer.getSouth().setVisible(false);
|
||||||
if (detailPane != null && detailPane.getParent() != null) {
|
if (detailPane != null && detailPane.getParent() != null) {
|
||||||
detailPane.detach();
|
detailPane.setVisible(false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2158,6 +2159,11 @@ DataStatusListener, IADTabpanel, IdSpace, IFieldEditorContainer
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param toFocus
|
||||||
|
* @param checkCurrent true to check if form currently has focus (using zk.currentFocus)
|
||||||
|
*/
|
||||||
protected void focusToEditor(WEditor toFocus, boolean checkCurrent) {
|
protected void focusToEditor(WEditor toFocus, boolean checkCurrent) {
|
||||||
Component c = toFocus.getComponent();
|
Component c = toFocus.getComponent();
|
||||||
if (c instanceof EditorBox) {
|
if (c instanceof EditorBox) {
|
||||||
|
@ -2220,10 +2226,18 @@ DataStatusListener, IADTabpanel, IdSpace, IFieldEditorContainer
|
||||||
savePreference("TreePanel.Width", width);
|
savePreference("TreePanel.Width", width);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
for(WEditor editor : editors) {
|
||||||
|
editor.getComponent().setWidgetListener("onFocus", null);
|
||||||
|
}
|
||||||
super.onPageDetached(page);
|
super.onPageDetached(page);
|
||||||
}
|
}
|
||||||
|
|
||||||
void savePreference(String attribute, String value)
|
/**
|
||||||
|
*
|
||||||
|
* @param attribute
|
||||||
|
* @param value
|
||||||
|
*/
|
||||||
|
protected void savePreference(String attribute, String value)
|
||||||
{
|
{
|
||||||
int windowId = getGridTab().getAD_Window_ID();
|
int windowId = getGridTab().getAD_Window_ID();
|
||||||
int adTabId = getGridTab().getAD_Tab_ID();
|
int adTabId = getGridTab().getAD_Tab_ID();
|
||||||
|
@ -2248,6 +2262,9 @@ DataStatusListener, IADTabpanel, IdSpace, IFieldEditorContainer
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* handle client info event
|
||||||
|
*/
|
||||||
protected void onClientInfo() {
|
protected void onClientInfo() {
|
||||||
if (!uiCreated || gridTab == null) return;
|
if (!uiCreated || gridTab == null) return;
|
||||||
int numCols=gridTab.getNumColumns();
|
int numCols=gridTab.getNumColumns();
|
||||||
|
@ -2273,10 +2290,10 @@ DataStatusListener, IADTabpanel, IdSpace, IFieldEditorContainer
|
||||||
protected boolean isMobile() {
|
protected boolean isMobile() {
|
||||||
return ClientInfo.isMobile();
|
return ClientInfo.isMobile();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void editorTraverse(Callback<WEditor> editorTaverseCallback) {
|
public void editorTraverse(Callback<WEditor> editorTaverseCallback) {
|
||||||
editorTraverse(editorTaverseCallback, editors);
|
editorTraverse(editorTaverseCallback, editors);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -2334,6 +2351,10 @@ DataStatusListener, IADTabpanel, IdSpace, IFieldEditorContainer
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @return {@link AbstractADWindowContenta}
|
||||||
|
*/
|
||||||
public AbstractADWindowContent getADWindowContent()
|
public AbstractADWindowContent getADWindowContent()
|
||||||
{
|
{
|
||||||
return windowPanel;
|
return windowPanel;
|
||||||
|
|
|
@ -75,11 +75,16 @@ public abstract class AbstractADTabbox extends AbstractUIPart implements IADTabb
|
||||||
doAddTab(gTab, tabPanel);
|
doAddTab(gTab, tabPanel);
|
||||||
}// addTab
|
}// addTab
|
||||||
|
|
||||||
|
/**
|
||||||
|
* handle add tab to tabbox
|
||||||
|
* @param tab
|
||||||
|
* @param tabPanel
|
||||||
|
*/
|
||||||
protected abstract void doAddTab(GridTab tab, IADTabpanel tabPanel);
|
protected abstract void doAddTab(GridTab tab, IADTabpanel tabPanel);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param index of tab panel
|
* @param index of tab panel
|
||||||
* @return
|
* @return true if enable
|
||||||
*/
|
*/
|
||||||
public boolean isEnabledAt(int index)
|
public boolean isEnabledAt(int index)
|
||||||
{
|
{
|
||||||
|
@ -102,10 +107,10 @@ public abstract class AbstractADTabbox extends AbstractUIPart implements IADTabb
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
* Updated selected tab index
|
||||||
* @param oldIndex
|
* @param oldIndex
|
||||||
* @param newIndex
|
* @param newIndex
|
||||||
* @return
|
* @return true if successfully switch to newIndex
|
||||||
*/
|
*/
|
||||||
public boolean updateSelectedIndex(int oldIndex, int newIndex)
|
public boolean updateSelectedIndex(int oldIndex, int newIndex)
|
||||||
{
|
{
|
||||||
|
@ -186,8 +191,17 @@ public abstract class AbstractADTabbox extends AbstractUIPart implements IADTabb
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* handle tab selection changed event
|
||||||
|
* @param oldIndex
|
||||||
|
* @param newIndex
|
||||||
|
*/
|
||||||
protected abstract void doTabSelectionChanged(int oldIndex, int newIndex);
|
protected abstract void doTabSelectionChanged(int oldIndex, int newIndex);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param index tab index
|
||||||
|
* @return true if tab is visible
|
||||||
|
*/
|
||||||
public boolean isDisplay(int index) {
|
public boolean isDisplay(int index) {
|
||||||
if (index >= tabPanelList.size())
|
if (index >= tabPanelList.size())
|
||||||
return false;
|
return false;
|
||||||
|
@ -203,10 +217,22 @@ public abstract class AbstractADTabbox extends AbstractUIPart implements IADTabb
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param fromIndex
|
||||||
|
* @param toIndex
|
||||||
|
* @return true if can navigate to toIndex
|
||||||
|
*/
|
||||||
public boolean canNavigateTo(int fromIndex, int toIndex) {
|
public boolean canNavigateTo(int fromIndex, int toIndex) {
|
||||||
return canNavigateTo(fromIndex, toIndex, false);
|
return canNavigateTo(fromIndex, toIndex, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param fromIndex
|
||||||
|
* @param toIndex
|
||||||
|
* @param checkRecordID true to validate record id of fromIndex tab
|
||||||
|
* @return true if can navigate to toIndex tab
|
||||||
|
*/
|
||||||
public boolean canNavigateTo(int fromIndex, int toIndex, boolean checkRecordID) {
|
public boolean canNavigateTo(int fromIndex, int toIndex, boolean checkRecordID) {
|
||||||
IADTabpanel newTab = tabPanelList.get(toIndex);
|
IADTabpanel newTab = tabPanelList.get(toIndex);
|
||||||
if (newTab instanceof ADTabpanel)
|
if (newTab instanceof ADTabpanel)
|
||||||
|
@ -308,6 +334,9 @@ public abstract class AbstractADTabbox extends AbstractUIPart implements IADTabb
|
||||||
|
|
||||||
} // evaluate
|
} // evaluate
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Update display state of tab (visibility, activation and if need invalidate)
|
||||||
|
*/
|
||||||
protected abstract void updateTabState();
|
protected abstract void updateTabState();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -318,6 +347,10 @@ public abstract class AbstractADTabbox extends AbstractUIPart implements IADTabb
|
||||||
return tabPanelList.size();
|
return tabPanelList.size();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param index
|
||||||
|
* @return {@link IADTabpanel}
|
||||||
|
*/
|
||||||
public IADTabpanel getADTabpanel(int index)
|
public IADTabpanel getADTabpanel(int index)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
|
@ -331,11 +364,18 @@ public abstract class AbstractADTabbox extends AbstractUIPart implements IADTabb
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set newIndex as selected tab
|
||||||
|
* @param newIndex
|
||||||
|
*/
|
||||||
public void setSelectedIndex(int newIndex) {
|
public void setSelectedIndex(int newIndex) {
|
||||||
int oldIndex = getSelectedIndex();
|
int oldIndex = getSelectedIndex();
|
||||||
updateSelectedIndex(oldIndex, newIndex);
|
updateSelectedIndex(oldIndex, newIndex);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param abstractADWindowPanel
|
||||||
|
*/
|
||||||
public void setADWindowPanel(AbstractADWindowContent abstractADWindowPanel) {
|
public void setADWindowPanel(AbstractADWindowContent abstractADWindowPanel) {
|
||||||
this.adWindowPanel = abstractADWindowPanel;
|
this.adWindowPanel = abstractADWindowPanel;
|
||||||
}
|
}
|
||||||
|
|
|
@ -254,6 +254,10 @@ public abstract class AbstractADWindowContent extends AbstractUIPart implements
|
||||||
return comp;
|
return comp;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @return {@link BreadCrumb}
|
||||||
|
*/
|
||||||
public BreadCrumb getBreadCrumb()
|
public BreadCrumb getBreadCrumb()
|
||||||
{
|
{
|
||||||
return breadCrumb;
|
return breadCrumb;
|
||||||
|
@ -293,6 +297,10 @@ public abstract class AbstractADWindowContent extends AbstractUIPart implements
|
||||||
*/
|
*/
|
||||||
protected abstract IADTabbox createADTab();
|
protected abstract IADTabbox createADTab();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* handle switching of editing status
|
||||||
|
* @param editStatus true if editing (dirty)
|
||||||
|
*/
|
||||||
protected abstract void switchEditStatus(boolean editStatus);
|
protected abstract void switchEditStatus(boolean editStatus);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -793,6 +801,7 @@ public abstract class AbstractADWindowContent extends AbstractUIPart implements
|
||||||
getComponent().addEventListener("onInitialQuery", new EventListener<Event>() {
|
getComponent().addEventListener("onInitialQuery", new EventListener<Event>() {
|
||||||
@Override
|
@Override
|
||||||
public void onEvent(Event event) throws Exception {
|
public void onEvent(Event event) throws Exception {
|
||||||
|
if (findWindow.getParent() != getComponent().getParent())
|
||||||
getComponent().getParent().appendChild(findWindow);
|
getComponent().getParent().appendChild(findWindow);
|
||||||
LayoutUtils.openEmbeddedWindow(getComponent().getParent(), findWindow, "overlap");
|
LayoutUtils.openEmbeddedWindow(getComponent().getParent(), findWindow, "overlap");
|
||||||
}
|
}
|
||||||
|
@ -824,11 +833,19 @@ public abstract class AbstractADWindowContent extends AbstractUIPart implements
|
||||||
findWindow.setContentStyle("background-color: #fff; width: 99%; margin: auto;");
|
findWindow.setContentStyle("background-color: #fff; width: 99%; margin: auto;");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @return title of window
|
||||||
|
*/
|
||||||
public String getTitle()
|
public String getTitle()
|
||||||
{
|
{
|
||||||
return title;
|
return title;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @return {@link MImage}
|
||||||
|
*/
|
||||||
public MImage getImage()
|
public MImage getImage()
|
||||||
{
|
{
|
||||||
return image;
|
return image;
|
||||||
|
@ -837,6 +854,7 @@ public abstract class AbstractADWindowContent extends AbstractUIPart implements
|
||||||
/**
|
/**
|
||||||
* @see ToolbarListener#onDetailRecord()
|
* @see ToolbarListener#onDetailRecord()
|
||||||
*/
|
*/
|
||||||
|
@Override
|
||||||
public void onDetailRecord()
|
public void onDetailRecord()
|
||||||
{
|
{
|
||||||
adTabbox.onDetailRecord();
|
adTabbox.onDetailRecord();
|
||||||
|
@ -845,6 +863,7 @@ public abstract class AbstractADWindowContent extends AbstractUIPart implements
|
||||||
/**
|
/**
|
||||||
* @see ToolbarListener#onParentRecord()
|
* @see ToolbarListener#onParentRecord()
|
||||||
*/
|
*/
|
||||||
|
@Override
|
||||||
public void onParentRecord()
|
public void onParentRecord()
|
||||||
{
|
{
|
||||||
List<BreadCrumbLink> parents = breadCrumb.getParentLinks();
|
List<BreadCrumbLink> parents = breadCrumb.getParentLinks();
|
||||||
|
@ -856,6 +875,7 @@ public abstract class AbstractADWindowContent extends AbstractUIPart implements
|
||||||
/**
|
/**
|
||||||
* @see ToolbarListener#onFirst()
|
* @see ToolbarListener#onFirst()
|
||||||
*/
|
*/
|
||||||
|
@Override
|
||||||
public void onFirst()
|
public void onFirst()
|
||||||
{
|
{
|
||||||
Callback<Boolean> callback = new Callback<Boolean>() {
|
Callback<Boolean> callback = new Callback<Boolean>() {
|
||||||
|
@ -873,6 +893,7 @@ public abstract class AbstractADWindowContent extends AbstractUIPart implements
|
||||||
/**
|
/**
|
||||||
* @see ToolbarListener#onLast()
|
* @see ToolbarListener#onLast()
|
||||||
*/
|
*/
|
||||||
|
@Override
|
||||||
public void onLast()
|
public void onLast()
|
||||||
{
|
{
|
||||||
Callback<Boolean> callback = new Callback<Boolean>() {
|
Callback<Boolean> callback = new Callback<Boolean>() {
|
||||||
|
@ -890,6 +911,7 @@ public abstract class AbstractADWindowContent extends AbstractUIPart implements
|
||||||
/**
|
/**
|
||||||
* @see ToolbarListener#onNext()
|
* @see ToolbarListener#onNext()
|
||||||
*/
|
*/
|
||||||
|
@Override
|
||||||
public void onNext()
|
public void onNext()
|
||||||
{
|
{
|
||||||
Callback<Boolean> callback = new Callback<Boolean>() {
|
Callback<Boolean> callback = new Callback<Boolean>() {
|
||||||
|
@ -907,6 +929,7 @@ public abstract class AbstractADWindowContent extends AbstractUIPart implements
|
||||||
/**
|
/**
|
||||||
* @see ToolbarListener#onPrevious()
|
* @see ToolbarListener#onPrevious()
|
||||||
*/
|
*/
|
||||||
|
@Override
|
||||||
public void onPrevious()
|
public void onPrevious()
|
||||||
{
|
{
|
||||||
Callback<Boolean> callback = new Callback<Boolean>() {
|
Callback<Boolean> callback = new Callback<Boolean>() {
|
||||||
|
@ -922,7 +945,9 @@ public abstract class AbstractADWindowContent extends AbstractUIPart implements
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @see ToolbarListener#onPrevious()
|
* handle tree navigation
|
||||||
|
* @param gt
|
||||||
|
* @param rowIndex
|
||||||
*/
|
*/
|
||||||
public void onTreeNavigate(final GridTab gt, final int rowIndex)
|
public void onTreeNavigate(final GridTab gt, final int rowIndex)
|
||||||
{
|
{
|
||||||
|
@ -931,7 +956,6 @@ public abstract class AbstractADWindowContent extends AbstractUIPart implements
|
||||||
public void onCallback(Boolean result) {
|
public void onCallback(Boolean result) {
|
||||||
if (result) {
|
if (result) {
|
||||||
gt.navigate(rowIndex);
|
gt.navigate(rowIndex);
|
||||||
//focusToActivePanel();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -955,6 +979,7 @@ public abstract class AbstractADWindowContent extends AbstractUIPart implements
|
||||||
/**
|
/**
|
||||||
* @see ToolbarListener#onLock()
|
* @see ToolbarListener#onLock()
|
||||||
*/
|
*/
|
||||||
|
@Override
|
||||||
public void onLock()
|
public void onLock()
|
||||||
{
|
{
|
||||||
if (!toolbar.isPersonalLock)
|
if (!toolbar.isPersonalLock)
|
||||||
|
@ -1017,6 +1042,7 @@ public abstract class AbstractADWindowContent extends AbstractUIPart implements
|
||||||
/**
|
/**
|
||||||
* @see ToolbarListener#onAttachment()
|
* @see ToolbarListener#onAttachment()
|
||||||
*/
|
*/
|
||||||
|
@Override
|
||||||
public void onAttachment()
|
public void onAttachment()
|
||||||
{
|
{
|
||||||
int record_ID = adTabbox.getSelectedGridTab().getRecord_ID();
|
int record_ID = adTabbox.getSelectedGridTab().getRecord_ID();
|
||||||
|
@ -1049,6 +1075,7 @@ public abstract class AbstractADWindowContent extends AbstractUIPart implements
|
||||||
win.focus();
|
win.focus();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public void onChat()
|
public void onChat()
|
||||||
{
|
{
|
||||||
int recordId = adTabbox.getSelectedGridTab().getRecord_ID();
|
int recordId = adTabbox.getSelectedGridTab().getRecord_ID();
|
||||||
|
@ -1093,6 +1120,9 @@ public abstract class AbstractADWindowContent extends AbstractUIPart implements
|
||||||
chat.showWindow();
|
chat.showWindow();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* handle post it event
|
||||||
|
*/
|
||||||
public void onPostIt()
|
public void onPostIt()
|
||||||
{
|
{
|
||||||
int recordId = adTabbox.getSelectedGridTab().getRecord_ID();
|
int recordId = adTabbox.getSelectedGridTab().getRecord_ID();
|
||||||
|
@ -1146,6 +1176,7 @@ public abstract class AbstractADWindowContent extends AbstractUIPart implements
|
||||||
/**
|
/**
|
||||||
* @see ToolbarListener#onToggle()
|
* @see ToolbarListener#onToggle()
|
||||||
*/
|
*/
|
||||||
|
@Override
|
||||||
public void onToggle()
|
public void onToggle()
|
||||||
{
|
{
|
||||||
adTabbox.getSelectedTabpanel().switchRowPresentation();
|
adTabbox.getSelectedTabpanel().switchRowPresentation();
|
||||||
|
@ -1257,6 +1288,7 @@ public abstract class AbstractADWindowContent extends AbstractUIPart implements
|
||||||
* @param event
|
* @param event
|
||||||
* @see EventListener#onEvent(Event)
|
* @see EventListener#onEvent(Event)
|
||||||
*/
|
*/
|
||||||
|
@Override
|
||||||
public void onEvent(Event event)
|
public void onEvent(Event event)
|
||||||
{
|
{
|
||||||
if (CompositeADTabbox.ON_SELECTION_CHANGED_EVENT.equals(event.getName()))
|
if (CompositeADTabbox.ON_SELECTION_CHANGED_EVENT.equals(event.getName()))
|
||||||
|
@ -1407,6 +1439,10 @@ public abstract class AbstractADWindowContent extends AbstractUIPart implements
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* save (if needed) and execute callback
|
||||||
|
* @param callback
|
||||||
|
*/
|
||||||
public void saveAndNavigate(final Callback<Boolean> callback) {
|
public void saveAndNavigate(final Callback<Boolean> callback) {
|
||||||
if (adTabbox != null)
|
if (adTabbox != null)
|
||||||
{
|
{
|
||||||
|
@ -1566,6 +1602,7 @@ public abstract class AbstractADWindowContent extends AbstractUIPart implements
|
||||||
* @param e
|
* @param e
|
||||||
* @see DataStatusListener#dataStatusChanged(DataStatusEvent)
|
* @see DataStatusListener#dataStatusChanged(DataStatusEvent)
|
||||||
*/
|
*/
|
||||||
|
@Override
|
||||||
public void dataStatusChanged(DataStatusEvent e)
|
public void dataStatusChanged(DataStatusEvent e)
|
||||||
{
|
{
|
||||||
//ignore non-ui thread event.
|
//ignore non-ui thread event.
|
||||||
|
@ -1955,9 +1992,6 @@ public abstract class AbstractADWindowContent extends AbstractUIPart implements
|
||||||
toolbar.enableRequests(!isNewRow);
|
toolbar.enableRequests(!isNewRow);
|
||||||
toolbar.setPressed("Find", adTabbox.getSelectedGridTab().isQueryActive() ||
|
toolbar.setPressed("Find", adTabbox.getSelectedGridTab().isQueryActive() ||
|
||||||
(!isNewRow && (m_onlyCurrentRows || m_onlyCurrentDays > 0)));
|
(!isNewRow && (m_onlyCurrentRows || m_onlyCurrentDays > 0)));
|
||||||
/*if (adTabbox.getSelectedGridTab().isQueryActive() &&
|
|
||||||
tabFindWindowHashMap.get(adTabbox.getSelectedGridTab()) != null)
|
|
||||||
findWindow = tabFindWindowHashMap.get(adTabbox.getSelectedGridTab());*/
|
|
||||||
toolbar.refreshUserQuery(adTabbox.getSelectedGridTab().getAD_Tab_ID(), getCurrentFindWindow() != null ? getCurrentFindWindow().getAD_UserQuery_ID() : 0);
|
toolbar.refreshUserQuery(adTabbox.getSelectedGridTab().getAD_Tab_ID(), getCurrentFindWindow() != null ? getCurrentFindWindow().getAD_UserQuery_ID() : 0);
|
||||||
|
|
||||||
toolbar.enablePrint(adTabbox.getSelectedGridTab().isPrinted() && !isNewRow);
|
toolbar.enablePrint(adTabbox.getSelectedGridTab().isPrinted() && !isNewRow);
|
||||||
|
@ -2091,51 +2125,21 @@ public abstract class AbstractADWindowContent extends AbstractUIPart implements
|
||||||
/**
|
/**
|
||||||
* @see ToolbarListener#onRefresh()
|
* @see ToolbarListener#onRefresh()
|
||||||
*/
|
*/
|
||||||
|
@Override
|
||||||
public void onRefresh()
|
public void onRefresh()
|
||||||
{
|
{
|
||||||
GridTab gridTab = adTabbox.getSelectedGridTab();
|
GridTab gridTab = adTabbox.getSelectedGridTab();
|
||||||
/*if (gridTab != null && gridTab.getTableModel() != null)
|
|
||||||
{
|
|
||||||
gridTab.getTableModel().resetCacheSortState();
|
|
||||||
}
|
|
||||||
Column sortColumn = findCurrentSortColumn();*/
|
|
||||||
onRefresh(true, false);
|
onRefresh(true, false);
|
||||||
/*if (sortColumn != null)
|
|
||||||
{
|
|
||||||
sortColumn.setSortDirection("natural");
|
|
||||||
}*/
|
|
||||||
if (gridTab.isSortTab()) { // refresh is not refreshing sort tabs
|
if (gridTab.isSortTab()) { // refresh is not refreshing sort tabs
|
||||||
IADTabpanel tabPanel = adTabbox.getSelectedTabpanel();
|
IADTabpanel tabPanel = adTabbox.getSelectedTabpanel();
|
||||||
tabPanel.query(false, 0, 0);
|
tabPanel.query(false, 0, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/*
|
|
||||||
private Column findCurrentSortColumn() {
|
|
||||||
IADTabpanel iadtabpanel = getADTab().getSelectedTabpanel();
|
|
||||||
if (iadtabpanel instanceof ADTabpanel) {
|
|
||||||
ADTabpanel adtabpanel = (ADTabpanel) iadtabpanel;
|
|
||||||
Grid grid = adtabpanel.getGridView().getListbox();
|
|
||||||
Columns columns = grid.getColumns();
|
|
||||||
if (columns != null) {
|
|
||||||
List<?> list = columns.getChildren();
|
|
||||||
for(int i = 0; i < list.size(); i++)
|
|
||||||
{
|
|
||||||
Component c = (Component) list.get(i);
|
|
||||||
if (c instanceof Column) {
|
|
||||||
Column column = (Column) c;
|
|
||||||
if (!"natural".equals(column.getSortDirection())) {
|
|
||||||
return column;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
/**
|
/**
|
||||||
* @see ToolbarListener#onHelp()
|
* @see ToolbarListener#onHelp()
|
||||||
*/
|
*/
|
||||||
|
@Override
|
||||||
public void onHelp()
|
public void onHelp()
|
||||||
{
|
{
|
||||||
closeToolbarPopup("Help");
|
closeToolbarPopup("Help");
|
||||||
|
@ -2289,6 +2293,7 @@ public abstract class AbstractADWindowContent extends AbstractUIPart implements
|
||||||
/**
|
/**
|
||||||
* @see ToolbarListener#onFind()
|
* @see ToolbarListener#onFind()
|
||||||
*/
|
*/
|
||||||
|
@Override
|
||||||
public void onFind()
|
public void onFind()
|
||||||
{
|
{
|
||||||
if (adTabbox.getSelectedGridTab() == null)
|
if (adTabbox.getSelectedGridTab() == null)
|
||||||
|
@ -2373,7 +2378,10 @@ public abstract class AbstractADWindowContent extends AbstractUIPart implements
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (getCurrentFindWindow().getParent() != getComponent().getParent())
|
||||||
getComponent().getParent().appendChild(getCurrentFindWindow());
|
getComponent().getParent().appendChild(getCurrentFindWindow());
|
||||||
|
else
|
||||||
|
getCurrentFindWindow().setVisible(true);
|
||||||
showBusyMask(getCurrentFindWindow());
|
showBusyMask(getCurrentFindWindow());
|
||||||
LayoutUtils.openEmbeddedWindow(toolbar, getCurrentFindWindow(), "after_start");
|
LayoutUtils.openEmbeddedWindow(toolbar, getCurrentFindWindow(), "after_start");
|
||||||
}
|
}
|
||||||
|
@ -2515,6 +2523,12 @@ public abstract class AbstractADWindowContent extends AbstractUIPart implements
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param onSaveEvent
|
||||||
|
* @param onNavigationEvent
|
||||||
|
* @param callback
|
||||||
|
*/
|
||||||
public void onSave(final boolean onSaveEvent, final boolean onNavigationEvent, final Callback<Boolean> callback) {
|
public void onSave(final boolean onSaveEvent, final boolean onNavigationEvent, final Callback<Boolean> callback) {
|
||||||
final Callback<Boolean> postCallback = new Callback<Boolean>() {
|
final Callback<Boolean> postCallback = new Callback<Boolean>() {
|
||||||
@Override
|
@Override
|
||||||
|
@ -2543,6 +2557,10 @@ public abstract class AbstractADWindowContent extends AbstractUIPart implements
|
||||||
WindowValidatorManager.getInstance().fireWindowValidatorEvent(event, preCallback);
|
WindowValidatorManager.getInstance().fireWindowValidatorEvent(event, preCallback);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* handle WPaymentEditor.ON_SAVE_PAYMENT event.
|
||||||
|
* Do not call this directly
|
||||||
|
*/
|
||||||
public void onSavePayment()
|
public void onSavePayment()
|
||||||
{
|
{
|
||||||
onSave(false, false, new Callback<Boolean>() {
|
onSave(false, false, new Callback<Boolean>() {
|
||||||
|
@ -2555,9 +2573,6 @@ public abstract class AbstractADWindowContent extends AbstractUIPart implements
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @param onSaveEvent
|
|
||||||
*/
|
|
||||||
private void onSaveCallback(final boolean onSaveEvent, final boolean onNavigationEvent, final Callback<Boolean> callback)
|
private void onSaveCallback(final boolean onSaveEvent, final boolean onNavigationEvent, final Callback<Boolean> callback)
|
||||||
{
|
{
|
||||||
final boolean wasChanged = toolbar.isSaveEnable();
|
final boolean wasChanged = toolbar.isSaveEnable();
|
||||||
|
@ -2720,6 +2735,7 @@ public abstract class AbstractADWindowContent extends AbstractUIPart implements
|
||||||
/**
|
/**
|
||||||
* @see ToolbarListener#onSaveCreate()
|
* @see ToolbarListener#onSaveCreate()
|
||||||
*/
|
*/
|
||||||
|
@Override
|
||||||
public void onSaveCreate()
|
public void onSaveCreate()
|
||||||
{
|
{
|
||||||
onSave(true, true, new Callback<Boolean>() {
|
onSave(true, true, new Callback<Boolean>() {
|
||||||
|
@ -3037,6 +3053,7 @@ public abstract class AbstractADWindowContent extends AbstractUIPart implements
|
||||||
/**
|
/**
|
||||||
* @see ToolbarListener#onReport()
|
* @see ToolbarListener#onReport()
|
||||||
*/
|
*/
|
||||||
|
@Override
|
||||||
public void onReport() {
|
public void onReport() {
|
||||||
if (!MRole.getDefault().isCanReport(adTabbox.getSelectedGridTab().getAD_Table_ID()))
|
if (!MRole.getDefault().isCanReport(adTabbox.getSelectedGridTab().getAD_Table_ID()))
|
||||||
{
|
{
|
||||||
|
@ -3066,6 +3083,7 @@ public abstract class AbstractADWindowContent extends AbstractUIPart implements
|
||||||
/**
|
/**
|
||||||
* @see ToolbarListener#onZoomAcross()
|
* @see ToolbarListener#onZoomAcross()
|
||||||
*/
|
*/
|
||||||
|
@Override
|
||||||
public void onZoomAcross() {
|
public void onZoomAcross() {
|
||||||
if (toolbar.getEvent() != null)
|
if (toolbar.getEvent() != null)
|
||||||
{
|
{
|
||||||
|
@ -3098,6 +3116,7 @@ public abstract class AbstractADWindowContent extends AbstractUIPart implements
|
||||||
/**
|
/**
|
||||||
* @see ToolbarListener#onActiveWorkflows()
|
* @see ToolbarListener#onActiveWorkflows()
|
||||||
*/
|
*/
|
||||||
|
@Override
|
||||||
public void onActiveWorkflows() {
|
public void onActiveWorkflows() {
|
||||||
if (toolbar.getEvent() != null)
|
if (toolbar.getEvent() != null)
|
||||||
{
|
{
|
||||||
|
@ -3128,6 +3147,7 @@ public abstract class AbstractADWindowContent extends AbstractUIPart implements
|
||||||
/**
|
/**
|
||||||
* @see ToolbarListener#onRequests()
|
* @see ToolbarListener#onRequests()
|
||||||
*/
|
*/
|
||||||
|
@Override
|
||||||
public void onRequests()
|
public void onRequests()
|
||||||
{
|
{
|
||||||
if (toolbar.getEvent() != null)
|
if (toolbar.getEvent() != null)
|
||||||
|
@ -3149,6 +3169,7 @@ public abstract class AbstractADWindowContent extends AbstractUIPart implements
|
||||||
/**
|
/**
|
||||||
* @see ToolbarListener#onProductInfo()
|
* @see ToolbarListener#onProductInfo()
|
||||||
*/
|
*/
|
||||||
|
@Override
|
||||||
public void onProductInfo()
|
public void onProductInfo()
|
||||||
{
|
{
|
||||||
closeToolbarPopup("ProductInfo");
|
closeToolbarPopup("ProductInfo");
|
||||||
|
@ -3161,6 +3182,7 @@ public abstract class AbstractADWindowContent extends AbstractUIPart implements
|
||||||
/**
|
/**
|
||||||
* @see ToolbarListener#onArchive()
|
* @see ToolbarListener#onArchive()
|
||||||
*/
|
*/
|
||||||
|
@Override
|
||||||
public void onArchive()
|
public void onArchive()
|
||||||
{
|
{
|
||||||
if (toolbar.getEvent() != null)
|
if (toolbar.getEvent() != null)
|
||||||
|
@ -3528,6 +3550,9 @@ public abstract class AbstractADWindowContent extends AbstractUIPart implements
|
||||||
return mask;
|
return mask;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* hide busy mask
|
||||||
|
*/
|
||||||
public void hideBusyMask() {
|
public void hideBusyMask() {
|
||||||
if (mask != null && mask.getParent() != null) {
|
if (mask != null && mask.getParent() != null) {
|
||||||
mask.detach();
|
mask.detach();
|
||||||
|
@ -3538,6 +3563,10 @@ public abstract class AbstractADWindowContent extends AbstractUIPart implements
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* show busy mask over window
|
||||||
|
* @param window
|
||||||
|
*/
|
||||||
public void showBusyMask(Window window) {
|
public void showBusyMask(Window window) {
|
||||||
getComponent().getParent().appendChild(getMask());
|
getComponent().getParent().appendChild(getMask());
|
||||||
StringBuilder script = new StringBuilder("(function(){let w=zk.Widget.$('#");
|
StringBuilder script = new StringBuilder("(function(){let w=zk.Widget.$('#");
|
||||||
|
@ -3595,6 +3624,14 @@ public abstract class AbstractADWindowContent extends AbstractUIPart implements
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param wButton
|
||||||
|
* @param startWOasking
|
||||||
|
* @param table_ID
|
||||||
|
* @param record_ID
|
||||||
|
* @param isProcessMandatory
|
||||||
|
*/
|
||||||
public void executeButtonProcess(final IProcessButton wButton,
|
public void executeButtonProcess(final IProcessButton wButton,
|
||||||
final boolean startWOasking, final int table_ID, final int record_ID,
|
final boolean startWOasking, final int table_ID, final int record_ID,
|
||||||
boolean isProcessMandatory) {
|
boolean isProcessMandatory) {
|
||||||
|
@ -3797,6 +3834,7 @@ public abstract class AbstractADWindowContent extends AbstractUIPart implements
|
||||||
* @param event
|
* @param event
|
||||||
* @see ActionListener#actionPerformed(ActionEvent)
|
* @see ActionListener#actionPerformed(ActionEvent)
|
||||||
*/
|
*/
|
||||||
|
@Override
|
||||||
public void actionPerformed(final ActionEvent event)
|
public void actionPerformed(final ActionEvent event)
|
||||||
{
|
{
|
||||||
Runnable runnable = new Runnable() {
|
Runnable runnable = new Runnable() {
|
||||||
|
@ -3857,6 +3895,11 @@ public abstract class AbstractADWindowContent extends AbstractUIPart implements
|
||||||
}
|
}
|
||||||
} // processButtonCallout
|
} // processButtonCallout
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param button
|
||||||
|
* @return {@link IADTabpanel}
|
||||||
|
*/
|
||||||
public IADTabpanel findADTabpanel(IProcessButton button) {
|
public IADTabpanel findADTabpanel(IProcessButton button) {
|
||||||
IADTabpanel adtab = null;
|
IADTabpanel adtab = null;
|
||||||
if (button.getADTabpanel() != null)
|
if (button.getADTabpanel() != null)
|
||||||
|
@ -3982,6 +4025,7 @@ public abstract class AbstractADWindowContent extends AbstractUIPart implements
|
||||||
* @see CustomizeGridViewDialog
|
* @see CustomizeGridViewDialog
|
||||||
* @see ToolbarListener#onCustomize()
|
* @see ToolbarListener#onCustomize()
|
||||||
*/
|
*/
|
||||||
|
@Override
|
||||||
public void onCustomize() {
|
public void onCustomize() {
|
||||||
ADTabpanel tabPanel = (ADTabpanel) getADTab().getSelectedTabpanel();
|
ADTabpanel tabPanel = (ADTabpanel) getADTab().getSelectedTabpanel();
|
||||||
CustomizeGridViewDialog.onCustomize(tabPanel, b -> {
|
CustomizeGridViewDialog.onCustomize(tabPanel, b -> {
|
||||||
|
@ -4013,18 +4057,35 @@ public abstract class AbstractADWindowContent extends AbstractUIPart implements
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @return true if dirty
|
||||||
|
*/
|
||||||
public boolean isPendingChanges() {
|
public boolean isPendingChanges() {
|
||||||
return adTabbox.getDirtyADTabpanel() != null;
|
return adTabbox.getDirtyADTabpanel() != null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param adwindow
|
||||||
|
*/
|
||||||
public void setADWindow(ADWindow adwindow) {
|
public void setADWindow(ADWindow adwindow) {
|
||||||
this.adwindow = adwindow;
|
this.adwindow = adwindow;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @return {@link ADWindow}
|
||||||
|
*/
|
||||||
public ADWindow getADWindow() {
|
public ADWindow getADWindow() {
|
||||||
return adwindow;
|
return adwindow;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param findFields
|
||||||
|
* @return true if find window found and init ok
|
||||||
|
*/
|
||||||
public boolean getFindWindow(GridField[] findFields) {
|
public boolean getFindWindow(GridField[] findFields) {
|
||||||
FindWindow findWindow = getCurrentFindWindow();
|
FindWindow findWindow = getCurrentFindWindow();
|
||||||
if (findWindow != null && isCurrentFindWindowValid()) {
|
if (findWindow != null && isCurrentFindWindowValid()) {
|
||||||
|
@ -4046,6 +4107,10 @@ public abstract class AbstractADWindowContent extends AbstractUIPart implements
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @return {@link FindWindow}
|
||||||
|
*/
|
||||||
public FindWindow getCurrentFindWindow() {
|
public FindWindow getCurrentFindWindow() {
|
||||||
return tabFindWindowHashMap.get(adTabbox.getSelectedGridTab());
|
return tabFindWindowHashMap.get(adTabbox.getSelectedGridTab());
|
||||||
}
|
}
|
||||||
|
@ -4114,10 +4179,10 @@ public abstract class AbstractADWindowContent extends AbstractUIPart implements
|
||||||
/**
|
/**
|
||||||
* Implementation to work key listener for the current open Quick Form.
|
* Implementation to work key listener for the current open Quick Form.
|
||||||
*/
|
*/
|
||||||
QuickGridView currQGV = null;
|
protected QuickGridView currQGV = null;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return
|
* @return {@link QuickGridView}
|
||||||
*/
|
*/
|
||||||
public QuickGridView getCurrQGV()
|
public QuickGridView getCurrQGV()
|
||||||
{
|
{
|
||||||
|
|
|
@ -86,6 +86,10 @@ public class CompositeADTabbox extends AbstractADTabbox
|
||||||
public CompositeADTabbox(){
|
public CompositeADTabbox(){
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create detail panel at bottom
|
||||||
|
* @return {@link DetailPane}
|
||||||
|
*/
|
||||||
protected DetailPane createDetailPane() {
|
protected DetailPane createDetailPane() {
|
||||||
DetailPane detailPane = new DetailPane();
|
DetailPane detailPane = new DetailPane();
|
||||||
detailPane.setEventListener(new EventListener<Event>() {
|
detailPane.setEventListener(new EventListener<Event>() {
|
||||||
|
@ -285,6 +289,11 @@ public class CompositeADTabbox extends AbstractADTabbox
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Edit selected detail tab
|
||||||
|
* @param row
|
||||||
|
* @param formView
|
||||||
|
*/
|
||||||
protected void onEditDetail(int row, boolean formView) {
|
protected void onEditDetail(int row, boolean formView) {
|
||||||
|
|
||||||
int oldIndex = selectedIndex;
|
int oldIndex = selectedIndex;
|
||||||
|
@ -318,6 +327,7 @@ public class CompositeADTabbox extends AbstractADTabbox
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
protected Component doCreatePart(Component parent)
|
protected Component doCreatePart(Component parent)
|
||||||
{
|
{
|
||||||
layout = new Vlayout();
|
layout = new Vlayout();
|
||||||
|
@ -550,15 +560,18 @@ public class CompositeADTabbox extends AbstractADTabbox
|
||||||
/**
|
/**
|
||||||
* Return the selected Tab Panel
|
* Return the selected Tab Panel
|
||||||
*/
|
*/
|
||||||
|
@Override
|
||||||
public IADTabpanel getSelectedTabpanel()
|
public IADTabpanel getSelectedTabpanel()
|
||||||
{
|
{
|
||||||
return tabPanelList.isEmpty() ? null : tabPanelList.get(selectedIndex);
|
return tabPanelList.isEmpty() ? null : tabPanelList.get(selectedIndex);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public int getSelectedIndex() {
|
public int getSelectedIndex() {
|
||||||
return selectedIndex;
|
return selectedIndex;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public void setSelectionEventListener(EventListener<Event> listener) {
|
public void setSelectionEventListener(EventListener<Event> listener) {
|
||||||
selectionListener = listener;
|
selectionListener = listener;
|
||||||
}
|
}
|
||||||
|
@ -575,7 +588,7 @@ public class CompositeADTabbox extends AbstractADTabbox
|
||||||
newTabpanel.setVisible(true);
|
newTabpanel.setVisible(true);
|
||||||
|
|
||||||
headerTab = newTabpanel;
|
headerTab = newTabpanel;
|
||||||
layout.getChildren().clear();
|
if (headerTab.getParent() != layout)
|
||||||
layout.appendChild(headerTab);
|
layout.appendChild(headerTab);
|
||||||
|
|
||||||
//set state
|
//set state
|
||||||
|
@ -643,7 +656,8 @@ public class CompositeADTabbox extends AbstractADTabbox
|
||||||
if (tabPanel.isActivated() && !tabPanel.isGridView()) {
|
if (tabPanel.isActivated() && !tabPanel.isGridView()) {
|
||||||
tabPanel.switchRowPresentation();
|
tabPanel.switchRowPresentation();
|
||||||
}
|
}
|
||||||
if (tabPanel.getParent() != null) tabPanel.detach();
|
if (tabPanel.getParent() != null)
|
||||||
|
tabPanel.setVisible(false);
|
||||||
}
|
}
|
||||||
tabPanel.setDetailPaneMode(true);
|
tabPanel.setDetailPaneMode(true);
|
||||||
detailPane.setADTabpanel(tabIndex, tabPanel, tabLabel, enable.booleanValue());
|
detailPane.setADTabpanel(tabIndex, tabPanel, tabLabel, enable.booleanValue());
|
||||||
|
@ -797,6 +811,7 @@ public class CompositeADTabbox extends AbstractADTabbox
|
||||||
return breadCrumb;
|
return breadCrumb;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public Component getComponent() {
|
public Component getComponent() {
|
||||||
return layout;
|
return layout;
|
||||||
}
|
}
|
||||||
|
@ -875,6 +890,10 @@ public class CompositeADTabbox extends AbstractADTabbox
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @return true if selected detail tab have been activated
|
||||||
|
*/
|
||||||
public boolean isDetailActivated() {
|
public boolean isDetailActivated() {
|
||||||
if (headerTab instanceof ADTabpanel) {
|
if (headerTab instanceof ADTabpanel) {
|
||||||
ADTabpanel atp = (ADTabpanel) headerTab;
|
ADTabpanel atp = (ADTabpanel) headerTab;
|
||||||
|
|
|
@ -51,12 +51,14 @@ import org.compiere.util.Env;
|
||||||
import org.compiere.util.Msg;
|
import org.compiere.util.Msg;
|
||||||
import org.compiere.util.Util;
|
import org.compiere.util.Util;
|
||||||
import org.zkoss.zk.au.out.AuScript;
|
import org.zkoss.zk.au.out.AuScript;
|
||||||
|
import org.zkoss.zk.ui.AbstractComponent;
|
||||||
import org.zkoss.zk.ui.Component;
|
import org.zkoss.zk.ui.Component;
|
||||||
import org.zkoss.zk.ui.Executions;
|
import org.zkoss.zk.ui.Executions;
|
||||||
import org.zkoss.zk.ui.HtmlBasedComponent;
|
import org.zkoss.zk.ui.HtmlBasedComponent;
|
||||||
import org.zkoss.zk.ui.event.Event;
|
import org.zkoss.zk.ui.event.Event;
|
||||||
import org.zkoss.zk.ui.event.EventListener;
|
import org.zkoss.zk.ui.event.EventListener;
|
||||||
import org.zkoss.zk.ui.event.Events;
|
import org.zkoss.zk.ui.event.Events;
|
||||||
|
import org.zkoss.zk.ui.sys.ComponentCtrl;
|
||||||
import org.zkoss.zk.ui.util.Clients;
|
import org.zkoss.zk.ui.util.Clients;
|
||||||
import org.zkoss.zul.Cell;
|
import org.zkoss.zul.Cell;
|
||||||
import org.zkoss.zul.Grid;
|
import org.zkoss.zul.Grid;
|
||||||
|
@ -169,13 +171,18 @@ public class GridTabRowRenderer implements RowRenderer<Object[]>, RowRendererExt
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param field
|
||||||
|
* @return column index, -1 if not found
|
||||||
|
*/
|
||||||
public int getColumnIndex(GridField field) {
|
public int getColumnIndex(GridField field) {
|
||||||
GridField[] fields = gridPanel.getFields();
|
GridField[] fields = gridPanel.getFields();
|
||||||
for(int i = 0; i < fields.length; i++) {
|
for(int i = 0; i < fields.length; i++) {
|
||||||
if (fields[i] == field)
|
if (fields[i] == field)
|
||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
return 0;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
private Component createReadonlyCheckbox(Object value) {
|
private Component createReadonlyCheckbox(Object value) {
|
||||||
|
@ -342,9 +349,6 @@ public class GridTabRowRenderer implements RowRenderer<Object[]>, RowRendererExt
|
||||||
final int MAX_TEXT_LENGTH = MSysConfig.getIntValue(MSysConfig.MAX_TEXT_LENGTH_ON_GRID_VIEW,MAX_TEXT_LENGTH_DEFAULT,Env.getAD_Client_ID(Env.getCtx()));
|
final int MAX_TEXT_LENGTH = MSysConfig.getIntValue(MSysConfig.MAX_TEXT_LENGTH_ON_GRID_VIEW,MAX_TEXT_LENGTH_DEFAULT,Env.getAD_Client_ID(Env.getCtx()));
|
||||||
if (text != null && text.length() > MAX_TEXT_LENGTH)
|
if (text != null && text.length() > MAX_TEXT_LENGTH)
|
||||||
display = text.substring(0, MAX_TEXT_LENGTH - 3) + "...";
|
display = text.substring(0, MAX_TEXT_LENGTH - 3) + "...";
|
||||||
// since 5.0.8, the org.zkoss.zhtml.Text is encoded by default
|
|
||||||
// if (display != null)
|
|
||||||
// display = XMLs.encodeText(display);
|
|
||||||
label.setValue(display);
|
label.setValue(display);
|
||||||
if (text != null && text.length() > MAX_TEXT_LENGTH)
|
if (text != null && text.length() > MAX_TEXT_LENGTH)
|
||||||
label.setTooltiptext(text);
|
label.setTooltiptext(text);
|
||||||
|
@ -540,10 +544,13 @@ public class GridTabRowRenderer implements RowRenderer<Object[]>, RowRendererExt
|
||||||
readOnlyEditors.put(gridPanelFields[i], readOnlyEditor);
|
readOnlyEditors.put(gridPanelFields[i], readOnlyEditor);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (editor.getComponent() instanceof AbstractComponent) {
|
||||||
editor.getComponent().setWidgetOverride("fieldHeader", HelpController.escapeJavascriptContent(gridPanelFields[i].getHeader()));
|
editor.getComponent().setWidgetOverride("fieldHeader", HelpController.escapeJavascriptContent(gridPanelFields[i].getHeader()));
|
||||||
editor.getComponent().setWidgetOverride("fieldDescription", HelpController.escapeJavascriptContent(gridPanelFields[i].getDescription()));
|
editor.getComponent().setWidgetOverride("fieldDescription", HelpController.escapeJavascriptContent(gridPanelFields[i].getDescription()));
|
||||||
editor.getComponent().setWidgetOverride("fieldHelp", HelpController.escapeJavascriptContent(gridPanelFields[i].getHelp()));
|
editor.getComponent().setWidgetOverride("fieldHelp", HelpController.escapeJavascriptContent(gridPanelFields[i].getHelp()));
|
||||||
editor.getComponent().setWidgetListener("onFocus", "zWatch.fire('onFieldTooltip', this, null, this.fieldHeader(), this.fieldDescription(), this.fieldHelp());");
|
editor.getComponent().setWidgetListener("onFocus", "zWatch.fire('onFieldTooltip', this, null, this.fieldHeader(), this.fieldDescription(), this.fieldHelp());");
|
||||||
|
((AbstractComponent)editor.getComponent()).addCallback(ComponentCtrl.AFTER_PAGE_DETACHED, (t) -> {((AbstractComponent)t).setWidgetListener("onFocus", null);});
|
||||||
|
}
|
||||||
|
|
||||||
// Default Focus
|
// Default Focus
|
||||||
if (defaultFocusField == null && gridPanelFields[i].isDefaultFocus())
|
if (defaultFocusField == null && gridPanelFields[i].isDefaultFocus())
|
||||||
|
@ -778,6 +785,7 @@ public class GridTabRowRenderer implements RowRenderer<Object[]>, RowRendererExt
|
||||||
/**
|
/**
|
||||||
* @see RowRendererExt#getControls()
|
* @see RowRendererExt#getControls()
|
||||||
*/
|
*/
|
||||||
|
@Override
|
||||||
public int getControls() {
|
public int getControls() {
|
||||||
return DETACH_ON_RENDER;
|
return DETACH_ON_RENDER;
|
||||||
}
|
}
|
||||||
|
@ -785,6 +793,7 @@ public class GridTabRowRenderer implements RowRenderer<Object[]>, RowRendererExt
|
||||||
/**
|
/**
|
||||||
* @see RowRendererExt#newCell(Row)
|
* @see RowRendererExt#newCell(Row)
|
||||||
*/
|
*/
|
||||||
|
@Override
|
||||||
public Component newCell(Row row) {
|
public Component newCell(Row row) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
@ -792,6 +801,7 @@ public class GridTabRowRenderer implements RowRenderer<Object[]>, RowRendererExt
|
||||||
/**
|
/**
|
||||||
* @see RowRendererExt#newRow(Grid)
|
* @see RowRendererExt#newRow(Grid)
|
||||||
*/
|
*/
|
||||||
|
@Override
|
||||||
public Row newRow(Grid grid) {
|
public Row newRow(Grid grid) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
@ -799,18 +809,21 @@ public class GridTabRowRenderer implements RowRenderer<Object[]>, RowRendererExt
|
||||||
/**
|
/**
|
||||||
* @see RendererCtrl#doCatch(Throwable)
|
* @see RendererCtrl#doCatch(Throwable)
|
||||||
*/
|
*/
|
||||||
|
@Override
|
||||||
public void doCatch(Throwable ex) throws Throwable {
|
public void doCatch(Throwable ex) throws Throwable {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @see RendererCtrl#doFinally()
|
* @see RendererCtrl#doFinally()
|
||||||
*/
|
*/
|
||||||
|
@Override
|
||||||
public void doFinally() {
|
public void doFinally() {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @see RendererCtrl#doTry()
|
* @see RendererCtrl#doTry()
|
||||||
*/
|
*/
|
||||||
|
@Override
|
||||||
public void doTry() {
|
public void doTry() {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -847,6 +860,10 @@ public class GridTabRowRenderer implements RowRenderer<Object[]>, RowRendererExt
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param toFocus
|
||||||
|
*/
|
||||||
protected void focusToEditor(WEditor toFocus) {
|
protected void focusToEditor(WEditor toFocus) {
|
||||||
Component c = toFocus.getComponent();
|
Component c = toFocus.getComponent();
|
||||||
if (c instanceof EditorBox) {
|
if (c instanceof EditorBox) {
|
||||||
|
@ -915,7 +932,7 @@ public class GridTabRowRenderer implements RowRenderer<Object[]>, RowRendererExt
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return boolean
|
* @return true if it is in edit mode, false otherwise
|
||||||
*/
|
*/
|
||||||
public boolean isEditing() {
|
public boolean isEditing() {
|
||||||
return editing;
|
return editing;
|
||||||
|
|
|
@ -80,6 +80,7 @@ import org.zkoss.zk.ui.Execution;
|
||||||
import org.zkoss.zk.ui.Executions;
|
import org.zkoss.zk.ui.Executions;
|
||||||
import org.zkoss.zk.ui.event.Event;
|
import org.zkoss.zk.ui.event.Event;
|
||||||
import org.zkoss.zk.ui.event.EventListener;
|
import org.zkoss.zk.ui.event.EventListener;
|
||||||
|
import org.zkoss.zul.impl.InputElement;
|
||||||
|
|
||||||
import com.lowagie.text.DocumentException;
|
import com.lowagie.text.DocumentException;
|
||||||
|
|
||||||
|
@ -874,4 +875,20 @@ public final class AEnv
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Workaround for detached HTML input element leak
|
||||||
|
* @param c
|
||||||
|
*/
|
||||||
|
public static void detachInputElement(Component c) {
|
||||||
|
if (c instanceof InputElement) {
|
||||||
|
c.detach();
|
||||||
|
}
|
||||||
|
if (c.getChildren().size() > 0) {
|
||||||
|
Component[] childs = c.getChildren().toArray(new Component[0]);
|
||||||
|
for(Component c1 : childs) {
|
||||||
|
detachInputElement(c1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
} // AEnv
|
} // AEnv
|
||||||
|
|
|
@ -23,6 +23,7 @@ import org.adempiere.webui.AdempiereIdGenerator;
|
||||||
import org.adempiere.webui.LayoutUtils;
|
import org.adempiere.webui.LayoutUtils;
|
||||||
import org.zkoss.zk.au.out.AuScript;
|
import org.zkoss.zk.au.out.AuScript;
|
||||||
import org.zkoss.zk.ui.IdSpace;
|
import org.zkoss.zk.ui.IdSpace;
|
||||||
|
import org.zkoss.zk.ui.Page;
|
||||||
import org.zkoss.zk.ui.WrongValueException;
|
import org.zkoss.zk.ui.WrongValueException;
|
||||||
import org.zkoss.zk.ui.event.Events;
|
import org.zkoss.zk.ui.event.Events;
|
||||||
import org.zkoss.zk.ui.util.Clients;
|
import org.zkoss.zk.ui.util.Clients;
|
||||||
|
@ -172,15 +173,6 @@ public class Combobox extends org.zkoss.zul.Combobox implements IdSpace
|
||||||
return item.getValue().equals(value);
|
return item.getValue().equals(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
//TODO: Find zk6 replacement
|
|
||||||
/** Returns RS_NO_WIDTH|RS_NO_HEIGHT.
|
|
||||||
*/
|
|
||||||
/*
|
|
||||||
protected int getRealStyleFlags() {
|
|
||||||
return super.getRealStyleFlags() & 0x0006;
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
//http://jira.idempiere.com/browse/IDEMPIERE-443
|
//http://jira.idempiere.com/browse/IDEMPIERE-443
|
||||||
//undocumented api hack to ensure onSelect always fire for mouse selection
|
//undocumented api hack to ensure onSelect always fire for mouse selection
|
||||||
public void clearLastSel() {
|
public void clearLastSel() {
|
||||||
|
@ -196,4 +188,10 @@ public class Combobox extends org.zkoss.zul.Combobox implements IdSpace
|
||||||
String script = "(function(me){let id='#'+me.uuid+'-pp .z-comboitem-selected';let selected=zk($(id));if(selected.jq.length==1)selected.scrollIntoView();})(this)";
|
String script = "(function(me){let id='#'+me.uuid+'-pp .z-comboitem-selected';let selected=zk($(id));if(selected.jq.length==1)selected.scrollIntoView();})(this)";
|
||||||
setWidgetListener("onKeyUp", script);
|
setWidgetListener("onKeyUp", script);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onPageDetached(Page page) {
|
||||||
|
setWidgetListener("onKeyUp", null);
|
||||||
|
super.onPageDetached(page);
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -22,6 +22,7 @@ import java.util.HashSet;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
import org.adempiere.webui.adwindow.ADWindow;
|
import org.adempiere.webui.adwindow.ADWindow;
|
||||||
|
import org.adempiere.webui.apps.AEnv;
|
||||||
import org.adempiere.webui.theme.ThemeManager;
|
import org.adempiere.webui.theme.ThemeManager;
|
||||||
import org.adempiere.webui.util.ManageImageCache;
|
import org.adempiere.webui.util.ManageImageCache;
|
||||||
import org.compiere.model.MImage;
|
import org.compiere.model.MImage;
|
||||||
|
@ -31,6 +32,8 @@ import org.compiere.util.Env;
|
||||||
import org.compiere.util.Util;
|
import org.compiere.util.Util;
|
||||||
import org.zkoss.image.Image;
|
import org.zkoss.image.Image;
|
||||||
import org.zkoss.zk.ui.Component;
|
import org.zkoss.zk.ui.Component;
|
||||||
|
import org.zkoss.zk.ui.Executions;
|
||||||
|
import org.zkoss.zk.ui.event.Event;
|
||||||
import org.zkoss.zk.ui.event.Events;
|
import org.zkoss.zk.ui.event.Events;
|
||||||
import org.zkoss.zk.ui.event.SelectEvent;
|
import org.zkoss.zk.ui.event.SelectEvent;
|
||||||
import org.zkoss.zul.Include;
|
import org.zkoss.zul.Include;
|
||||||
|
@ -180,16 +183,27 @@ public class Tab extends org.zkoss.zul.Tab
|
||||||
((Tabbox)getTabbox()).removeTabFromActiveSeq(this);
|
((Tabbox)getTabbox()).removeTabFromActiveSeq(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//Workaround for detached HTML input element leak
|
||||||
|
if (panel != null) {
|
||||||
|
Executions.schedule(getDesktop(), e -> panel.detach(), new Event("onCloseLinkedPanel"));
|
||||||
|
}
|
||||||
|
|
||||||
detach();
|
detach();
|
||||||
|
|
||||||
if (panel != null) {
|
if (panel != null) {
|
||||||
|
//Workaround for detached HTML input element leak
|
||||||
|
if (panel.getChildren().size() > 0) {
|
||||||
|
Component[] childs = panel.getChildren().toArray(new Component[0]);
|
||||||
|
for(Component c : childs) {
|
||||||
|
AEnv.detachInputElement(c);
|
||||||
|
}
|
||||||
|
}
|
||||||
// B60-ZK-1160: Exception when closing tab with included content
|
// B60-ZK-1160: Exception when closing tab with included content
|
||||||
// Must clean up included content before detaching tab panel
|
// Must clean up included content before detaching tab panel
|
||||||
Component include = panel.getFirstChild();
|
Component include = panel.getFirstChild();
|
||||||
if (include instanceof Include) {
|
if (include instanceof Include) {
|
||||||
include.detach();
|
include.detach();
|
||||||
}
|
}
|
||||||
panel.detach();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -923,5 +923,11 @@ public class WSearchEditor extends WEditor implements ContextMenuListener, Value
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onPageDetached(Page page) {
|
||||||
|
setWidgetListener("onChange", null);
|
||||||
|
super.onPageDetached(page);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -35,10 +35,12 @@ import org.adempiere.webui.window.WTextEditorDialog;
|
||||||
import org.compiere.model.GridField;
|
import org.compiere.model.GridField;
|
||||||
import org.compiere.model.I_R_MailText;
|
import org.compiere.model.I_R_MailText;
|
||||||
import org.compiere.util.DisplayType;
|
import org.compiere.util.DisplayType;
|
||||||
|
import org.zkoss.zk.ui.AbstractComponent;
|
||||||
import org.zkoss.zk.ui.Component;
|
import org.zkoss.zk.ui.Component;
|
||||||
import org.zkoss.zk.ui.event.Event;
|
import org.zkoss.zk.ui.event.Event;
|
||||||
import org.zkoss.zk.ui.event.EventListener;
|
import org.zkoss.zk.ui.event.EventListener;
|
||||||
import org.zkoss.zk.ui.event.Events;
|
import org.zkoss.zk.ui.event.Events;
|
||||||
|
import org.zkoss.zk.ui.sys.ComponentCtrl;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
|
@ -188,6 +190,8 @@ public class WStringEditor extends WEditor implements ContextMenuListener
|
||||||
if (gridField != null)
|
if (gridField != null)
|
||||||
getComponent().setPlaceholder(gridField.getPlaceholder());
|
getComponent().setPlaceholder(gridField.getPlaceholder());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
getComponent().addCallback(ComponentCtrl.AFTER_PAGE_DETACHED, t -> ((AbstractComponent)t).setWidgetListener("onBind", null));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void onEvent(Event event)
|
public void onEvent(Event event)
|
||||||
|
|
|
@ -1,6 +1,27 @@
|
||||||
/**
|
/***********************************************************************
|
||||||
*
|
* 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: *
|
||||||
|
* - hengsin *
|
||||||
|
**********************************************************************/
|
||||||
package org.adempiere.webui.info;
|
package org.adempiere.webui.info;
|
||||||
|
|
||||||
import java.sql.PreparedStatement;
|
import java.sql.PreparedStatement;
|
||||||
|
@ -195,7 +216,6 @@ public class InfoProductWindow extends InfoWindow {
|
||||||
warehouseTbl.setShowTotals(true);
|
warehouseTbl.setShowTotals(true);
|
||||||
warehouseTbl.autoSize();
|
warehouseTbl.autoSize();
|
||||||
warehouseTbl.setwListBoxName("AD_InfoWindow_UU|"+ infoWindow.getAD_InfoWindow_UU() +"|stock");
|
warehouseTbl.setwListBoxName("AD_InfoWindow_UU|"+ infoWindow.getAD_InfoWindow_UU() +"|stock");
|
||||||
// warehouseTbl.getModel().addTableModelListener(this);
|
|
||||||
|
|
||||||
ColumnInfo[] s_layoutSubstitute = new ColumnInfo[]{
|
ColumnInfo[] s_layoutSubstitute = new ColumnInfo[]{
|
||||||
new ColumnInfo(Msg.translate(Env.getCtx(), "Warehouse"), "orgname", String.class, true, "orgname"),
|
new ColumnInfo(Msg.translate(Env.getCtx(), "Warehouse"), "orgname", String.class, true, "orgname"),
|
||||||
|
@ -214,7 +234,6 @@ public class InfoProductWindow extends InfoWindow {
|
||||||
substituteTbl.setMultiSelection(false);
|
substituteTbl.setMultiSelection(false);
|
||||||
substituteTbl.autoSize();
|
substituteTbl.autoSize();
|
||||||
substituteTbl.setwListBoxName("AD_InfoWindow_UU|"+ infoWindow.getAD_InfoWindow_UU() + "|substitute");
|
substituteTbl.setwListBoxName("AD_InfoWindow_UU|"+ infoWindow.getAD_InfoWindow_UU() + "|substitute");
|
||||||
// substituteTbl.getModel().addTableModelListener(this);
|
|
||||||
|
|
||||||
ColumnInfo[] s_layoutRelated = new ColumnInfo[]{
|
ColumnInfo[] s_layoutRelated = new ColumnInfo[]{
|
||||||
new ColumnInfo(Msg.translate(Env.getCtx(), "Warehouse"), "orgname", String.class, true, "orgname"),
|
new ColumnInfo(Msg.translate(Env.getCtx(), "Warehouse"), "orgname", String.class, true, "orgname"),
|
||||||
|
@ -274,7 +293,6 @@ public class InfoProductWindow extends InfoWindow {
|
||||||
productpriceTbl.setMultiSelection(false);
|
productpriceTbl.setMultiSelection(false);
|
||||||
productpriceTbl.autoSize();
|
productpriceTbl.autoSize();
|
||||||
productpriceTbl.setwListBoxName("AD_InfoWindow_UU|" + infoWindow.getAD_InfoWindow_UU() + "|price");
|
productpriceTbl.setwListBoxName("AD_InfoWindow_UU|" + infoWindow.getAD_InfoWindow_UU() + "|price");
|
||||||
// productpriceTbl.getModel().addTableModelListener(this);
|
|
||||||
|
|
||||||
tabbedPane = new Tabbox();
|
tabbedPane = new Tabbox();
|
||||||
ZKUpdateUtil.setHeight(tabbedPane, "100%");
|
ZKUpdateUtil.setHeight(tabbedPane, "100%");
|
||||||
|
@ -415,6 +433,9 @@ public class InfoProductWindow extends InfoWindow {
|
||||||
m_tableAtp.repaint();
|
m_tableAtp.repaint();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* handle on click event for product attribute
|
||||||
|
*/
|
||||||
protected void onPAttributeClick() {
|
protected void onPAttributeClick() {
|
||||||
Integer productInteger = getSelectedRowKey();
|
Integer productInteger = getSelectedRowKey();
|
||||||
if (productInteger == null) {
|
if (productInteger == null) {
|
||||||
|
@ -443,6 +464,10 @@ public class InfoProductWindow extends InfoWindow {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @return label for selected warehouse parameter
|
||||||
|
*/
|
||||||
protected String getSelectedWarehouseLabel() {
|
protected String getSelectedWarehouseLabel() {
|
||||||
for(WEditor editor : editors) {
|
for(WEditor editor : editors) {
|
||||||
if (editor.getGridField() != null && editor.getGridField().getColumnName().equals("M_Warehouse_ID")) {
|
if (editor.getGridField() != null && editor.getGridField().getColumnName().equals("M_Warehouse_ID")) {
|
||||||
|
@ -456,6 +481,10 @@ public class InfoProductWindow extends InfoWindow {
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @return id for selected price list version parameter
|
||||||
|
*/
|
||||||
protected int getSelectedPriceListVersionId() {
|
protected int getSelectedPriceListVersionId() {
|
||||||
for(WEditor editor : editors) {
|
for(WEditor editor : editors) {
|
||||||
if (editor.getGridField() != null && editor.getGridField().getColumnName().equals("M_PriceList_Version_ID")) {
|
if (editor.getGridField() != null && editor.getGridField().getColumnName().equals("M_PriceList_Version_ID")) {
|
||||||
|
@ -469,6 +498,10 @@ public class InfoProductWindow extends InfoWindow {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @return id for selected warehouse parameter
|
||||||
|
*/
|
||||||
protected int getSelectedWarehouseId() {
|
protected int getSelectedWarehouseId() {
|
||||||
for(WEditor editor : editors) {
|
for(WEditor editor : editors) {
|
||||||
if (editor.getGridField() != null && editor.getGridField().getColumnName().equals("M_Warehouse_ID")) {
|
if (editor.getGridField() != null && editor.getGridField().getColumnName().equals("M_Warehouse_ID")) {
|
||||||
|
@ -636,6 +669,8 @@ public class InfoProductWindow extends InfoWindow {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Refresh Query
|
* Refresh Query
|
||||||
|
* @param M_Warehouse_ID
|
||||||
|
* @param M_PriceList_Version_ID
|
||||||
*/
|
*/
|
||||||
protected void refresh(int M_Warehouse_ID, int M_PriceList_Version_ID)
|
protected void refresh(int M_Warehouse_ID, int M_PriceList_Version_ID)
|
||||||
{
|
{
|
||||||
|
@ -719,7 +754,7 @@ public class InfoProductWindow extends InfoWindow {
|
||||||
|
|
||||||
// Elaine 2008/11/26
|
// Elaine 2008/11/26
|
||||||
/**
|
/**
|
||||||
* Query ATP
|
* Query Avaiable to promise (ATP)
|
||||||
* @param m_M_Warehouse_ID
|
* @param m_M_Warehouse_ID
|
||||||
* @param m_M_Product_ID
|
* @param m_M_Product_ID
|
||||||
*/
|
*/
|
||||||
|
@ -873,6 +908,9 @@ public class InfoProductWindow extends InfoWindow {
|
||||||
m_tableAtp.setData(model, columnNames);
|
m_tableAtp.setData(model, columnNames);
|
||||||
} // initAtpTab
|
} // initAtpTab
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return true if show detail of ATP
|
||||||
|
*/
|
||||||
public boolean isShowDetailATP() {
|
public boolean isShowDetailATP() {
|
||||||
return chbShowDetailAtp.isChecked();
|
return chbShowDetailAtp.isChecked();
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,24 @@
|
||||||
/**
|
/***********************************************************************
|
||||||
*
|
* 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. *
|
||||||
|
**********************************************************************/
|
||||||
package org.adempiere.webui.info;
|
package org.adempiere.webui.info;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
|
@ -128,6 +146,7 @@ import org.zkoss.zul.South;
|
||||||
import org.zkoss.zul.Space;
|
import org.zkoss.zul.Space;
|
||||||
import org.zkoss.zul.Vbox;
|
import org.zkoss.zul.Vbox;
|
||||||
import org.zkoss.zul.Vlayout;
|
import org.zkoss.zul.Vlayout;
|
||||||
|
import org.zkoss.zul.event.ZulEvents;
|
||||||
import org.zkoss.zul.impl.InputElement;
|
import org.zkoss.zul.impl.InputElement;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -155,9 +174,9 @@ public class InfoWindow extends InfoPanel implements ValueChangeListener, EventL
|
||||||
protected Properties infoContext;
|
protected Properties infoContext;
|
||||||
|
|
||||||
/** embedded Panel **/
|
/** embedded Panel **/
|
||||||
Tabbox embeddedPane = new Tabbox();
|
protected Tabbox embeddedPane = new Tabbox();
|
||||||
ArrayList <EmbedWinInfo> embeddedWinList = new ArrayList <EmbedWinInfo>();
|
protected ArrayList <EmbedWinInfo> embeddedWinList = new ArrayList <EmbedWinInfo>();
|
||||||
Map<Integer, RelatedInfoWindow> relatedMap = new HashMap<>();
|
protected Map<Integer, RelatedInfoWindow> relatedMap = new HashMap<>();
|
||||||
|
|
||||||
/** Max Length of Fields */
|
/** Max Length of Fields */
|
||||||
public static final int FIELDLENGTH = 20;
|
public static final int FIELDLENGTH = 20;
|
||||||
|
@ -579,6 +598,9 @@ public class InfoWindow extends InfoPanel implements ValueChangeListener, EventL
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* process query value from input element
|
||||||
|
*/
|
||||||
protected void processQueryValue() {
|
protected void processQueryValue() {
|
||||||
isQueryByUser = true;
|
isQueryByUser = true;
|
||||||
for (int i = 0; i < identifiers.size(); i++) {
|
for (int i = 0; i < identifiers.size(); i++) {
|
||||||
|
@ -650,6 +672,10 @@ public class InfoWindow extends InfoPanel implements ValueChangeListener, EventL
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* load info window definition
|
||||||
|
* @return true if loaded ok
|
||||||
|
*/
|
||||||
protected boolean loadInfoDefinition() {
|
protected boolean loadInfoDefinition() {
|
||||||
if (infoWindow != null) {
|
if (infoWindow != null) {
|
||||||
String tableName = null;
|
String tableName = null;
|
||||||
|
@ -790,7 +816,10 @@ public class InfoWindow extends InfoPanel implements ValueChangeListener, EventL
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//private InfoColumnVO[] topinfoColumns;//infoWindow.getInfoColumns(tableInfos);
|
/**
|
||||||
|
* load related info
|
||||||
|
* @return true if loaded ok
|
||||||
|
*/
|
||||||
protected boolean loadInfoRelatedTabs() {
|
protected boolean loadInfoRelatedTabs() {
|
||||||
if (infoWindow == null)
|
if (infoWindow == null)
|
||||||
return false;
|
return false;
|
||||||
|
@ -891,6 +920,9 @@ public class InfoWindow extends InfoPanel implements ValueChangeListener, EventL
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* setup list box and construct sql query clause
|
||||||
|
*/
|
||||||
protected void prepareTable() {
|
protected void prepareTable() {
|
||||||
List<ColumnInfo> list = new ArrayList<ColumnInfo>();
|
List<ColumnInfo> list = new ArrayList<ColumnInfo>();
|
||||||
String keyTableAlias = tableInfos[0].getSynonym() != null && tableInfos[0].getSynonym().trim().length() > 0
|
String keyTableAlias = tableInfos[0].getSynonym() != null && tableInfos[0].getSynonym().trim().length() > 0
|
||||||
|
@ -970,6 +1002,13 @@ public class InfoWindow extends InfoPanel implements ValueChangeListener, EventL
|
||||||
prepareTable(columnInfos, infoWindow.getFromClause(), p_whereClause, infoWindow.getOrderByClause());
|
prepareTable(columnInfos, infoWindow.getFromClause(), p_whereClause, infoWindow.getOrderByClause());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param tableInfos
|
||||||
|
* @param gridField
|
||||||
|
* @param infoColumn
|
||||||
|
* @return {@link ColumnInfo}
|
||||||
|
*/
|
||||||
protected ColumnInfo createLookupColumnInfo(TableInfo[] tableInfos,
|
protected ColumnInfo createLookupColumnInfo(TableInfo[] tableInfos,
|
||||||
GridField gridField, InfoColumnVO infoColumn) {
|
GridField gridField, InfoColumnVO infoColumn) {
|
||||||
String columnName = gridField.getColumnName();
|
String columnName = gridField.getColumnName();
|
||||||
|
@ -1186,6 +1225,11 @@ public class InfoWindow extends InfoPanel implements ValueChangeListener, EventL
|
||||||
return sql;
|
return sql;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param gridField
|
||||||
|
* @return {@link InfoColumnVO} if found, null otherwise
|
||||||
|
*/
|
||||||
protected InfoColumnVO findInfoColumn(GridField gridField) {
|
protected InfoColumnVO findInfoColumn(GridField gridField) {
|
||||||
for(int i = 0; i < gridFields.size(); i++) {
|
for(int i = 0; i < gridFields.size(); i++) {
|
||||||
if (gridFields.get(i) == gridField) {
|
if (gridFields.get(i) == gridField) {
|
||||||
|
@ -1195,6 +1239,11 @@ public class InfoWindow extends InfoPanel implements ValueChangeListener, EventL
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param gridField
|
||||||
|
* @return {@link InfoColumnVO} if found, null otherwise
|
||||||
|
*/
|
||||||
protected InfoColumnVO findInfoColumnParameter(GridField gridField) {
|
protected InfoColumnVO findInfoColumnParameter(GridField gridField) {
|
||||||
for (Integer i : parameterTree.keySet()) {
|
for (Integer i : parameterTree.keySet()) {
|
||||||
List<Object[]> list = parameterTree.get(i);
|
List<Object[]> list = parameterTree.get(i);
|
||||||
|
@ -1279,6 +1328,15 @@ public class InfoWindow extends InfoPanel implements ValueChangeListener, EventL
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param editor
|
||||||
|
* @param infoColumnVO
|
||||||
|
* @param pstmt
|
||||||
|
* @param parameterIndex current parameter index
|
||||||
|
* @return current parameter index
|
||||||
|
* @throws SQLException
|
||||||
|
*/
|
||||||
protected int setParameter(WEditor editor, InfoColumnVO infoColumnVO, PreparedStatement pstmt, int parameterIndex) throws SQLException {
|
protected int setParameter(WEditor editor, InfoColumnVO infoColumnVO, PreparedStatement pstmt, int parameterIndex) throws SQLException {
|
||||||
if(editor == null)
|
if(editor == null)
|
||||||
return parameterIndex;
|
return parameterIndex;
|
||||||
|
@ -1437,6 +1495,9 @@ public class InfoWindow extends InfoPanel implements ValueChangeListener, EventL
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* layout window UI elements
|
||||||
|
*/
|
||||||
protected void renderWindow()
|
protected void renderWindow()
|
||||||
{
|
{
|
||||||
// Load User Def
|
// Load User Def
|
||||||
|
@ -1497,8 +1558,22 @@ public class InfoWindow extends InfoPanel implements ValueChangeListener, EventL
|
||||||
cbbProcess.setDisabled(true);
|
cbbProcess.setDisabled(true);
|
||||||
}
|
}
|
||||||
// IDEMPIERE-1334 end
|
// IDEMPIERE-1334 end
|
||||||
|
|
||||||
|
paging = new Paging();
|
||||||
|
paging.setPageSize(pageSize);
|
||||||
|
paging.setTotalSize(0);
|
||||||
|
paging.setDetailed(true);
|
||||||
|
paging.addEventListener(ZulEvents.ON_PAGING, this);
|
||||||
|
paging.setActivePage(0);
|
||||||
|
pageNo = 0;
|
||||||
|
insertPagingComponent();
|
||||||
|
paging.setVisible(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* layout footer
|
||||||
|
* @param south
|
||||||
|
*/
|
||||||
protected void renderFooter(South south) {
|
protected void renderFooter(South south) {
|
||||||
southBody = new Vbox();
|
southBody = new Vbox();
|
||||||
ZKUpdateUtil.setHflex(southBody, "1");
|
ZKUpdateUtil.setHflex(southBody, "1");
|
||||||
|
@ -1509,11 +1584,16 @@ public class InfoWindow extends InfoPanel implements ValueChangeListener, EventL
|
||||||
southBody.appendChild(statusBar);
|
southBody.appendChild(statusBar);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
protected void insertPagingComponent() {
|
protected void insertPagingComponent() {
|
||||||
southBody.insertBefore(paging, southBody.getFirstChild());
|
southBody.insertBefore(paging, southBody.getFirstChild());
|
||||||
layout.invalidate();
|
layout.invalidate();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* layout center content pane
|
||||||
|
* @param center
|
||||||
|
*/
|
||||||
protected void renderContentPane(Center center) {
|
protected void renderContentPane(Center center) {
|
||||||
Div div = new Div();
|
Div div = new Div();
|
||||||
div.setStyle("width :100%; height: 100%");
|
div.setStyle("width :100%; height: 100%");
|
||||||
|
@ -1554,15 +1634,26 @@ public class InfoWindow extends InfoPanel implements ValueChangeListener, EventL
|
||||||
center.appendChild(inner);
|
center.appendChild(inner);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* layout query parameter pane
|
||||||
|
* @param north
|
||||||
|
*/
|
||||||
protected void renderParameterPane(North north) {
|
protected void renderParameterPane(North north) {
|
||||||
createParameterPanel();
|
createParameterPanel();
|
||||||
north.appendChild(parameterGrid);
|
north.appendChild(parameterGrid);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* create query parameter panel
|
||||||
|
*/
|
||||||
protected void createParameterPanel() {
|
protected void createParameterPanel() {
|
||||||
layoutParameterGrid(false);
|
layoutParameterGrid(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* layout query parameter panel
|
||||||
|
* @param update
|
||||||
|
*/
|
||||||
protected void layoutParameterGrid(boolean update) {
|
protected void layoutParameterGrid(boolean update) {
|
||||||
if (!update) {
|
if (!update) {
|
||||||
parameterGrid = GridFactory.newGridLayout();
|
parameterGrid = GridFactory.newGridLayout();
|
||||||
|
@ -1659,6 +1750,9 @@ public class InfoWindow extends InfoPanel implements ValueChangeListener, EventL
|
||||||
dynamicDisplay(null);
|
dynamicDisplay(null);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* evaluate display logic for input parameters
|
||||||
|
*/
|
||||||
protected void evalDisplayLogic() {
|
protected void evalDisplayLogic() {
|
||||||
int idx = 0;
|
int idx = 0;
|
||||||
for(WEditor editor : editors) {
|
for(WEditor editor : editors) {
|
||||||
|
@ -1765,6 +1859,11 @@ public class InfoWindow extends InfoPanel implements ValueChangeListener, EventL
|
||||||
|
|
||||||
} // addSelectionColumn
|
} // addSelectionColumn
|
||||||
|
|
||||||
|
/**
|
||||||
|
* add search parameter
|
||||||
|
* @param editor
|
||||||
|
* @param editor2
|
||||||
|
*/
|
||||||
protected void addSearchParameter(WEditor editor, WEditor editor2) {
|
protected void addSearchParameter(WEditor editor, WEditor editor2) {
|
||||||
Label label = editor.getLabel();
|
Label label = editor.getLabel();
|
||||||
Component fieldEditor = editor.getComponent();
|
Component fieldEditor = editor.getComponent();
|
||||||
|
@ -1835,6 +1934,10 @@ public class InfoWindow extends InfoPanel implements ValueChangeListener, EventL
|
||||||
panel.appendChild(outerParent);
|
panel.appendChild(outerParent);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @return number of columns for parameter grid
|
||||||
|
*/
|
||||||
protected int getNoOfParameterColumns() {
|
protected int getNoOfParameterColumns() {
|
||||||
if (ClientInfo.maxWidth(ClientInfo.SMALL_WIDTH-1))
|
if (ClientInfo.maxWidth(ClientInfo.SMALL_WIDTH-1))
|
||||||
return 2;
|
return 2;
|
||||||
|
@ -1844,6 +1947,9 @@ public class InfoWindow extends InfoPanel implements ValueChangeListener, EventL
|
||||||
return 6;
|
return 6;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* create checkbox for AND
|
||||||
|
*/
|
||||||
protected void createAndCheckbox() {
|
protected void createAndCheckbox() {
|
||||||
checkAND = new Checkbox();
|
checkAND = new Checkbox();
|
||||||
checkAND.setLabel(Msg.getMsg(Env.getCtx(), "SearchAND", true));
|
checkAND.setLabel(Msg.getMsg(Env.getCtx(), "SearchAND", true));
|
||||||
|
@ -1856,6 +1962,11 @@ public class InfoWindow extends InfoPanel implements ValueChangeListener, EventL
|
||||||
checkAND.addEventListener(Events.ON_CHECK, this);
|
checkAND.addEventListener(Events.ON_CHECK, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param columnName
|
||||||
|
* @return column index, -1 if not found
|
||||||
|
*/
|
||||||
protected int findColumnIndex(String columnName) {
|
protected int findColumnIndex(String columnName) {
|
||||||
for(int i = 0; i < columnInfos.length; i++) {
|
for(int i = 0; i < columnInfos.length; i++) {
|
||||||
GridField field = columnInfos[i].getGridField();
|
GridField field = columnInfos[i].getGridField();
|
||||||
|
@ -1995,6 +2106,9 @@ public class InfoWindow extends InfoPanel implements ValueChangeListener, EventL
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Post query event if all editor with IsQueryAfterChange=True have been populated
|
||||||
|
*/
|
||||||
protected void postQueryAfterChangeEvent() {
|
protected void postQueryAfterChangeEvent() {
|
||||||
if (Executions.getCurrent().getAttribute(ON_USER_QUERY_ATTR) != null)
|
if (Executions.getCurrent().getAttribute(ON_USER_QUERY_ATTR) != null)
|
||||||
return;
|
return;
|
||||||
|
@ -2013,6 +2127,9 @@ public class InfoWindow extends InfoPanel implements ValueChangeListener, EventL
|
||||||
onUserQuery();
|
onUserQuery();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param editor
|
||||||
|
*/
|
||||||
protected void dynamicDisplay(WEditor editor) {
|
protected void dynamicDisplay(WEditor editor) {
|
||||||
validateField(editor);
|
validateField(editor);
|
||||||
evalDisplayLogic();
|
evalDisplayLogic();
|
||||||
|
@ -2044,6 +2161,7 @@ public class InfoWindow extends InfoPanel implements ValueChangeListener, EventL
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public void onEvent(Event event)
|
public void onEvent(Event event)
|
||||||
{
|
{
|
||||||
if (event.getName().equals(Events.ON_FOCUS) && event.getTarget() != null &&
|
if (event.getName().equals(Events.ON_FOCUS) && event.getTarget() != null &&
|
||||||
|
@ -2134,11 +2252,13 @@ public class InfoWindow extends InfoPanel implements ValueChangeListener, EventL
|
||||||
|
|
||||||
onQueryCallback (null);
|
onQueryCallback (null);
|
||||||
|
|
||||||
if (paging != null)
|
|
||||||
paging.setParent(null);
|
|
||||||
layout.invalidate();
|
layout.invalidate();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param editor
|
||||||
|
*/
|
||||||
protected void resetParameters(WEditor editor) {
|
protected void resetParameters(WEditor editor) {
|
||||||
if(editor == null)
|
if(editor == null)
|
||||||
return;
|
return;
|
||||||
|
@ -2172,6 +2292,9 @@ public class InfoWindow extends InfoPanel implements ValueChangeListener, EventL
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* handle on client info event
|
||||||
|
*/
|
||||||
protected void onClientInfo() {
|
protected void onClientInfo() {
|
||||||
int t = getNoOfParameterColumns();
|
int t = getNoOfParameterColumns();
|
||||||
if (t > 0 && noOfParameterColumn > 0 && t != noOfParameterColumn) {
|
if (t > 0 && noOfParameterColumn > 0 && t != noOfParameterColumn) {
|
||||||
|
@ -2275,7 +2398,7 @@ public class InfoWindow extends InfoPanel implements ValueChangeListener, EventL
|
||||||
} // testCount
|
} // testCount
|
||||||
|
|
||||||
/** Return true if there is an 'IsActive' criteria */
|
/** Return true if there is an 'IsActive' criteria */
|
||||||
boolean hasIsActiveEditor() {
|
protected boolean hasIsActiveEditor() {
|
||||||
for (WEditor editor : editors) {
|
for (WEditor editor : editors) {
|
||||||
if (editor.getGridField() != null && "IsActive".equals(editor.getGridField().getColumnName())) {
|
if (editor.getGridField() != null && "IsActive".equals(editor.getGridField().getColumnName())) {
|
||||||
return true;
|
return true;
|
||||||
|
@ -2288,7 +2411,7 @@ public class InfoWindow extends InfoPanel implements ValueChangeListener, EventL
|
||||||
* author xolali IDEMPIERE-1045
|
* author xolali IDEMPIERE-1045
|
||||||
* getInfoColumnslayout(MInfoWindow info)
|
* getInfoColumnslayout(MInfoWindow info)
|
||||||
* @param info
|
* @param info
|
||||||
* @return
|
* @return list of {@link ColumnInfo}
|
||||||
*/
|
*/
|
||||||
public ArrayList<ColumnInfo> getInfoColumnslayout(MInfoWindow info){
|
public ArrayList<ColumnInfo> getInfoColumnslayout(MInfoWindow info){
|
||||||
|
|
||||||
|
@ -2531,7 +2654,13 @@ public class InfoWindow extends InfoPanel implements ValueChangeListener, EventL
|
||||||
}
|
}
|
||||||
|
|
||||||
// Edit Callback method and original values management
|
// Edit Callback method and original values management
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param row
|
||||||
|
* @param editingColumn
|
||||||
|
* @param editingValue
|
||||||
|
* @return {@link Properties}
|
||||||
|
*/
|
||||||
public Properties getRowaAsCtx(int row, int editingColumn, Object editingValue)
|
public Properties getRowaAsCtx(int row, int editingColumn, Object editingValue)
|
||||||
{
|
{
|
||||||
ListModelTable model = contentPanel.getModel();
|
ListModelTable model = contentPanel.getModel();
|
||||||
|
@ -2597,6 +2726,14 @@ public class InfoWindow extends InfoPanel implements ValueChangeListener, EventL
|
||||||
return ctx;
|
return ctx;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param event
|
||||||
|
* @param rowIndex
|
||||||
|
* @param colIndex
|
||||||
|
* @param editor
|
||||||
|
* @param field
|
||||||
|
*/
|
||||||
public void onCellEditCallback(ValueChangeEvent event, int rowIndex, int colIndex, WEditor editor, GridField field)
|
public void onCellEditCallback(ValueChangeEvent event, int rowIndex, int colIndex, WEditor editor, GridField field)
|
||||||
{
|
{
|
||||||
Object val = event.getNewValue();
|
Object val = event.getNewValue();
|
||||||
|
@ -2643,7 +2780,7 @@ public class InfoWindow extends InfoPanel implements ValueChangeListener, EventL
|
||||||
}
|
}
|
||||||
|
|
||||||
String msg = Msg.translate(ctx, sbError.toString());
|
String msg = Msg.translate(ctx, sbError.toString());
|
||||||
Dialog.error(0, "ValidationError", msg); // TODO messaggio
|
Dialog.error(0, "ValidationError", msg);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
changeIsValid = true;
|
changeIsValid = true;
|
||||||
|
@ -2652,7 +2789,7 @@ public class InfoWindow extends InfoPanel implements ValueChangeListener, EventL
|
||||||
{
|
{
|
||||||
log.log(Level.SEVERE, "Error executing validation SQL: " + validationSQL, e);
|
log.log(Level.SEVERE, "Error executing validation SQL: " + validationSQL, e);
|
||||||
|
|
||||||
Dialog.error(0, "Error", validationSQL); // TODO messaggio
|
Dialog.error(0, "Error", validationSQL);
|
||||||
changeIsValid = false;
|
changeIsValid = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2679,6 +2816,10 @@ public class InfoWindow extends InfoPanel implements ValueChangeListener, EventL
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param rowIndex
|
||||||
|
*/
|
||||||
protected void restoreOriginalValues(int rowIndex)
|
protected void restoreOriginalValues(int rowIndex)
|
||||||
{
|
{
|
||||||
Integer viewIdKey = getColumnValue(rowIndex);
|
Integer viewIdKey = getColumnValue(rowIndex);
|
||||||
|
@ -2696,6 +2837,10 @@ public class InfoWindow extends InfoPanel implements ValueChangeListener, EventL
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param rowIndex
|
||||||
|
*/
|
||||||
protected void cacheOriginalValues(int rowIndex)
|
protected void cacheOriginalValues(int rowIndex)
|
||||||
{
|
{
|
||||||
Integer viewIdKey = getColumnValue(rowIndex);
|
Integer viewIdKey = getColumnValue(rowIndex);
|
||||||
|
@ -2845,7 +2990,9 @@ public class InfoWindow extends InfoPanel implements ValueChangeListener, EventL
|
||||||
}
|
}
|
||||||
|
|
||||||
// F3P: Export function
|
// F3P: Export function
|
||||||
|
/**
|
||||||
|
* init export button
|
||||||
|
*/
|
||||||
protected void initExport()
|
protected void initExport()
|
||||||
{
|
{
|
||||||
exportButton = ButtonFactory.createNamedButton("Export", false, true);
|
exportButton = ButtonFactory.createNamedButton("Export", false, true);
|
||||||
|
@ -2856,6 +3003,9 @@ public class InfoWindow extends InfoPanel implements ValueChangeListener, EventL
|
||||||
confirmPanel.addComponentsLeft(exportButton);
|
confirmPanel.addComponentsLeft(exportButton);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* enable/disable export button
|
||||||
|
*/
|
||||||
protected void enableExportButton()
|
protected void enableExportButton()
|
||||||
{
|
{
|
||||||
if(exportButton == null)
|
if(exportButton == null)
|
||||||
|
|
|
@ -189,7 +189,16 @@ public abstract class InfoPanel extends Window implements EventListener<Event>,
|
||||||
*/
|
*/
|
||||||
protected boolean isRequeryByRunSuccessProcess = false;
|
protected boolean isRequeryByRunSuccessProcess = false;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param WindowNo
|
||||||
|
* @param tableName
|
||||||
|
* @param keyColumn
|
||||||
|
* @param value
|
||||||
|
* @param multiSelection
|
||||||
|
* @param whereClause
|
||||||
|
* @return {@link InfoPanel}
|
||||||
|
*/
|
||||||
public static InfoPanel create (int WindowNo,
|
public static InfoPanel create (int WindowNo,
|
||||||
String tableName, String keyColumn, String value,
|
String tableName, String keyColumn, String value,
|
||||||
boolean multiSelection, String whereClause)
|
boolean multiSelection, String whereClause)
|
||||||
|
@ -232,6 +241,15 @@ public abstract class InfoPanel extends Window implements EventListener<Event>,
|
||||||
this(WindowNo, tableName, keyColumn, multipleSelection, whereClause, true);
|
this(WindowNo, tableName, keyColumn, multipleSelection, whereClause, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param WindowNo
|
||||||
|
* @param tableName
|
||||||
|
* @param keyColumn
|
||||||
|
* @param multipleSelection
|
||||||
|
* @param whereClause
|
||||||
|
* @param lookup
|
||||||
|
*/
|
||||||
protected InfoPanel (int WindowNo,
|
protected InfoPanel (int WindowNo,
|
||||||
String tableName, String keyColumn,boolean multipleSelection,
|
String tableName, String keyColumn,boolean multipleSelection,
|
||||||
String whereClause, boolean lookup){
|
String whereClause, boolean lookup){
|
||||||
|
@ -239,6 +257,16 @@ public abstract class InfoPanel extends Window implements EventListener<Event>,
|
||||||
lookup, 0);
|
lookup, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param WindowNo
|
||||||
|
* @param tableName
|
||||||
|
* @param keyColumn
|
||||||
|
* @param multipleSelection
|
||||||
|
* @param whereClause
|
||||||
|
* @param lookup
|
||||||
|
* @param ADInfoWindowID
|
||||||
|
*/
|
||||||
protected InfoPanel (int WindowNo,
|
protected InfoPanel (int WindowNo,
|
||||||
String tableName, String keyColumn,boolean multipleSelection,
|
String tableName, String keyColumn,boolean multipleSelection,
|
||||||
String whereClause, boolean lookup, int ADInfoWindowID)
|
String whereClause, boolean lookup, int ADInfoWindowID)
|
||||||
|
@ -309,6 +337,9 @@ public abstract class InfoPanel extends Window implements EventListener<Event>,
|
||||||
addEventListener(Events.ON_CANCEL, e -> onCancel());
|
addEventListener(Events.ON_CANCEL, e -> onCancel());
|
||||||
} // InfoPanel
|
} // InfoPanel
|
||||||
|
|
||||||
|
/**
|
||||||
|
* parse query value from calling input element
|
||||||
|
*/
|
||||||
protected void parseQueryValue() {
|
protected void parseQueryValue() {
|
||||||
if (Util.isEmpty(queryValue, true))
|
if (Util.isEmpty(queryValue, true))
|
||||||
return;
|
return;
|
||||||
|
@ -421,7 +452,6 @@ public abstract class InfoPanel extends Window implements EventListener<Event>,
|
||||||
if (isLookup())
|
if (isLookup())
|
||||||
addEventListener(Events.ON_CANCEL, this);
|
addEventListener(Events.ON_CANCEL, this);
|
||||||
contentPanel.setOddRowSclass(null);
|
contentPanel.setOddRowSclass(null);
|
||||||
// contentPanel.setSizedByContent(true);
|
|
||||||
contentPanel.setWidgetAttribute(AdempiereWebUI.WIDGET_INSTANCE_NAME, "infoListbox");
|
contentPanel.setWidgetAttribute(AdempiereWebUI.WIDGET_INSTANCE_NAME, "infoListbox");
|
||||||
contentPanel.addEventListener("onAfterRender", this);
|
contentPanel.addEventListener("onAfterRender", this);
|
||||||
contentPanel.setSclass("z-word-nowrap");
|
contentPanel.setSclass("z-word-nowrap");
|
||||||
|
@ -630,6 +660,13 @@ public abstract class InfoPanel extends Window implements EventListener<Event>,
|
||||||
btnDeSelectAll.setEnabled(selectedCount > 0);
|
btnDeSelectAll.setEnabled(selectedCount > 0);
|
||||||
} // setStatusDB
|
} // setStatusDB
|
||||||
|
|
||||||
|
/**
|
||||||
|
* set up list box and construct sql clause
|
||||||
|
* @param layout
|
||||||
|
* @param from
|
||||||
|
* @param where
|
||||||
|
* @param orderBy
|
||||||
|
*/
|
||||||
protected void prepareTable (ColumnInfo[] layout,
|
protected void prepareTable (ColumnInfo[] layout,
|
||||||
String from,
|
String from,
|
||||||
String where,
|
String where,
|
||||||
|
@ -647,7 +684,6 @@ public abstract class InfoPanel extends Window implements EventListener<Event>,
|
||||||
m_sqlCount = "SELECT COUNT(*) FROM " + from + " WHERE " + where;
|
m_sqlCount = "SELECT COUNT(*) FROM " + from + " WHERE " + where;
|
||||||
//
|
//
|
||||||
m_sqlOrder = "";
|
m_sqlOrder = "";
|
||||||
// m_sqlUserOrder = "";
|
|
||||||
if (orderBy != null && orderBy.trim().length() > 0)
|
if (orderBy != null && orderBy.trim().length() > 0)
|
||||||
m_sqlOrder = " ORDER BY " + orderBy;
|
m_sqlOrder = " ORDER BY " + orderBy;
|
||||||
} // prepareTable
|
} // prepareTable
|
||||||
|
@ -866,6 +902,9 @@ public abstract class InfoPanel extends Window implements EventListener<Event>,
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* render list box items
|
||||||
|
*/
|
||||||
protected void renderItems()
|
protected void renderItems()
|
||||||
{
|
{
|
||||||
if (m_count > 0)
|
if (m_count > 0)
|
||||||
|
@ -884,6 +923,7 @@ public abstract class InfoPanel extends Window implements EventListener<Event>,
|
||||||
{
|
{
|
||||||
paging.setTotalSize(m_count);
|
paging.setTotalSize(m_count);
|
||||||
paging.setActivePage(0);
|
paging.setActivePage(0);
|
||||||
|
paging.setVisible(true);
|
||||||
}
|
}
|
||||||
List<Object> subList = readLine(0, pageSize);
|
List<Object> subList = readLine(0, pageSize);
|
||||||
model = new ListModelTable(subList);
|
model = new ListModelTable(subList);
|
||||||
|
@ -997,6 +1037,10 @@ public abstract class InfoPanel extends Window implements EventListener<Event>,
|
||||||
return MSysConfig.getBooleanValue(MSysConfig.ZK_INFO_AUTO_HIDE_EMPTY_COLUMNS, false, Env.getAD_Client_ID(Env.getCtx()));
|
return MSysConfig.getBooleanValue(MSysConfig.ZK_INFO_AUTO_HIDE_EMPTY_COLUMNS, false, Env.getAD_Client_ID(Env.getCtx()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* update info window status text
|
||||||
|
* @param no
|
||||||
|
*/
|
||||||
protected void updateStatusBar (int no){
|
protected void updateStatusBar (int no){
|
||||||
setStatusLine((no == Integer.MAX_VALUE?"?":Integer.toString(no)) + " " + Msg.getMsg(Env.getCtx(), "SearchRows_EnterQuery"), false);
|
setStatusLine((no == Integer.MAX_VALUE?"?":Integer.toString(no)) + " " + Msg.getMsg(Env.getCtx(), "SearchRows_EnterQuery"), false);
|
||||||
setStatusDB(no == Integer.MAX_VALUE?"?":Integer.toString(no));
|
setStatusDB(no == Integer.MAX_VALUE?"?":Integer.toString(no));
|
||||||
|
@ -1223,6 +1267,13 @@ public abstract class InfoPanel extends Window implements EventListener<Event>,
|
||||||
|
|
||||||
return (int)overValue;
|
return (int)overValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* build sql clause with paging
|
||||||
|
* @param start
|
||||||
|
* @param end
|
||||||
|
* @return sql clause
|
||||||
|
*/
|
||||||
protected String buildDataSQL(int start, int end) {
|
protected String buildDataSQL(int start, int end) {
|
||||||
String dataSql;
|
String dataSql;
|
||||||
String dynWhere = getSQLWhere();
|
String dynWhere = getSQLWhere();
|
||||||
|
@ -1337,10 +1388,18 @@ public abstract class InfoPanel extends Window implements EventListener<Event>,
|
||||||
contentPanel.addEventListener(Events.ON_SELECT, this);
|
contentPanel.addEventListener(Events.ON_SELECT, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* add paging component for list box
|
||||||
|
*/
|
||||||
protected void insertPagingComponent() {
|
protected void insertPagingComponent() {
|
||||||
contentPanel.getParent().insertBefore(paging, contentPanel.getNextSibling());
|
contentPanel.getParent().insertBefore(paging, contentPanel.getNextSibling());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param p_layout
|
||||||
|
* @return column headers
|
||||||
|
*/
|
||||||
public Vector<String> getColumnHeader(ColumnInfo[] p_layout)
|
public Vector<String> getColumnHeader(ColumnInfo[] p_layout)
|
||||||
{
|
{
|
||||||
Vector<String> columnHeader = new Vector<String>();
|
Vector<String> columnHeader = new Vector<String>();
|
||||||
|
@ -1436,7 +1495,6 @@ public abstract class InfoPanel extends Window implements EventListener<Event>,
|
||||||
if (!m_ok) // did not press OK
|
if (!m_ok) // did not press OK
|
||||||
{
|
{
|
||||||
contentPanel = null;
|
contentPanel = null;
|
||||||
this.detach();
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1511,6 +1569,7 @@ public abstract class InfoPanel extends Window implements EventListener<Event>,
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Save selected id, viewID of all process to map viewIDMap to save into T_Selection
|
* Save selected id, viewID of all process to map viewIDMap to save into T_Selection
|
||||||
|
* @param infoCulumnId
|
||||||
*/
|
*/
|
||||||
public Collection<KeyNamePair> getSaveKeys (int infoCulumnId){
|
public Collection<KeyNamePair> getSaveKeys (int infoCulumnId){
|
||||||
// clear result from prev time
|
// clear result from prev time
|
||||||
|
@ -1836,7 +1895,9 @@ public abstract class InfoPanel extends Window implements EventListener<Event>,
|
||||||
return p_keyColumn;
|
return p_keyColumn;
|
||||||
} // getKeyColumn
|
} // getKeyColumn
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return list of events
|
||||||
|
*/
|
||||||
public String[] getEvents()
|
public String[] getEvents()
|
||||||
{
|
{
|
||||||
return InfoPanel.lISTENER_EVENTS;
|
return InfoPanel.lISTENER_EVENTS;
|
||||||
|
@ -1977,6 +2038,7 @@ public abstract class InfoPanel extends Window implements EventListener<Event>,
|
||||||
return m_SO_Window_ID;
|
return m_SO_Window_ID;
|
||||||
} // getAD_Window_ID
|
} // getAD_Window_ID
|
||||||
|
|
||||||
|
@Override
|
||||||
public void onEvent(Event event)
|
public void onEvent(Event event)
|
||||||
{
|
{
|
||||||
if (event == null){
|
if (event == null){
|
||||||
|
@ -2189,6 +2251,9 @@ public abstract class InfoPanel extends Window implements EventListener<Event>,
|
||||||
}
|
}
|
||||||
} // onEvent
|
} // onEvent
|
||||||
|
|
||||||
|
/**
|
||||||
|
* handle cancel event
|
||||||
|
*/
|
||||||
protected void onCancel() {
|
protected void onCancel() {
|
||||||
m_cancel = true;
|
m_cancel = true;
|
||||||
dispose(false);
|
dispose(false);
|
||||||
|
@ -2264,7 +2329,7 @@ public abstract class InfoPanel extends Window implements EventListener<Event>,
|
||||||
protected void resetParameters() {
|
protected void resetParameters() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void preRunProcess (Integer processId){
|
protected void preRunProcess (Integer processId){
|
||||||
// disable all control button when run process
|
// disable all control button when run process
|
||||||
enableButtons(false);
|
enableButtons(false);
|
||||||
// call run process in next request to disable all button control
|
// call run process in next request to disable all button control
|
||||||
|
@ -2568,6 +2633,11 @@ public abstract class InfoPanel extends Window implements EventListener<Event>,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* handle echo from query event
|
||||||
|
* @param event null to indicate reset instead of echo from query event
|
||||||
|
*/
|
||||||
public void onQueryCallback(Event event)
|
public void onQueryCallback(Event event)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
|
@ -2610,6 +2680,9 @@ public abstract class InfoPanel extends Window implements EventListener<Event>,
|
||||||
*/
|
*/
|
||||||
protected void bindInfoProcess (){}
|
protected void bindInfoProcess (){}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* handle ok event
|
||||||
|
*/
|
||||||
protected void onOk()
|
protected void onOk()
|
||||||
{
|
{
|
||||||
if (!contentPanel.getChildren().isEmpty() && getSelectedRowInfo().size() > 0)
|
if (!contentPanel.getChildren().isEmpty() && getSelectedRowInfo().size() > 0)
|
||||||
|
@ -2618,6 +2691,9 @@ public abstract class InfoPanel extends Window implements EventListener<Event>,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* handle double click on row event
|
||||||
|
*/
|
||||||
protected void onDoubleClick()
|
protected void onDoubleClick()
|
||||||
{
|
{
|
||||||
if (isLookup())
|
if (isLookup())
|
||||||
|
@ -2631,11 +2707,15 @@ public abstract class InfoPanel extends Window implements EventListener<Event>,
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public void tableChanged(WTableModelEvent event)
|
public void tableChanged(WTableModelEvent event)
|
||||||
{
|
{
|
||||||
enableButtons();
|
enableButtons();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* zoom to record
|
||||||
|
*/
|
||||||
public void zoom()
|
public void zoom()
|
||||||
{
|
{
|
||||||
Integer recordId = contentPanel.getSelectedRowKey();
|
Integer recordId = contentPanel.getSelectedRowKey();
|
||||||
|
@ -2743,6 +2823,10 @@ public abstract class InfoPanel extends Window implements EventListener<Event>,
|
||||||
*/
|
*/
|
||||||
protected void newRecordAction (){}
|
protected void newRecordAction (){}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param listener
|
||||||
|
*/
|
||||||
public void addValueChangeListener(ValueChangeListener listener)
|
public void addValueChangeListener(ValueChangeListener listener)
|
||||||
{
|
{
|
||||||
if (listener == null)
|
if (listener == null)
|
||||||
|
@ -2753,6 +2837,10 @@ public abstract class InfoPanel extends Window implements EventListener<Event>,
|
||||||
listeners.add(listener);
|
listeners.add(listener);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param event
|
||||||
|
*/
|
||||||
public void fireValueChange(ValueChangeEvent event)
|
public void fireValueChange(ValueChangeEvent event)
|
||||||
{
|
{
|
||||||
for (ValueChangeListener listener : listeners)
|
for (ValueChangeListener listener : listeners)
|
||||||
|
@ -2774,9 +2862,20 @@ public abstract class InfoPanel extends Window implements EventListener<Event>,
|
||||||
saveSelection();
|
saveSelection();
|
||||||
}
|
}
|
||||||
if (Window.MODE_EMBEDDED.equals(getAttribute(Window.MODE_KEY)))
|
if (Window.MODE_EMBEDDED.equals(getAttribute(Window.MODE_KEY)))
|
||||||
|
{
|
||||||
SessionManager.getAppDesktop().closeActiveWindow();
|
SessionManager.getAppDesktop().closeActiveWindow();
|
||||||
|
}
|
||||||
else
|
else
|
||||||
this.detach();
|
{
|
||||||
|
//Workaround for detached HTML input element leak
|
||||||
|
if (getChildren().size() > 0) {
|
||||||
|
Component[] childs = getChildren().toArray(new Component[0]);
|
||||||
|
for(Component c : childs) {
|
||||||
|
AEnv.detachInputElement(c);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Executions.schedule(getDesktop(), e -> this.detach(), new Event("onAsyncDetach"));
|
||||||
|
}
|
||||||
} // dispose
|
} // dispose
|
||||||
|
|
||||||
private void saveWlistBoxColumnWidth(Component comp){
|
private void saveWlistBoxColumnWidth(Component comp){
|
||||||
|
@ -2791,6 +2890,10 @@ public abstract class InfoPanel extends Window implements EventListener<Event>,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param cmpr {@link WListItemRenderer.ColumnComparator}
|
||||||
|
* @param ascending
|
||||||
|
*/
|
||||||
public void sort(Comparator<Object> cmpr, boolean ascending) {
|
public void sort(Comparator<Object> cmpr, boolean ascending) {
|
||||||
updateListSelected();
|
updateListSelected();
|
||||||
WListItemRenderer.ColumnComparator lsc = (WListItemRenderer.ColumnComparator) cmpr;
|
WListItemRenderer.ColumnComparator lsc = (WListItemRenderer.ColumnComparator) cmpr;
|
||||||
|
@ -2813,11 +2916,18 @@ public abstract class InfoPanel extends Window implements EventListener<Event>,
|
||||||
renderItems();
|
renderItems();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @return true if it is a lookup dialog
|
||||||
|
*/
|
||||||
public boolean isLookup()
|
public boolean isLookup()
|
||||||
{
|
{
|
||||||
return m_lookup;
|
return m_lookup;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* scroll selected row into view
|
||||||
|
*/
|
||||||
public void scrollToSelectedRow()
|
public void scrollToSelectedRow()
|
||||||
{
|
{
|
||||||
if (contentPanel != null && contentPanel.getSelectedIndex() >= 0) {
|
if (contentPanel != null && contentPanel.getSelectedIndex() >= 0) {
|
||||||
|
@ -2833,18 +2943,35 @@ public abstract class InfoPanel extends Window implements EventListener<Event>,
|
||||||
return "natural";
|
return "natural";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @return window no
|
||||||
|
*/
|
||||||
public int getWindowNo() {
|
public int getWindowNo() {
|
||||||
return p_WindowNo;
|
return p_WindowNo;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @return row count
|
||||||
|
*/
|
||||||
public int getRowCount() {
|
public int getRowCount() {
|
||||||
return contentPanel.getRowCount();
|
return contentPanel.getRowCount();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @return first row key/id
|
||||||
|
*/
|
||||||
public Integer getFirstRowKey() {
|
public Integer getFirstRowKey() {
|
||||||
return contentPanel.getFirstRowKey();
|
return contentPanel.getFirstRowKey();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param row
|
||||||
|
* @return row key/id
|
||||||
|
*/
|
||||||
public Integer getRowKeyAt(int row) {
|
public Integer getRowKeyAt(int row) {
|
||||||
return contentPanel.getRowKeyAt(row);
|
return contentPanel.getRowKeyAt(row);
|
||||||
}
|
}
|
||||||
|
@ -2870,6 +2997,10 @@ public abstract class InfoPanel extends Window implements EventListener<Event>,
|
||||||
return cacheEnd;
|
return cacheEnd;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @return true if using database paging feature
|
||||||
|
*/
|
||||||
protected boolean isUseDatabasePaging() {
|
protected boolean isUseDatabasePaging() {
|
||||||
return m_useDatabasePaging;
|
return m_useDatabasePaging;
|
||||||
}
|
}
|
||||||
|
@ -2903,16 +3034,24 @@ public abstract class InfoPanel extends Window implements EventListener<Event>,
|
||||||
/**
|
/**
|
||||||
* field call this info panel as search editor
|
* field call this info panel as search editor
|
||||||
* null in case info window open in stand-alone window (from menu, fav,...)
|
* null in case info window open in stand-alone window (from menu, fav,...)
|
||||||
* @return
|
* @return {@link GridField}
|
||||||
*/
|
*/
|
||||||
public GridField getGridfield() {
|
public GridField getGridfield() {
|
||||||
return m_gridfield;
|
return m_gridfield;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param m_gridfield
|
||||||
|
*/
|
||||||
public void setGridfield(GridField m_gridfield) {
|
public void setGridfield(GridField m_gridfield) {
|
||||||
this.m_gridfield = m_gridfield;
|
this.m_gridfield = m_gridfield;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @return page size (number of rows per page)
|
||||||
|
*/
|
||||||
public int getPageSize() {
|
public int getPageSize() {
|
||||||
return pageSize;
|
return pageSize;
|
||||||
}
|
}
|
||||||
|
@ -2933,6 +3072,10 @@ public abstract class InfoPanel extends Window implements EventListener<Event>,
|
||||||
this.m_closeAfterExecutionOfProcess = closeAfterExecutionOfProcess;
|
this.m_closeAfterExecutionOfProcess = closeAfterExecutionOfProcess;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param multipleSelection
|
||||||
|
*/
|
||||||
public void setMultipleSelection(boolean multipleSelection) {
|
public void setMultipleSelection(boolean multipleSelection) {
|
||||||
p_multipleSelection = multipleSelection;
|
p_multipleSelection = multipleSelection;
|
||||||
if (btnSelectAll != null)
|
if (btnSelectAll != null)
|
||||||
|
|
|
@ -76,6 +76,7 @@ import org.zkoss.zhtml.Td;
|
||||||
import org.zkoss.zhtml.Tr;
|
import org.zkoss.zhtml.Tr;
|
||||||
import org.zkoss.zk.au.out.AuFocus;
|
import org.zkoss.zk.au.out.AuFocus;
|
||||||
import org.zkoss.zk.au.out.AuScript;
|
import org.zkoss.zk.au.out.AuScript;
|
||||||
|
import org.zkoss.zk.ui.AbstractComponent;
|
||||||
import org.zkoss.zk.ui.Component;
|
import org.zkoss.zk.ui.Component;
|
||||||
import org.zkoss.zk.ui.Executions;
|
import org.zkoss.zk.ui.Executions;
|
||||||
import org.zkoss.zk.ui.Session;
|
import org.zkoss.zk.ui.Session;
|
||||||
|
@ -83,6 +84,7 @@ import org.zkoss.zk.ui.WrongValueException;
|
||||||
import org.zkoss.zk.ui.event.Event;
|
import org.zkoss.zk.ui.event.Event;
|
||||||
import org.zkoss.zk.ui.event.EventListener;
|
import org.zkoss.zk.ui.event.EventListener;
|
||||||
import org.zkoss.zk.ui.event.Events;
|
import org.zkoss.zk.ui.event.Events;
|
||||||
|
import org.zkoss.zk.ui.sys.ComponentCtrl;
|
||||||
import org.zkoss.zk.ui.util.Clients;
|
import org.zkoss.zk.ui.util.Clients;
|
||||||
import org.zkoss.zul.A;
|
import org.zkoss.zul.A;
|
||||||
import org.zkoss.zul.Checkbox;
|
import org.zkoss.zul.Checkbox;
|
||||||
|
@ -346,6 +348,7 @@ public class LoginPanel extends Window implements EventListener<Event>
|
||||||
pnlButtons.addActionListener(this);
|
pnlButtons.addActionListener(this);
|
||||||
Button okBtn = pnlButtons.getButton(ConfirmPanel.A_OK);
|
Button okBtn = pnlButtons.getButton(ConfirmPanel.A_OK);
|
||||||
okBtn.setWidgetListener("onClick", "zAu.cmd0.showBusy(null)");
|
okBtn.setWidgetListener("onClick", "zAu.cmd0.showBusy(null)");
|
||||||
|
okBtn.addCallback(ComponentCtrl.AFTER_PAGE_DETACHED, t -> ((AbstractComponent)t).setWidgetListener("onClick", null));
|
||||||
|
|
||||||
Button helpButton = pnlButtons.createButton(ConfirmPanel.A_HELP);
|
Button helpButton = pnlButtons.createButton(ConfirmPanel.A_HELP);
|
||||||
helpButton.addEventListener(Events.ON_CLICK, this);
|
helpButton.addEventListener(Events.ON_CLICK, this);
|
||||||
|
|
|
@ -58,12 +58,14 @@ import org.zkoss.zhtml.Td;
|
||||||
import org.zkoss.zhtml.Tr;
|
import org.zkoss.zhtml.Tr;
|
||||||
import org.zkoss.zk.au.out.AuFocus;
|
import org.zkoss.zk.au.out.AuFocus;
|
||||||
import org.zkoss.zk.au.out.AuScript;
|
import org.zkoss.zk.au.out.AuScript;
|
||||||
|
import org.zkoss.zk.ui.AbstractComponent;
|
||||||
import org.zkoss.zk.ui.Executions;
|
import org.zkoss.zk.ui.Executions;
|
||||||
import org.zkoss.zk.ui.WrongValueException;
|
import org.zkoss.zk.ui.WrongValueException;
|
||||||
import org.zkoss.zk.ui.event.Deferrable;
|
import org.zkoss.zk.ui.event.Deferrable;
|
||||||
import org.zkoss.zk.ui.event.Event;
|
import org.zkoss.zk.ui.event.Event;
|
||||||
import org.zkoss.zk.ui.event.EventListener;
|
import org.zkoss.zk.ui.event.EventListener;
|
||||||
import org.zkoss.zk.ui.event.Events;
|
import org.zkoss.zk.ui.event.Events;
|
||||||
|
import org.zkoss.zk.ui.sys.ComponentCtrl;
|
||||||
import org.zkoss.zk.ui.util.Clients;
|
import org.zkoss.zk.ui.util.Clients;
|
||||||
import org.zkoss.zul.Comboitem;
|
import org.zkoss.zul.Comboitem;
|
||||||
import org.zkoss.zul.Div;
|
import org.zkoss.zul.Div;
|
||||||
|
@ -275,6 +277,7 @@ public class RolePanel extends Window implements EventListener<Event>, Deferrabl
|
||||||
pnlButtons.addActionListener(this);
|
pnlButtons.addActionListener(this);
|
||||||
Button okBtn = pnlButtons.getButton(ConfirmPanel.A_OK);
|
Button okBtn = pnlButtons.getButton(ConfirmPanel.A_OK);
|
||||||
okBtn.setWidgetListener("onClick", "zAu.cmd0.showBusy(null)");
|
okBtn.setWidgetListener("onClick", "zAu.cmd0.showBusy(null)");
|
||||||
|
okBtn.addCallback(ComponentCtrl.AFTER_PAGE_DETACHED, t -> ((AbstractComponent)t).setWidgetListener("onClick", null));
|
||||||
|
|
||||||
Button helpButton = pnlButtons.createButton(ConfirmPanel.A_HELP);
|
Button helpButton = pnlButtons.createButton(ConfirmPanel.A_HELP);
|
||||||
helpButton.addEventListener(Events.ON_CLICK, this);
|
helpButton.addEventListener(Events.ON_CLICK, this);
|
||||||
|
|
|
@ -2940,20 +2940,18 @@ public class FindWindow extends Window implements EventListener<Event>, ValueCha
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public void dispose()
|
public void dispose()
|
||||||
{
|
{
|
||||||
log.config("");
|
|
||||||
|
|
||||||
// Find SQL
|
// Find SQL
|
||||||
DB.close(m_pstmt);
|
DB.close(m_pstmt);
|
||||||
m_pstmt = null;
|
m_pstmt = null;
|
||||||
|
|
||||||
//
|
//
|
||||||
super.dispose();
|
setVisible(false);
|
||||||
|
|
||||||
isvalid = false;
|
isvalid = false;
|
||||||
|
|
||||||
|
//simulate real dispose/detach
|
||||||
|
Events.sendEvent(this, new Event(DialogEvents.ON_WINDOW_CLOSE, this, null));
|
||||||
} // dispose
|
} // dispose
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -3408,9 +3406,7 @@ public class FindWindow extends Window implements EventListener<Event>, ValueCha
|
||||||
setAttribute(ON_POST_VISIBLE_ATTR, Boolean.TRUE);
|
setAttribute(ON_POST_VISIBLE_ATTR, Boolean.TRUE);
|
||||||
Events.echoEvent("OnPostVisible", this, null);
|
Events.echoEvent("OnPostVisible", this, null);
|
||||||
}
|
}
|
||||||
} else {
|
isvalid = true;
|
||||||
//auto detach
|
|
||||||
detach();
|
|
||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
|
@ -52,6 +52,7 @@ import org.compiere.util.Util;
|
||||||
import org.zkoss.util.Locales;
|
import org.zkoss.util.Locales;
|
||||||
import org.zkoss.web.Attributes;
|
import org.zkoss.web.Attributes;
|
||||||
import org.zkoss.zk.ui.Executions;
|
import org.zkoss.zk.ui.Executions;
|
||||||
|
import org.zkoss.zk.ui.Page;
|
||||||
import org.zkoss.zk.ui.Session;
|
import org.zkoss.zk.ui.Session;
|
||||||
import org.zkoss.zk.ui.event.Event;
|
import org.zkoss.zk.ui.event.Event;
|
||||||
import org.zkoss.zk.ui.event.EventListener;
|
import org.zkoss.zk.ui.event.EventListener;
|
||||||
|
@ -300,4 +301,10 @@ public class LoginWindow extends FWindow implements EventListener<Event>
|
||||||
pnlRole.setChangeRole(true);
|
pnlRole.setChangeRole(true);
|
||||||
pnlRole.changeRole(ctx);
|
pnlRole.changeRole(ctx);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onPageDetached(Page page) {
|
||||||
|
setWidgetListener("onOK", null);
|
||||||
|
super.onPageDetached(page);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue