IDEMPIERE-4841 Info Window: Implement auto hide empty columns (#781)

This commit is contained in:
hengsin 2021-07-15 23:03:33 +08:00 committed by GitHub
parent de2b29d129
commit 3dcef18868
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 237 additions and 150 deletions

View File

@ -0,0 +1,10 @@
SET SQLBLANKLINES ON
SET DEFINE OFF
-- Jul 15, 2021, 3:50:49 PM MYT
INSERT INTO AD_SysConfig (AD_SysConfig_ID,AD_Client_ID,AD_Org_ID,Created,Updated,CreatedBy,UpdatedBy,IsActive,Name,Value,Description,EntityType,ConfigurationLevel,AD_SysConfig_UU) VALUES (200180,0,0,TO_DATE('2021-07-15 15:50:48','YYYY-MM-DD HH24:MI:SS'),TO_DATE('2021-07-15 15:50:48','YYYY-MM-DD HH24:MI:SS'),100,100,'Y','ZK_INFO_AUTO_HIDE_EMPTY_COLUMNS','N','Y/N - Define if info window will auto hide columns with empty content','D','C','99ba73cd-f64a-418d-bb55-82f4192b1055')
;
SELECT Register_Migration_Script ('202107150800_IDEMPIERE-4841.sql') FROM DUAL
;

View File

@ -0,0 +1,7 @@
-- Jul 15, 2021, 3:50:49 PM MYT
INSERT INTO AD_SysConfig (AD_SysConfig_ID,AD_Client_ID,AD_Org_ID,Created,Updated,CreatedBy,UpdatedBy,IsActive,Name,Value,Description,EntityType,ConfigurationLevel,AD_SysConfig_UU) VALUES (200180,0,0,TO_TIMESTAMP('2021-07-15 15:50:48','YYYY-MM-DD HH24:MI:SS'),TO_TIMESTAMP('2021-07-15 15:50:48','YYYY-MM-DD HH24:MI:SS'),100,100,'Y','ZK_INFO_AUTO_HIDE_EMPTY_COLUMNS','N','Y/N - Define if info window will auto hide columns with empty content','D','C','99ba73cd-f64a-418d-bb55-82f4192b1055')
;
SELECT Register_Migration_Script ('202107150800_IDEMPIERE-4841.sql') FROM DUAL
;

View File

@ -189,6 +189,7 @@ public class MSysConfig extends X_AD_SysConfig
public static final String ZK_GRID_MOBILE_MAX_COLUMNS = "ZK_GRID_MOBILE_MAX_COLUMNS"; public static final String ZK_GRID_MOBILE_MAX_COLUMNS = "ZK_GRID_MOBILE_MAX_COLUMNS";
public static final String ZK_GRID_MOBILE_SHOW_CURRENT_ROW_INDICATOR = "ZK_GRID_MOBILE_SHOW_CURRENT_ROW_INDICATOR"; public static final String ZK_GRID_MOBILE_SHOW_CURRENT_ROW_INDICATOR = "ZK_GRID_MOBILE_SHOW_CURRENT_ROW_INDICATOR";
public static final String ZK_GRID_VIEW_USE_DEFER_RENDERING = "ZK_GRID_VIEW_USE_DEFER_RENDERING"; public static final String ZK_GRID_VIEW_USE_DEFER_RENDERING = "ZK_GRID_VIEW_USE_DEFER_RENDERING";
public static final String ZK_INFO_AUTO_HIDE_EMPTY_COLUMNS = "ZK_INFO_AUTO_HIDE_EMPTY_COLUMNS";
public static final String ZK_INFO_NUM_PAGE_PRELOAD = "ZK_INFO_NUM_PAGE_PRELOAD"; public static final String ZK_INFO_NUM_PAGE_PRELOAD = "ZK_INFO_NUM_PAGE_PRELOAD";
public static final String ZK_INFO_QUERY_TIME_OUT = "ZK_INFO_QUERY_TIME_OUT"; public static final String ZK_INFO_QUERY_TIME_OUT = "ZK_INFO_QUERY_TIME_OUT";
public static final String ZK_LOGIN_ALLOW_CHROME_SAVE_PASSWORD = "ZK_LOGIN_ALLOW_CHROME_SAVE_PASSWORD"; public static final String ZK_LOGIN_ALLOW_CHROME_SAVE_PASSWORD = "ZK_LOGIN_ALLOW_CHROME_SAVE_PASSWORD";

View File

@ -135,7 +135,7 @@ public class InfoWindow extends InfoPanel implements ValueChangeListener, EventL
/** /**
* *
*/ */
private static final long serialVersionUID = 5041961608373943362L; private static final long serialVersionUID = 1180753002653812499L;
protected Grid parameterGrid; protected Grid parameterGrid;
private Borderlayout layout; private Borderlayout layout;

View File

@ -92,6 +92,7 @@ import org.compiere.util.Trx;
import org.compiere.util.Util; import org.compiere.util.Util;
import org.compiere.util.ValueNamePair; import org.compiere.util.ValueNamePair;
import org.zkoss.zk.au.out.AuEcho; import org.zkoss.zk.au.out.AuEcho;
import org.zkoss.zk.ui.Executions;
import org.zkoss.zk.ui.Page; import org.zkoss.zk.ui.Page;
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;
@ -124,6 +125,8 @@ import org.zkoss.zul.ext.Sortable;
public abstract class InfoPanel extends Window implements EventListener<Event>, WTableModelListener, Sortable<Object>, IHelpContext public abstract class InfoPanel extends Window implements EventListener<Event>, WTableModelListener, Sortable<Object>, IHelpContext
{ {
protected static final String INFO_QUERY_TIME_OUT_ERROR = "InfoQueryTimeOutError"; protected static final String INFO_QUERY_TIME_OUT_ERROR = "InfoQueryTimeOutError";
protected static final String COLUMN_VISIBLE_ORIGINAL = "column.visible.original";
/** /**
* *
*/ */
@ -895,6 +898,7 @@ public abstract class InfoPanel extends Window implements EventListener<Event>,
model.setMultiple(p_multipleSelection); model.setMultiple(p_multipleSelection);
contentPanel.setData(model, null); contentPanel.setData(model, null);
} }
autoHideEmptyColumns();
restoreSelectedInPage(); restoreSelectedInPage();
updateStatusBar (m_count); updateStatusBar (m_count);
setStatusSelected (); setStatusSelected ();
@ -904,7 +908,70 @@ public abstract class InfoPanel extends Window implements EventListener<Event>,
insertPagingComponent(); insertPagingComponent();
} }
protected void updateStatusBar (int no){ /**
* auto hide empty columns
*/
protected void autoHideEmptyColumns() {
String attr = contentPanel.getUuid()+".autoHideEmptyColumns";
if (Executions.getCurrent().getAttribute(attr) != null) {
return;
} else {
Executions.getCurrent().setAttribute(attr, Boolean.TRUE);
}
Listhead columns = contentPanel.getListhead();
List<Listheader> columnList = columns.getChildren();
int rowCount = model.getSize();
for(Listheader column : columnList) {
if (!isAutoHideEmptyColumns()) {
if (!column.isVisible()) {
Object attrValue = column.getAttribute(COLUMN_VISIBLE_ORIGINAL);
if (attrValue != null && attrValue instanceof Boolean) {
Boolean b = (Boolean) attrValue;
if (b.booleanValue())
column.setVisible(true);
}
}
continue;
}
boolean hideColumn = false;
if (rowCount > 0) {
hideColumn = true;
for (int i = 0; i < rowCount; i++) {
Object value = model.getDataAt(i, column.getColumnIndex());
String display = value != null ? value.toString() : "";
if (!Util.isEmpty(display, true)) {
hideColumn = false;
break;
}
}
}
if (hideColumn && column.isVisible()) {
column.setVisible(false);
column.setAttribute(COLUMN_VISIBLE_ORIGINAL, Boolean.TRUE);
} else if (!hideColumn && !column.isVisible()) {
Object attrValue = column.getAttribute(COLUMN_VISIBLE_ORIGINAL);
if (attrValue != null && attrValue instanceof Boolean) {
Boolean b = (Boolean) attrValue;
if (b.booleanValue())
column.setVisible(true);
}
}
}
}
/**
*
* @return true if info window should auto hide empty columns
*/
protected boolean isAutoHideEmptyColumns() {
return MSysConfig.getBooleanValue(MSysConfig.ZK_INFO_AUTO_HIDE_EMPTY_COLUMNS, false, Env.getAD_Client_ID(Env.getCtx()));
}
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));
} }
@ -1912,101 +1979,102 @@ public abstract class InfoPanel extends Window implements EventListener<Event>,
return; return;
} }
if (event.getTarget().equals(confirmPanel.getButton(ConfirmPanel.A_OK))) if (event.getTarget().equals(confirmPanel.getButton(ConfirmPanel.A_OK)))
{ {
onOk(); onOk();
} }
else if (event.getTarget() == contentPanel && event.getName().equals(Events.ON_SELECT)) else if (event.getTarget() == contentPanel && event.getName().equals(Events.ON_SELECT))
{ {
setStatusSelected (); setStatusSelected ();
SelectEvent<?, ?> selectEvent = (SelectEvent<?, ?>) event; SelectEvent<?, ?> selectEvent = (SelectEvent<?, ?>) event;
if (selectEvent.getReference() != null && selectEvent.getReference() instanceof Listitem) if (selectEvent.getReference() != null && selectEvent.getReference() instanceof Listitem)
{ {
Listitem m_lastOnSelectItem = (Listitem) selectEvent.getReference(); Listitem m_lastOnSelectItem = (Listitem) selectEvent.getReference();
m_lastSelectedIndex = m_lastOnSelectItem.getIndex(); m_lastSelectedIndex = m_lastOnSelectItem.getIndex();
} }
enableButtons(); enableButtons();
}else if (event.getTarget() == contentPanel && event.getName().equals("onAfterRender")){ }else if (event.getTarget() == contentPanel && event.getName().equals("onAfterRender")){
//IDEMPIERE-1334 at this event selected item from listBox and model is sync //IDEMPIERE-1334 at this event selected item from listBox and model is sync
enableButtons(); enableButtons();
} }
else if (event.getTarget() == contentPanel && event.getName().equals(Events.ON_DOUBLE_CLICK)) else if (event.getTarget() == contentPanel && event.getName().equals(Events.ON_DOUBLE_CLICK))
{ {
if (event.getClass().equals(MouseEvent.class)){ if (event.getClass().equals(MouseEvent.class)){
return; return;
} }
if (contentPanel.isMultiple() && m_lastSelectedIndex >= 0) { if (contentPanel.isMultiple() && m_lastSelectedIndex >= 0) {
contentPanel.setSelectedIndex(m_lastSelectedIndex); contentPanel.setSelectedIndex(m_lastSelectedIndex);
model.clearSelection(); model.clearSelection();
List<Object> lsSelectedItem = new ArrayList<Object>(); List<Object> lsSelectedItem = new ArrayList<Object>();
lsSelectedItem.add(model.getElementAt(m_lastSelectedIndex)); lsSelectedItem.add(model.getElementAt(m_lastSelectedIndex));
model.setSelection(lsSelectedItem); model.setSelection(lsSelectedItem);
int m_keyColumnIndex = contentPanel.getKeyColumnIndex(); int m_keyColumnIndex = contentPanel.getKeyColumnIndex();
for (int i = 0; i < contentPanel.getRowCount(); i++) { for (int i = 0; i < contentPanel.getRowCount(); i++) {
// Find the IDColumn Key // Find the IDColumn Key
Object data = contentPanel.getModel().getValueAt(i, m_keyColumnIndex); Object data = contentPanel.getModel().getValueAt(i, m_keyColumnIndex);
if (data instanceof IDColumn) { if (data instanceof IDColumn) {
IDColumn dataColumn = (IDColumn) data; IDColumn dataColumn = (IDColumn) data;
if (i == m_lastSelectedIndex) { if (i == m_lastSelectedIndex) {
dataColumn.setSelected(true); dataColumn.setSelected(true);
} }
else { else {
dataColumn.setSelected(false); dataColumn.setSelected(false);
}
} }
} }
} }
onDoubleClick(); }
contentPanel.repaint(); onDoubleClick();
m_lastSelectedIndex = -1; contentPanel.repaint();
} m_lastSelectedIndex = -1;
else if (event.getTarget().equals(confirmPanel.getButton(ConfirmPanel.A_REFRESH))) }
else if (event.getTarget().equals(confirmPanel.getButton(ConfirmPanel.A_REFRESH)))
{
onUserQuery();
}
else if (event.getTarget().equals(confirmPanel.getButton(ConfirmPanel.A_CANCEL)))
{
m_cancel = true;
dispose(false);
}
else if (event.getTarget().equals(confirmPanel.getButton(ConfirmPanel.A_RESET))) {
resetParameters ();
}
// Elaine 2008/12/16
else if (event.getTarget().equals(confirmPanel.getButton(ConfirmPanel.A_HISTORY)))
{
if (!contentPanel.getChildren().isEmpty() && contentPanel.getSelectedRowKey()!=null)
{ {
onUserQuery(); showHistory();
} }
else if (event.getTarget().equals(confirmPanel.getButton(ConfirmPanel.A_CANCEL))) }
else if (event.getTarget().equals(confirmPanel.getButton(ConfirmPanel.A_CUSTOMIZE)))
{
if (!contentPanel.getChildren().isEmpty() && contentPanel.getSelectedRowKey()!=null)
{ {
m_cancel = true; customize();
dispose(false);
} }
else if (event.getTarget().equals(confirmPanel.getButton(ConfirmPanel.A_RESET))) { }
resetParameters (); //
} else if (event.getTarget().equals(confirmPanel.getButton(ConfirmPanel.A_ZOOM)))
// Elaine 2008/12/16 {
else if (event.getTarget().equals(confirmPanel.getButton(ConfirmPanel.A_HISTORY))) if (!contentPanel.getChildren().isEmpty() && contentPanel.getSelectedRowKey()!=null)
{ {
if (!contentPanel.getChildren().isEmpty() && contentPanel.getSelectedRowKey()!=null) zoom();
{ if (isLookup())
showHistory(); this.detach();
}
}
else if (event.getTarget().equals(confirmPanel.getButton(ConfirmPanel.A_CUSTOMIZE)))
{
if (!contentPanel.getChildren().isEmpty() && contentPanel.getSelectedRowKey()!=null)
{
customize();
}
}
//
else if (event.getTarget().equals(confirmPanel.getButton(ConfirmPanel.A_ZOOM)))
{
if (!contentPanel.getChildren().isEmpty() && contentPanel.getSelectedRowKey()!=null)
{
zoom();
if (isLookup())
this.detach();
}
}else if (event.getTarget().equals(confirmPanel.getButton(ConfirmPanel.A_NEW)))
{
newRecordAction ();
} }
}
else if (event.getTarget().equals(confirmPanel.getButton(ConfirmPanel.A_NEW)))
{
newRecordAction ();
}
// IDEMPIERE-1334 handle event click into process button start // IDEMPIERE-1334 handle event click into process button start
else if (ON_RUN_PROCESS.equals(event.getName())){ else if (ON_RUN_PROCESS.equals(event.getName())){
// hand echo event after click button process // hand echo event after click button process
@ -2037,70 +2105,71 @@ public abstract class InfoPanel extends Window implements EventListener<Event>,
preRunProcess (processId); preRunProcess (processId);
} }
// IDEMPIERE-1334 handle event click into process button end // IDEMPIERE-1334 handle event click into process button end
else if (event.getTarget() == paging) else if (event.getTarget() == paging)
{ {
updateListSelected(); updateListSelected();
int pgNo = paging.getActivePage(); int pgNo = paging.getActivePage();
if (pgNo == paging.getPageCount()-1 && !isLoadPageNumber()) { if (pgNo == paging.getPageCount()-1 && !isLoadPageNumber()) {
testCount(); testCount();
paging.setTotalSize(m_count); paging.setTotalSize(m_count);
pgNo = paging.getActivePage(); pgNo = paging.getActivePage();
} }
if (pageNo != pgNo) if (pageNo != pgNo)
{
contentPanel.clearSelection();
pageNo = pgNo;
int start = pageNo * pageSize;
int end = getOverIntValue ((long)start + pageSize, extra_max_row);
if (end >= m_count)
end = m_count;
List<Object> subList = readLine(start, end);
model = new ListModelTable(subList);
model.setSorter(this);
model.addTableModelListener(this);
model.setMultiple(p_multipleSelection);
contentPanel.setData(model, null);
restoreSelectedInPage();
//contentPanel.setSelectedIndex(0);
}
}
else if (event.getName().equals(Events.ON_CHANGE))
{
}
else if (event.getName().equals(WindowContainer.ON_WINDOW_CONTAINER_SELECTION_CHANGED_EVENT))
{ {
if (infoWindow != null)
SessionManager.getAppDesktop().updateHelpContext(X_AD_CtxHelp.CTXTYPE_Info, infoWindow.getAD_InfoWindow_ID()); contentPanel.clearSelection();
else
SessionManager.getAppDesktop().updateHelpContext(X_AD_CtxHelp.CTXTYPE_Home, 0); pageNo = pgNo;
int start = pageNo * pageSize;
int end = getOverIntValue ((long)start + pageSize, extra_max_row);
if (end >= m_count)
end = m_count;
List<Object> subList = readLine(start, end);
model = new ListModelTable(subList);
model.setSorter(this);
model.addTableModelListener(this);
model.setMultiple(p_multipleSelection);
contentPanel.setData(model, null);
restoreSelectedInPage();
//contentPanel.setSelectedIndex(0);
}
autoHideEmptyColumns();
}
else if (event.getName().equals(Events.ON_CHANGE))
{
}
else if (event.getName().equals(WindowContainer.ON_WINDOW_CONTAINER_SELECTION_CHANGED_EVENT))
{
if (infoWindow != null)
SessionManager.getAppDesktop().updateHelpContext(X_AD_CtxHelp.CTXTYPE_Info, infoWindow.getAD_InfoWindow_ID());
else
SessionManager.getAppDesktop().updateHelpContext(X_AD_CtxHelp.CTXTYPE_Home, 0);
}
else if (event.getName().equals(Events.ON_CTRL_KEY))
{
KeyEvent keyEvent = (KeyEvent) event;
if (LayoutUtils.isReallyVisible(this)) {
this.onCtrlKeyEvent(keyEvent);
}
}else if (event.getName().equals(Events.ON_OK)){// on ok when focus at non parameter component. example grid result
if (m_lookup && contentPanel.getSelectedIndex() >= 0){
// do nothing when parameter not change and at window mode, or at dialog mode but select non record
onOk();
}
else if (m_infoWindowID == 0 && event.getTarget() instanceof InfoGeneralPanel) {
onUserQuery();
} }
else if (event.getName().equals(Events.ON_CTRL_KEY)) }else if (event.getName().equals(Events.ON_CANCEL) || (event.getTarget().equals(this) && event.getName().equals(Events.ON_CLOSE))){
{ m_cancel = true;
KeyEvent keyEvent = (KeyEvent) event; dispose(false);
if (LayoutUtils.isReallyVisible(this)) { }
this.onCtrlKeyEvent(keyEvent); //when user push enter keyboard at input parameter field
} else
}else if (event.getName().equals(Events.ON_OK)){// on ok when focus at non parameter component. example grid result {
if (m_lookup && contentPanel.getSelectedIndex() >= 0){ // onUserQuery(); // captured now on control key
// do nothing when parameter not change and at window mode, or at dialog mode but select non record }
onOk();
}
else if (m_infoWindowID == 0 && event.getTarget() instanceof InfoGeneralPanel) {
onUserQuery();
}
}else if (event.getName().equals(Events.ON_CANCEL) || (event.getTarget().equals(this) && event.getName().equals(Events.ON_CLOSE))){
m_cancel = true;
dispose(false);
}
//when user push enter keyboard at input parameter field
else
{
// onUserQuery(); // captured now on control key
}
} // onEvent } // onEvent
public static final int VK_ENTER = '\r'; public static final int VK_ENTER = '\r';