IDEMPIERE-4482 Mobile Improvements (#297)

* IDEMPIERE-4482 Mobile Improvements

* IDEMPIERE-4482 Mobile Improvements

minor line height fix for process dialog's message area

* IDEMPIERE-4482 Mobile Improvements

- fix issue with grid view column header height
- add customize grid view button to detail pane
- always show message as notifications for mobile
- fix some mobile layout issues
- default desktop font size to 14px
This commit is contained in:
hengsin 2020-10-14 17:07:18 +08:00 committed by GitHub
parent 6f2cc899d4
commit 91c72fd978
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
39 changed files with 456 additions and 200 deletions

View File

@ -0,0 +1,18 @@
SET SQLBLANKLINES ON
SET DEFINE OFF
-- Oct 12, 2020, 11:36:58 AM 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 (200159,0,0,TO_DATE('2020-10-12 11:36:56','YYYY-MM-DD HH24:MI:SS'),TO_DATE('2020-10-12 11:36:56','YYYY-MM-DD HH24:MI:SS'),100,100,'Y','ZK_GRID_MOBILE_EDITABLE','N','Mobile setting for AD Window Grid View. Y - Grid is editable. N - Grid is read only, must use form view to make changes.','D','S','f70a852c-84df-4de3-82c0-bdc7efda12ef')
;
-- Oct 12, 2020, 1:22:51 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 (200160,0,0,TO_DATE('2020-10-12 13:22:50','YYYY-MM-DD HH24:MI:SS'),TO_DATE('2020-10-12 13:22:50','YYYY-MM-DD HH24:MI:SS'),100,100,'Y','ZK_GRID_MOBILE_LINE_BREAK_AS_IDENTIFIER_SEPARATOR','Y','Mobile setting for AD Window Grid View. Y - Replace identifier separator with line break. N - Use the configured identifier separator','D','S','31b780c9-4789-4feb-9f1a-35a87be34c73')
;
-- Oct 12, 2020, 2:41:17 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 (200161,0,0,TO_DATE('2020-10-12 14:41:17','YYYY-MM-DD HH24:MI:SS'),TO_DATE('2020-10-12 14:41:17','YYYY-MM-DD HH24:MI:SS'),100,100,'Y','ZK_GRID_MOBILE_SHOW_CURRENT_ROW_INDICATOR','N','Mobile setting for AD Window Grid View. Y - add a column to display the current row indicator. N - no column created for current row indicator','D','S','aacc9992-7296-4d0d-b74b-c38f8e0f5a4d')
;
SELECT register_migration_script('202010121700_IDEMPIERE-4482.sql') FROM dual
;

View File

@ -0,0 +1,18 @@
SET SQLBLANKLINES ON
SET DEFINE OFF
-- Oct 14, 2020, 11:28:34 AM MYT
INSERT INTO AD_ToolBarButton (AD_Client_ID,AD_Org_ID,Created,CreatedBy,ComponentName,IsActive,AD_ToolBarButton_ID,Name,Updated,UpdatedBy,IsCustomization,KeyStroke_KeyCode,KeyStroke_Modifiers,AD_ToolBarButton_UU,Action,SeqNo,IsAdvancedButton,IsAddSeparator,EntityType,IsShowMore) VALUES (0,0,TO_DATE('2020-10-14 11:28:33','YYYY-MM-DD HH24:MI:SS'),100,'Customize','Y',200108,'Detail - Customize',TO_DATE('2020-10-14 11:28:33','YYYY-MM-DD HH24:MI:SS'),100,'N',0,0,'5b08fba8-f90e-4e27-8690-e4c7bbc242d2','D',0,'N','N','D','N')
;
-- Oct 14, 2020, 11:29:29 AM MYT
UPDATE AD_ToolBarButton SET SeqNo=60,Updated=TO_DATE('2020-10-14 11:29:29','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_ToolBarButton_ID=200095
;
-- Oct 14, 2020, 11:29:34 AM MYT
UPDATE AD_ToolBarButton SET SeqNo=70,Updated=TO_DATE('2020-10-14 11:29:34','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_ToolBarButton_ID=200108
;
SELECT register_migration_script('202010141500_IDEMPIERE-4482.sql') FROM dual
;

View File

@ -0,0 +1,15 @@
-- Oct 12, 2020, 11:36:58 AM 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 (200159,0,0,TO_TIMESTAMP('2020-10-12 11:36:56','YYYY-MM-DD HH24:MI:SS'),TO_TIMESTAMP('2020-10-12 11:36:56','YYYY-MM-DD HH24:MI:SS'),100,100,'Y','ZK_GRID_MOBILE_EDITABLE','N','Mobile setting for AD Window Grid View. Y - Grid is editable. N - Grid is read only, must use form view to make changes.','D','S','f70a852c-84df-4de3-82c0-bdc7efda12ef')
;
-- Oct 12, 2020, 1:22:51 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 (200160,0,0,TO_TIMESTAMP('2020-10-12 13:22:50','YYYY-MM-DD HH24:MI:SS'),TO_TIMESTAMP('2020-10-12 13:22:50','YYYY-MM-DD HH24:MI:SS'),100,100,'Y','ZK_GRID_MOBILE_LINE_BREAK_AS_IDENTIFIER_SEPARATOR','Y','Mobile setting for AD Window Grid View. Y - Replace identifier separator with line break. N - Use the configured identifier separator','D','S','31b780c9-4789-4feb-9f1a-35a87be34c73')
;
-- Oct 12, 2020, 2:41:17 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 (200161,0,0,TO_TIMESTAMP('2020-10-12 14:41:17','YYYY-MM-DD HH24:MI:SS'),TO_TIMESTAMP('2020-10-12 14:41:17','YYYY-MM-DD HH24:MI:SS'),100,100,'Y','ZK_GRID_MOBILE_SHOW_CURRENT_ROW_INDICATOR','N','Mobile setting for AD Window Grid View. Y - add a column to display the current row indicator. N - no column created for current row indicator','D','S','aacc9992-7296-4d0d-b74b-c38f8e0f5a4d')
;
SELECT register_migration_script('202010121700_IDEMPIERE-4482.sql') FROM dual
;

View File

@ -0,0 +1,15 @@
-- Oct 14, 2020, 11:28:34 AM MYT
INSERT INTO AD_ToolBarButton (AD_Client_ID,AD_Org_ID,Created,CreatedBy,ComponentName,IsActive,AD_ToolBarButton_ID,Name,Updated,UpdatedBy,IsCustomization,KeyStroke_KeyCode,KeyStroke_Modifiers,AD_ToolBarButton_UU,"action",SeqNo,IsAdvancedButton,IsAddSeparator,EntityType,IsShowMore) VALUES (0,0,TO_TIMESTAMP('2020-10-14 11:28:33','YYYY-MM-DD HH24:MI:SS'),100,'Customize','Y',200108,'Detail - Customize',TO_TIMESTAMP('2020-10-14 11:28:33','YYYY-MM-DD HH24:MI:SS'),100,'N',0,0,'5b08fba8-f90e-4e27-8690-e4c7bbc242d2','D',0,'N','N','D','N')
;
-- Oct 14, 2020, 11:29:29 AM MYT
UPDATE AD_ToolBarButton SET SeqNo=60,Updated=TO_TIMESTAMP('2020-10-14 11:29:29','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_ToolBarButton_ID=200095
;
-- Oct 14, 2020, 11:29:34 AM MYT
UPDATE AD_ToolBarButton SET SeqNo=70,Updated=TO_TIMESTAMP('2020-10-14 11:29:34','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_ToolBarButton_ID=200108
;
SELECT register_migration_script('202010141500_IDEMPIERE-4482.sql') FROM dual
;

View File

@ -175,8 +175,11 @@ public class MSysConfig extends X_AD_SysConfig
public static final String ZK_FOOTER_SERVER_MSG = "ZK_FOOTER_SERVER_MSG"; public static final String ZK_FOOTER_SERVER_MSG = "ZK_FOOTER_SERVER_MSG";
public static final String ZK_GRID_AFTER_FIND = "ZK_GRID_AFTER_FIND"; public static final String ZK_GRID_AFTER_FIND = "ZK_GRID_AFTER_FIND";
public static final String ZK_GRID_EDIT_MODELESS = "ZK_GRID_EDIT_MODELESS"; public static final String ZK_GRID_EDIT_MODELESS = "ZK_GRID_EDIT_MODELESS";
public static final String ZK_GRID_MOBILE_EDITABLE = "ZK_GRID_MOBILE_EDITABLE";
public static final String ZK_GRID_MOBILE_EDIT_MODELESS = "ZK_GRID_MOBILE_EDIT_MODELESS"; public static final String ZK_GRID_MOBILE_EDIT_MODELESS = "ZK_GRID_MOBILE_EDIT_MODELESS";
public static final String ZK_GRID_MOBILE_LINE_BREAK_AS_IDENTIFIER_SEPARATOR = "ZK_GRID_MOBILE_LINE_BREAK_AS_IDENTIFIER_SEPARATOR";
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_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_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";
public static final String ZK_LOGIN_ALLOW_REMEMBER_ME = "ZK_LOGIN_ALLOW_REMEMBER_ME"; public static final String ZK_LOGIN_ALLOW_REMEMBER_ME = "ZK_LOGIN_ALLOW_REMEMBER_ME";

View File

@ -534,6 +534,10 @@ public class AdempiereWebUI extends Window implements EventListener<Event>, IWeb
Env.setContext(properties, ITheme.ZK_TOOLBAR_BUTTON_SIZE, Env.getContext(Env.getCtx(), ITheme.ZK_TOOLBAR_BUTTON_SIZE)); Env.setContext(properties, ITheme.ZK_TOOLBAR_BUTTON_SIZE, Env.getContext(Env.getCtx(), ITheme.ZK_TOOLBAR_BUTTON_SIZE));
Env.setContext(properties, ITheme.USE_CSS_FOR_WINDOW_SIZE, Env.getContext(Env.getCtx(), ITheme.USE_CSS_FOR_WINDOW_SIZE)); Env.setContext(properties, ITheme.USE_CSS_FOR_WINDOW_SIZE, Env.getContext(Env.getCtx(), ITheme.USE_CSS_FOR_WINDOW_SIZE));
Env.setContext(properties, ITheme.USE_FONT_ICON_FOR_IMAGE, Env.getContext(Env.getCtx(), ITheme.USE_FONT_ICON_FOR_IMAGE)); Env.setContext(properties, ITheme.USE_FONT_ICON_FOR_IMAGE, Env.getContext(Env.getCtx(), ITheme.USE_FONT_ICON_FOR_IMAGE));
Env.setContext(properties, "#clientInfo_desktopWidth", clientInfo.desktopWidth);
Env.setContext(properties, "#clientInfo_desktopHeight", clientInfo.desktopHeight);
Env.setContext(properties, "#clientInfo_orientation", clientInfo.orientation);
Env.setContext(properties, "#clientInfo_mobile", clientInfo.tablet);
Desktop desktop = Executions.getCurrent().getDesktop(); Desktop desktop = Executions.getCurrent().getDesktop();
Locale locale = (Locale) desktop.getSession().getAttribute(Attributes.PREFERRED_LOCALE); Locale locale = (Locale) desktop.getSession().getAttribute(Attributes.PREFERRED_LOCALE);

View File

@ -32,11 +32,11 @@ import org.zkoss.zk.ui.sys.ComponentCtrl;
* @author Low Heng Sin * @author Low Heng Sin
* *
*/ */
public class ClientInfo implements Serializable { public class ClientInfo implements Serializable {
/** /**
* *
*/ */
private static final long serialVersionUID = -713195891415378500L; private static final long serialVersionUID = -2686811277627911861L;
public int colorDepth; public int colorDepth;
public int desktopWidth; public int desktopWidth;
@ -157,4 +157,11 @@ public class ClientInfo implements Serializable {
root.addEventListener(Events.ON_CLIENT_INFO, eventListener); root.addEventListener(Events.ON_CLIENT_INFO, eventListener);
ctrl.addCallback(AFTER_PAGE_DETACHED, t -> root.removeEventListener(Events.ON_CLIENT_INFO, eventListener)); ctrl.addCallback(AFTER_PAGE_DETACHED, t -> root.removeEventListener(Events.ON_CLIENT_INFO, eventListener));
} }
/**
* @return true if screen orientation is portrait, false otherwise
*/
public boolean isPortrait() {
return "portrait".equalsIgnoreCase(orientation);
}
} }

View File

@ -102,7 +102,6 @@ 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.event.OpenEvent; import org.zkoss.zk.ui.event.OpenEvent;
import org.zkoss.zk.ui.event.SwipeEvent;
import org.zkoss.zk.ui.util.Clients; import org.zkoss.zk.ui.util.Clients;
import org.zkoss.zul.Button; import org.zkoss.zul.Button;
import org.zkoss.zul.Cell; import org.zkoss.zul.Cell;
@ -260,11 +259,48 @@ DataStatusListener, IADTabpanel, IdSpace, IFieldEditorContainer
form.setVflex(false); form.setVflex(false);
form.setSclass("grid-layout adwindow-form"); form.setSclass("grid-layout adwindow-form");
form.setWidgetAttribute(AdempiereWebUI.WIDGET_INSTANCE_NAME, "form"); form.setWidgetAttribute(AdempiereWebUI.WIDGET_INSTANCE_NAME, "form");
if (ClientInfo.isMobile())
{
form.addEventListener("onSwipeRight", e -> {
if (windowPanel != null && windowPanel.getBreadCrumb() != null && windowPanel.getBreadCrumb().isPreviousEnabled())
windowPanel.onPrevious();
});
form.addEventListener("onSwipeLeft", e -> {
if (windowPanel != null && windowPanel.getBreadCrumb() != null && windowPanel.getBreadCrumb().isNextEnabled())
windowPanel.onNext();
});
}
listPanel = new GridView(); listPanel = new GridView();
if( "Y".equals(Env.getContext(Env.getCtx(), "P|ToggleOnDoubleClick")) ) if( "Y".equals(Env.getContext(Env.getCtx(), "P|ToggleOnDoubleClick")) )
listPanel.getListbox().addEventListener(Events.ON_DOUBLE_CLICK, this); listPanel.getListbox().addEventListener(Events.ON_DOUBLE_CLICK, this);
} }
private void setupFormSwipeListener() {
String uuid = form.getUuid();
StringBuilder script = new StringBuilder("var w=zk.Widget.$('")
.append(uuid)
.append("');");
script.append("jq(w).on('touchstart', function(e) {var w=zk.Widget.$(this);w._touchstart=e;});");
script.append("jq(w).on('touchmove', function(e) {var w=zk.Widget.$(this);w._touchmove=e;});");
script.append("jq(w).on('touchend', function(e) {var w=zk.Widget.$(this);var ts = w._touchstart; var tl = w._touchmove;"
+ "w._touchstart=null;w._touchmove=null;"
+ "if (ts && tl) {"
+ "if (ts.originalEvent) ts = ts.originalEvent;"
+ "if (tl.originalEvent) tl = tl.originalEvent;"
+ "if (ts.changedTouches && ts.changedTouches.length==1 && tl.changedTouches && tl.changedTouches.length==1) {"
+ "var diff=(tl.timeStamp-ts.timeStamp)/1000;if (diff > 1) return;"
+ "var diffx=tl.changedTouches[0].pageX-ts.changedTouches[0].pageX;"
+ "var diffy=tl.changedTouches[0].pageY-ts.changedTouches[0].pageY;"
+ "if (Math.abs(diffx) >= 100 && Math.abs(diffy) < 80) {"
+ "if (diffx > 0) {var event = new zk.Event(w, 'onSwipeRight', null, {toServer: true});zAu.send(event);} "
+ "else {var event = new zk.Event(w, 'onSwipeLeft', null, {toServer: true});zAu.send(event);}"
+ "}"
+ "}"
+ "}"
+ "});");
Clients.response(new AuScript(script.toString()));
}
@Override @Override
public void setDetailPane(DetailPane component) { public void setDetailPane(DetailPane component) {
@ -277,23 +313,7 @@ DataStatusListener, IADTabpanel, IdSpace, IFieldEditorContainer
LayoutUtils.addSlideSclass(south); LayoutUtils.addSlideSclass(south);
borderLayout.appendChild(south); borderLayout.appendChild(south);
south.addEventListener(Events.ON_OPEN, this); south.addEventListener(Events.ON_OPEN, this);
south.addEventListener(Events.ON_SLIDE, this); south.addEventListener(Events.ON_SLIDE, this);
south.addEventListener(Events.ON_SWIPE, new EventListener<SwipeEvent>() {
@Override
public void onEvent(SwipeEvent event) throws Exception {
if ("down".equals(event.getSwipeDirection())) {
Borderlayout borderLayout = (Borderlayout) formContainer;
South south = borderLayout.getSouth();
if (south.isOpen()) {
south.setOpen(false);
OpenEvent openEvent = new OpenEvent(Events.ON_OPEN, south, false);
Events.postEvent(openEvent);
}
}
}
});
} }
south.appendChild(component); south.appendChild(component);
@ -475,7 +495,7 @@ DataStatusListener, IADTabpanel, IdSpace, IFieldEditorContainer
diff = numCols - 6; diff = numCols - 6;
numCols=6; numCols=6;
} }
} }
} }
this.numberOfFormColumns = numCols; this.numberOfFormColumns = numCols;
@ -1181,7 +1201,7 @@ DataStatusListener, IADTabpanel, IdSpace, IFieldEditorContainer
if (gridTab.getRecord_ID() > 0 && gridTab.isTreeTab() && treePanel != null) { if (gridTab.getRecord_ID() > 0 && gridTab.isTreeTab() && treePanel != null) {
echoDeferSetSelectedNodeEvent(); echoDeferSetSelectedNodeEvent();
} }
Event event = new Event(ON_ACTIVATE_EVENT, this, activate); Event event = new Event(ON_ACTIVATE_EVENT, this, activate);
Events.postEvent(event); Events.postEvent(event);
} }
@ -1921,6 +1941,8 @@ DataStatusListener, IADTabpanel, IdSpace, IFieldEditorContainer
super.setParent(parent); super.setParent(parent);
if (parent != null) { if (parent != null) {
listPanel.onADTabPanelParentChanged(); listPanel.onADTabPanelParentChanged();
if (ClientInfo.isMobile())
setupFormSwipeListener();
} }
} }

View File

@ -28,7 +28,6 @@ import java.util.Properties;
import org.adempiere.util.Callback; import org.adempiere.util.Callback;
import org.adempiere.webui.LayoutUtils; import org.adempiere.webui.LayoutUtils;
import org.adempiere.webui.component.Tabpanel; import org.adempiere.webui.component.Tabpanel;
import org.adempiere.webui.component.ToolBarButton;
import org.adempiere.webui.panel.IHelpContext; import org.adempiere.webui.panel.IHelpContext;
import org.adempiere.webui.panel.ITabOnCloseHandler; import org.adempiere.webui.panel.ITabOnCloseHandler;
import org.adempiere.webui.part.WindowContainer; import org.adempiere.webui.part.WindowContainer;
@ -36,15 +35,12 @@ import org.adempiere.webui.session.SessionManager;
import org.adempiere.webui.util.ZKUpdateUtil; import org.adempiere.webui.util.ZKUpdateUtil;
import org.compiere.model.X_AD_CtxHelp; import org.compiere.model.X_AD_CtxHelp;
import org.compiere.util.CLogger; import org.compiere.util.CLogger;
import org.zkoss.zk.au.out.AuScript;
import org.zkoss.zk.ui.Component; import org.zkoss.zk.ui.Component;
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;
import org.zkoss.zk.ui.event.Events; import org.zkoss.zk.ui.event.Events;
import org.zkoss.zk.ui.event.KeyEvent; import org.zkoss.zk.ui.event.KeyEvent;
import org.zkoss.zk.ui.event.SwipeEvent;
import org.zkoss.zk.ui.util.Clients;
import org.zkoss.zul.Div; import org.zkoss.zul.Div;
import org.zkoss.zul.Tab; import org.zkoss.zul.Tab;
import org.zkoss.zul.Vlayout; import org.zkoss.zul.Vlayout;
@ -98,44 +94,6 @@ public class ADWindowContent extends AbstractADWindowContent
breadCrumb.setToolbarListener(this); breadCrumb.setToolbarListener(this);
breadCrumb.setId("breadCrumb"); breadCrumb.setId("breadCrumb");
div.appendChild(breadCrumb); div.appendChild(breadCrumb);
div.addEventListener(Events.ON_SWIPE, new EventListener<SwipeEvent>() {
@Override
public void onEvent(SwipeEvent event) throws Exception {
if ("right".equals(event.getSwipeDirection())) {
ToolBarButton nextBtn = breadCrumb.getNextButton();
if (!nextBtn.isDisabled()) {
nextBtn.setDisabled(true);
String script = "var w=zk.Widget.$('#"+nextBtn.getUuid()+"');" +
"w.fire('onClick',null,{toServer:true});";
Clients.response(new AuScript(script));
}
} else if ("left".equals(event.getSwipeDirection())) {
ToolBarButton previousBtn = breadCrumb.getPreviousButton();
if (!previousBtn.isDisabled()) {
previousBtn.setDisabled(true);
String script = "var w=zk.Widget.$('#"+previousBtn.getUuid()+"');" +
"w.fire('onClick',null,{toServer:true});";
Clients.response(new AuScript(script));
}
} else if ("up".equals(event.getSwipeDirection())) {
ToolBarButton parentBtn = toolbar.getButton("ParentRecord");
if (!parentBtn.isDisabled()) {
parentBtn.setDisabled(true);
String script = "var w=zk.Widget.$('#"+parentBtn.getUuid()+"');" +
"w.fire('onClick',null,{toServer:true});";
Clients.response(new AuScript(script));
}
} else if ("down".equals(event.getSwipeDirection())) {
ToolBarButton detailBtn = toolbar.getButton("DetailRecord");
if (!detailBtn.isDisabled()) {
detailBtn.setDisabled(true);
String script = "var w=zk.Widget.$('#"+detailBtn.getUuid()+"');" +
"w.fire('onClick',null,{toServer:true});";
Clients.response(new AuScript(script));
}
}
}
});
//status bar //status bar
div.appendChild(statusBar); div.appendChild(statusBar);

View File

@ -1069,12 +1069,13 @@ public class ADWindowToolbar extends FToolbar implements EventListener<Event>
" return;\n" + " return;\n" +
" }\n" + " }\n" +
" for (; w; w = w.nextSibling) {\n" + " for (; w; w = w.nextSibling) {\n" +
" total -= jq(w.$n()).outerWidth(true);\n" + " var ow = jq(w.$n()).outerWidth(true);\n" +
" if (typeof ow != 'undefined') {total -= ow;}\n" +
" if (total < 0 && w.className == 'zul.wgt.Toolbarbutton') {\n" + " if (total < 0 && w.className == 'zul.wgt.Toolbarbutton') {\n" +
" break;\n" + " break;\n" +
" }\n" + " }\n" +
" }\n" + " }\n" +
" if (w) {\n" + " if (w && total < 0) {\n" +
" var event = new zk.Event(wgt, 'onOverflowButton', w.uuid, {toServer: true}); \n" + " var event = new zk.Event(wgt, 'onOverflowButton', w.uuid, {toServer: true}); \n" +
" zAu.send(event); \n" + " zAu.send(event); \n" +
" }\n" + " }\n" +
@ -1139,7 +1140,7 @@ public class ADWindowToolbar extends FToolbar implements EventListener<Event>
if (overflows.size() > 0) { if (overflows.size() > 0) {
overflowButton = new A(); overflowButton = new A();
overflowButton.setIconSclass("z-icon-ShowMore"); overflowButton.setIconSclass("z-icon-ShowMore");
overflowButton.setStyle("position: absolute; right: 4px; font-size: 18px; font-weight: 500; color: #333"); overflowButton.setStyle("position: absolute; right: 8px; font-weight: 500; color: #333");
appendChild(overflowButton); appendChild(overflowButton);
overflowPopup = new Popup(); overflowPopup = new Popup();
overflowPopup.addEventListener(Events.ON_OPEN, (OpenEvent oe) -> { overflowPopup.addEventListener(Events.ON_OPEN, (OpenEvent oe) -> {

View File

@ -121,8 +121,6 @@ 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.ExecutionCtrl; import org.zkoss.zk.ui.sys.ExecutionCtrl;
import org.zkoss.zk.ui.util.Clients; import org.zkoss.zk.ui.util.Clients;
import org.zkoss.zul.Column;
import org.zkoss.zul.Columns;
import org.zkoss.zul.Div; import org.zkoss.zul.Div;
import org.zkoss.zul.Menuitem; import org.zkoss.zul.Menuitem;
import org.zkoss.zul.Menupopup; import org.zkoss.zul.Menupopup;
@ -1148,7 +1146,9 @@ public abstract class AbstractADWindowContent extends AbstractUIPart implements
form.setMaximizable(true); form.setMaximizable(true);
form.setMaximized(true); form.setMaximized(true);
form.setPosition("center"); form.setPosition("center");
ZkCssHelper.appendStyle(form, "min-width: 500px; min-height: 400px; width: 900px; height:550px; z-index: 900;"); ZKUpdateUtil.setWindowHeightX(form, 550);
ZKUpdateUtil.setWindowWidthX(form, 900);
ZkCssHelper.appendStyle(form, "z-index: 900;");
AEnv.showWindow(form); AEnv.showWindow(form);
} // onQuickForm } // onQuickForm
@ -3583,22 +3583,7 @@ public abstract class AbstractADWindowContent extends AbstractUIPart implements
*/ */
public void onCustomize() { public void onCustomize() {
ADTabpanel tabPanel = (ADTabpanel) getADTab().getSelectedTabpanel(); ADTabpanel tabPanel = (ADTabpanel) getADTab().getSelectedTabpanel();
Columns columns = tabPanel.getGridView().getListbox().getColumns(); CustomizeGridViewDialog.onCustomize(tabPanel);
List<Component> columnList = columns.getChildren();
GridField[] fields = tabPanel.getGridView().getFields();
Map<Integer, String> columnsWidth = new HashMap<Integer, String>();
ArrayList<Integer> gridFieldIds = new ArrayList<Integer>();
for (int i = 0; i < fields.length; i++) {
// 2 is offset of num of column in grid view and actual data fields.
// in grid view, add two function column, indicator column and selection (checkbox) column
// @see GridView#setupColumns
Column column = (Column) columnList.get(i+2);
String width = column.getWidth();
columnsWidth.put(fields[i].getAD_Field_ID(), width);
gridFieldIds.add(fields[i].getAD_Field_ID());
}
CustomizeGridViewDialog.showCustomize(0, adTabbox.getSelectedGridTab().getAD_Tab_ID(), columnsWidth,gridFieldIds,tabPanel.getGridView(), null, false);
} }
/** /**

View File

@ -30,7 +30,6 @@ import org.adempiere.webui.event.ToolbarListener;
import org.adempiere.webui.session.SessionManager; import org.adempiere.webui.session.SessionManager;
import org.adempiere.webui.theme.ITheme; import org.adempiere.webui.theme.ITheme;
import org.adempiere.webui.theme.ThemeManager; import org.adempiere.webui.theme.ThemeManager;
import org.adempiere.webui.util.ZKUpdateUtil;
import org.adempiere.webui.window.WRecordInfo; import org.adempiere.webui.window.WRecordInfo;
import org.compiere.model.DataStatusEvent; import org.compiere.model.DataStatusEvent;
import org.compiere.model.GridTab; import org.compiere.model.GridTab;
@ -48,7 +47,6 @@ import org.zkoss.zk.ui.event.Events;
import org.zkoss.zk.ui.event.KeyEvent; import org.zkoss.zk.ui.event.KeyEvent;
import org.zkoss.zk.ui.util.Clients; import org.zkoss.zk.ui.util.Clients;
import org.zkoss.zul.Div; import org.zkoss.zul.Div;
import org.zkoss.zul.Hbox;
import org.zkoss.zul.Hlayout; import org.zkoss.zul.Hlayout;
import org.zkoss.zul.Menuitem; import org.zkoss.zul.Menuitem;
@ -69,7 +67,7 @@ public class BreadCrumb extends Div implements EventListener<Event> {
private static final String BTNPREFIX = "Btn"; private static final String BTNPREFIX = "Btn";
private Hbox layout; private Hlayout layout;
private ToolBarButton btnFirst, btnPrevious, btnNext, btnLast, btnRecordInfo; private ToolBarButton btnFirst, btnPrevious, btnNext, btnLast, btnRecordInfo;
@ -101,18 +99,16 @@ public class BreadCrumb extends Div implements EventListener<Event> {
public BreadCrumb(AbstractADWindowContent windowContent, int windowNo) { public BreadCrumb(AbstractADWindowContent windowContent, int windowNo) {
this.windowContent = windowContent; this.windowContent = windowContent;
this.windowNo = windowNo; this.windowNo = windowNo;
layout = new Hbox(); layout = new Hlayout();
layout.setPack("start"); layout.setValign("middle");
layout.setAlign("center");
this.appendChild(layout); this.appendChild(layout);
ZKUpdateUtil.setHeight(layout, "100%"); layout.setSclass("adwindow-breadcrumb-paths");
layout.setStyle("float: left");
this.setVisible(false); this.setVisible(false);
this.setSclass("adwindow-breadcrumb"); this.setSclass("adwindow-breadcrumb");
toolbarContainer = new Hlayout(); toolbarContainer = new Hlayout();
toolbarContainer.setStyle("display: inline-block; float: right"); toolbarContainer.setSclass("adwindow-breadcrumb-toolbar");
this.appendChild(toolbarContainer); this.appendChild(toolbarContainer);
ToolBar toolbar = new ToolBar(); ToolBar toolbar = new ToolBar();
@ -137,7 +133,6 @@ public class BreadCrumb extends Div implements EventListener<Event> {
btnLast.setTooltiptext(btnLast.getTooltiptext()+" Alt+End"); btnLast.setTooltiptext(btnLast.getTooltiptext()+" Alt+End");
toolbar.appendChild(btnLast); toolbar.appendChild(btnLast);
toolbar.setStyle("background-image: none; background-color: transparent; border: none;");
setWidgetAttribute(AdempiereWebUI.WIDGET_INSTANCE_NAME, "breadcrumb"); setWidgetAttribute(AdempiereWebUI.WIDGET_INSTANCE_NAME, "breadcrumb");
this.addEventListener(ON_MOUSE_OUT_ECHO_EVENT, this); this.addEventListener(ON_MOUSE_OUT_ECHO_EVENT, this);

View File

@ -24,6 +24,7 @@ import org.adempiere.webui.component.Window;
import org.adempiere.webui.session.SessionManager; import org.adempiere.webui.session.SessionManager;
import org.adempiere.webui.theme.ThemeManager; import org.adempiere.webui.theme.ThemeManager;
import org.adempiere.webui.util.ZKUpdateUtil; import org.adempiere.webui.util.ZKUpdateUtil;
import org.adempiere.webui.window.CustomizeGridViewDialog;
import org.compiere.model.MToolBarButton; import org.compiere.model.MToolBarButton;
import org.compiere.util.Env; import org.compiere.util.Env;
import org.compiere.util.Msg; import org.compiere.util.Msg;
@ -72,6 +73,8 @@ public class DetailPane extends Panel implements EventListener<Event>, IdSpace {
private static final String BTN_QUICK_FORM_ID = "BtnQuickForm"; private static final String BTN_QUICK_FORM_ID = "BtnQuickForm";
private static final String BTN_CUSTOMIZE_ID = "BtnCustomize";
private static final String TABBOX_ONSELECT_ATTRIBUTE = "detailpane.tabbox.onselect"; private static final String TABBOX_ONSELECT_ATTRIBUTE = "detailpane.tabbox.onselect";
public static final String ON_POST_SELECT_TAB_EVENT = "onPostSelectTab"; public static final String ON_POST_SELECT_TAB_EVENT = "onPostSelectTab";
@ -80,6 +83,7 @@ public class DetailPane extends Panel implements EventListener<Event>, IdSpace {
private static final String STATUS_ERROR_ATTRIBUTE = "status.error"; private static final String STATUS_ERROR_ATTRIBUTE = "status.error";
private static final String CUSTOMIZE_IMAGE = "images/Customize16.png";
private static final String DELETE_IMAGE = "images/Delete16.png"; private static final String DELETE_IMAGE = "images/Delete16.png";
private static final String EDIT_IMAGE = "images/EditRecord16.png"; private static final String EDIT_IMAGE = "images/EditRecord16.png";
private static final String NEW_IMAGE = "images/New16.png"; private static final String NEW_IMAGE = "images/New16.png";
@ -378,6 +382,17 @@ public class DetailPane extends Panel implements EventListener<Event>, IdSpace {
button.setTooltiptext(Util.cleanAmp(Msg.getMsg(Env.getCtx(), "QuickForm"))); button.setTooltiptext(Util.cleanAmp(Msg.getMsg(Env.getCtx(), "QuickForm")));
buttons.put(BTN_QUICK_FORM_ID.substring(3, BTN_QUICK_FORM_ID.length()), button); buttons.put(BTN_QUICK_FORM_ID.substring(3, BTN_QUICK_FORM_ID.length()), button);
// ADD Customize grid button
button = new ToolBarButton();
if (ThemeManager.isUseFontIconForImage())
button.setIconSclass("z-icon-Customize");
else
button.setImage(ThemeManager.getThemeResource(CUSTOMIZE_IMAGE));
button.setId(BTN_CUSTOMIZE_ID);
button.addEventListener(Events.ON_CLICK, e -> onCustomize(e));
button.setTooltiptext(Util.cleanAmp(Msg.getMsg(Env.getCtx(), "Customize")));
buttons.put(BTN_CUSTOMIZE_ID.substring(3, BTN_CUSTOMIZE_ID.length()), button);
MToolBarButton[] officialButtons = MToolBarButton.getToolbarButtons("D", null); MToolBarButton[] officialButtons = MToolBarButton.getToolbarButtons("D", null);
for (MToolBarButton toolbarButton : officialButtons) { for (MToolBarButton toolbarButton : officialButtons) {
if ( !toolbarButton.isActive() ) { if ( !toolbarButton.isActive() ) {
@ -433,6 +448,7 @@ public class DetailPane extends Panel implements EventListener<Event>, IdSpace {
messageContainer.setSclass("adwindow-detailpane-message"); messageContainer.setSclass("adwindow-detailpane-message");
messageContainer.setId("messages"); messageContainer.setId("messages");
toolbar.appendChild(new Space());
toolbar.appendChild(messageContainer); toolbar.appendChild(messageContainer);
toolbar.setSclass("adwindow-detailpane-toolbar"); toolbar.setSclass("adwindow-detailpane-toolbar");
ZKUpdateUtil.setVflex(toolbar, "0"); ZKUpdateUtil.setVflex(toolbar, "0");
@ -453,6 +469,13 @@ public class DetailPane extends Panel implements EventListener<Event>, IdSpace {
} }
} }
protected void onCustomize(Event e) {
if (getSelectedADTabpanel() instanceof ADTabpanel) {
ADTabpanel tabPanel = (ADTabpanel) getSelectedADTabpanel();
CustomizeGridViewDialog.onCustomize(tabPanel);
}
}
protected void onProcess(Component button) { protected void onProcess(Component button) {
ProcessButtonPopup popup = new ProcessButtonPopup(); ProcessButtonPopup popup = new ProcessButtonPopup();
ADTabpanel adtab = (ADTabpanel) getSelectedADTabpanel(); ADTabpanel adtab = (ADTabpanel) getSelectedADTabpanel();

View File

@ -20,6 +20,7 @@ import java.util.Map.Entry;
import java.util.Properties; import java.util.Properties;
import org.adempiere.util.GridRowCtx; import org.adempiere.util.GridRowCtx;
import org.adempiere.webui.ClientInfo;
import org.adempiere.webui.LayoutUtils; import org.adempiere.webui.LayoutUtils;
import org.adempiere.webui.component.Button; import org.adempiere.webui.component.Button;
import org.adempiere.webui.component.Checkbox; import org.adempiere.webui.component.Checkbox;
@ -475,19 +476,20 @@ public class GridTabRowRenderer implements RowRenderer<Object[]>, RowRendererExt
cell.appendChild(selection); cell.appendChild(selection);
row.appendChild(cell); row.appendChild(cell);
cell = new Cell(); if (isShowCurrentRowIndicatorColumn()) {
cell.addEventListener(Events.ON_CLICK, this); cell = new Cell();
cell.setStyle("border: none;"); cell.addEventListener(Events.ON_CLICK, this);
cell.setTooltiptext(Util.cleanAmp(Msg.getMsg(Env.getCtx(), "EditRecord"))); cell.setStyle("border: none;");
if (ThemeManager.isUseFontIconForImage()) { cell.setTooltiptext(Util.cleanAmp(Msg.getMsg(Env.getCtx(), "EditRecord")));
Label indicatorLabel = new Label(); if (ThemeManager.isUseFontIconForImage()) {
cell.appendChild(indicatorLabel); Label indicatorLabel = new Label();
final Cell finalCell = cell; cell.appendChild(indicatorLabel);
indicatorLabel.addEventListener(Events.ON_CLICK, evt->Events.postEvent(Events.ON_CLICK, finalCell, indicatorLabel.getSclass())); final Cell finalCell = cell;
indicatorLabel.addEventListener(Events.ON_CLICK, evt->Events.postEvent(Events.ON_CLICK, finalCell, indicatorLabel.getSclass()));
}
cell.setValign("middle");
row.appendChild(cell);
} }
cell.setValign("middle");
row.appendChild(cell);
Boolean isActive = null; Boolean isActive = null;
int colIndex = -1; int colIndex = -1;
@ -599,7 +601,7 @@ public class GridTabRowRenderer implements RowRenderer<Object[]>, RowRendererExt
* @param row * @param row
*/ */
public void setCurrentRow(Row row) { public void setCurrentRow(Row row) {
if (currentRow != null && currentRow.getParent() != null && currentRow != row) { if (currentRow != null && currentRow.getParent() != null && currentRow != row && isShowCurrentRowIndicatorColumn()) {
Cell cell = (Cell) currentRow.getChildren().get(1); Cell cell = (Cell) currentRow.getChildren().get(1);
if (cell != null) { if (cell != null) {
cell.setSclass("row-indicator"); cell.setSclass("row-indicator");
@ -609,7 +611,7 @@ public class GridTabRowRenderer implements RowRenderer<Object[]>, RowRendererExt
} }
currentRow = row; currentRow = row;
Cell cell = (Cell) currentRow.getChildren().get(1); Cell cell = (Cell) currentRow.getChildren().get(1);
if (cell != null) { if (cell != null && isShowCurrentRowIndicatorColumn()) {
if (ThemeManager.isUseFontIconForImage()) if (ThemeManager.isUseFontIconForImage())
{ {
Label indicatorLabel = (Label) cell.getFirstChild(); Label indicatorLabel = (Label) cell.getFirstChild();
@ -668,13 +670,17 @@ public class GridTabRowRenderer implements RowRenderer<Object[]>, RowRendererExt
* Enter edit mode * Enter edit mode
*/ */
public void editCurrentRow() { public void editCurrentRow() {
if (ClientInfo.isMobile()) {
if (!MSysConfig.getBooleanValue(MSysConfig.ZK_GRID_MOBILE_EDITABLE, false))
return;
}
if (currentRow != null && currentRow.getParent() != null && currentRow.isVisible() if (currentRow != null && currentRow.getParent() != null && currentRow.isVisible()
&& grid != null && grid.isVisible() && grid.getParent() != null && grid.getParent().isVisible()) { && grid != null && grid.isVisible() && grid.getParent() != null && grid.getParent().isVisible()) {
GridField[] gridPanelFields = gridPanel.getFields(); GridField[] gridPanelFields = gridPanel.getFields();
int columnCount = gridPanelFields.length; int columnCount = gridPanelFields.length;
org.zkoss.zul.Columns columns = grid.getColumns(); org.zkoss.zul.Columns columns = grid.getColumns();
//skip selection and indicator column //skip selection and indicator column
int colIndex = 1; int colIndex = isShowCurrentRowIndicatorColumn() ? 1 : 0;
for (int i = 0; i < columnCount; i++) { for (int i = 0; i < columnCount; i++) {
if ((!isGridViewCustomized && !gridPanelFields[i].isDisplayedGrid()) || gridPanelFields[i].isToolbarOnlyButton()) { if ((!isGridViewCustomized && !gridPanelFields[i].isDisplayedGrid()) || gridPanelFields[i].isToolbarOnlyButton()) {
continue; continue;
@ -921,4 +927,9 @@ public class GridTabRowRenderer implements RowRenderer<Object[]>, RowRendererExt
Events.sendEvent(gridPanel, new Event("onSelectRow", gridPanel, checkBox)); Events.sendEvent(gridPanel, new Event("onSelectRow", gridPanel, checkBox));
} }
} }
private boolean isShowCurrentRowIndicatorColumn() {
return gridPanel != null && gridPanel.isShowCurrentRowIndicatorColumn();
}
} }

View File

@ -75,6 +75,8 @@ import org.zkoss.zul.impl.CustomGridDataLoader;
*/ */
public class GridView extends Vlayout implements EventListener<Event>, IdSpace, IFieldEditorContainer, StateChangeListener public class GridView extends Vlayout implements EventListener<Event>, IdSpace, IFieldEditorContainer, StateChangeListener
{ {
private static final int MIN_COLUMN_MOBILE_WIDTH = 100;
/** /**
* *
*/ */
@ -144,6 +146,8 @@ public class GridView extends Vlayout implements EventListener<Event>, IdSpace,
boolean isHasCustomizeData = false; boolean isHasCustomizeData = false;
private boolean showCurrentRowIndicatorColumn = true;
public GridView() public GridView()
{ {
this(0); this(0);
@ -184,7 +188,7 @@ public class GridView extends Vlayout implements EventListener<Event>, IdSpace,
//default true for better UI experience //default true for better UI experience
if (ClientInfo.isMobile()) if (ClientInfo.isMobile())
modeless = MSysConfig.getBooleanValue(MSysConfig.ZK_GRID_MOBILE_EDIT_MODELESS, false); modeless = MSysConfig.getBooleanValue(MSysConfig.ZK_GRID_MOBILE_EDIT_MODELESS, false) && MSysConfig.getBooleanValue(MSysConfig.ZK_GRID_MOBILE_EDITABLE, false);
else else
modeless = MSysConfig.getBooleanValue(MSysConfig.ZK_GRID_EDIT_MODELESS, true); modeless = MSysConfig.getBooleanValue(MSysConfig.ZK_GRID_EDIT_MODELESS, true);
@ -272,7 +276,7 @@ public class GridView extends Vlayout implements EventListener<Event>, IdSpace,
if (paging != null && paging.getPageSize() != pageSize) { if (paging != null && paging.getPageSize() != pageSize) {
paging.setPageSize(pageSize); paging.setPageSize(pageSize);
updateModel(); updateModel();
if (paging.getPageSize() > 1) { if (paging.getPageCount() > 1) {
showPagingControl(); showPagingControl();
} else { } else {
hidePagingControl(); hidePagingControl();
@ -534,6 +538,7 @@ public class GridView extends Vlayout implements EventListener<Event>, IdSpace,
} }
org.zkoss.zul.Column selection = new Column(); org.zkoss.zul.Column selection = new Column();
selection.setHeight("2em");
ZKUpdateUtil.setWidth(selection, "22px"); ZKUpdateUtil.setWidth(selection, "22px");
try{ try{
selection.setSort("none"); selection.setSort("none");
@ -545,13 +550,21 @@ public class GridView extends Vlayout implements EventListener<Event>, IdSpace,
selectAll.addEventListener(Events.ON_CHECK, this); selectAll.addEventListener(Events.ON_CHECK, this);
columns.appendChild(selection); columns.appendChild(selection);
org.zkoss.zul.Column indicator = new Column(); if (ClientInfo.isMobile())
ZKUpdateUtil.setWidth(indicator, "22px"); showCurrentRowIndicatorColumn = MSysConfig.getBooleanValue(MSysConfig.ZK_GRID_MOBILE_SHOW_CURRENT_ROW_INDICATOR, false);
try {
indicator.setSort("none"); if (showCurrentRowIndicatorColumn)
} catch (Exception e) {} {
indicator.setStyle("border-left: none"); org.zkoss.zul.Column indicator = new Column();
columns.appendChild(indicator); indicator.setHeight("2em");
ZKUpdateUtil.setWidth(indicator, "22px");
try {
indicator.setSort("none");
} catch (Exception e) {}
indicator.setStyle("border-left: none");
columns.appendChild(indicator);
}
listbox.appendChild(columns); listbox.appendChild(columns);
columns.setSizable(true); columns.setSizable(true);
columns.setMenupopup("none"); columns.setMenupopup("none");
@ -568,6 +581,7 @@ public class GridView extends Vlayout implements EventListener<Event>, IdSpace,
colnames.put(index, gridField[i].getHeader()); colnames.put(index, gridField[i].getHeader());
index++; index++;
org.zkoss.zul.Column column = new Column(); org.zkoss.zul.Column column = new Column();
column.setHeight("2em");
int colindex =tableModel.findColumn(gridField[i].getColumnName()); int colindex =tableModel.findColumn(gridField[i].getColumnName());
column.setSortAscending(new SortComparator(colindex, true, Env.getLanguage(Env.getCtx()))); column.setSortAscending(new SortComparator(colindex, true, Env.getLanguage(Env.getCtx())));
column.setSortDescending(new SortComparator(colindex, false, Env.getLanguage(Env.getCtx()))); column.setSortDescending(new SortComparator(colindex, false, Env.getLanguage(Env.getCtx())));
@ -612,7 +626,7 @@ public class GridView extends Vlayout implements EventListener<Event>, IdSpace,
estimatedWidth = headerWidth; estimatedWidth = headerWidth;
//hflex=min for first column not working well //hflex=min for first column not working well
if (i > 0) if (i > 0 && !ClientInfo.isMobile())
{ {
if (DisplayType.isLookup(gridField[i].getDisplayType())) if (DisplayType.isLookup(gridField[i].getDisplayType()))
{ {
@ -633,10 +647,19 @@ public class GridView extends Vlayout implements EventListener<Event>, IdSpace,
//set estimated width if not using hflex=min //set estimated width if not using hflex=min
if (!"min".equals(column.getHflex())) { if (!"min".equals(column.getHflex())) {
if (estimatedWidth > MAX_COLUMN_WIDTH) if (ClientInfo.isMobile() && ClientInfo.get() != null &&
estimatedWidth = MAX_COLUMN_WIDTH; ClientInfo.get().desktopWidth <= ClientInfo.SMALL_WIDTH) {
else if ( estimatedWidth < MIN_COLUMN_WIDTH) int maxWidth = ClientInfo.get().desktopWidth / 5;
estimatedWidth = MIN_COLUMN_WIDTH; if (maxWidth < MIN_COLUMN_MOBILE_WIDTH)
maxWidth = MIN_COLUMN_MOBILE_WIDTH;
if (estimatedWidth > maxWidth)
estimatedWidth = maxWidth;
} else {
if (estimatedWidth > MAX_COLUMN_WIDTH)
estimatedWidth = MAX_COLUMN_WIDTH;
else if ( estimatedWidth < MIN_COLUMN_WIDTH)
estimatedWidth = MIN_COLUMN_WIDTH;
}
ZKUpdateUtil.setWidth(column, Integer.toString(estimatedWidth) + "px"); ZKUpdateUtil.setWidth(column, Integer.toString(estimatedWidth) + "px");
} }
} }
@ -1276,4 +1299,8 @@ public class GridView extends Vlayout implements EventListener<Event>, IdSpace,
editorTraverse(editorTaverseCallback, renderer.getEditors()); editorTraverse(editorTaverseCallback, renderer.getEditors());
} }
public boolean isShowCurrentRowIndicatorColumn() {
return showCurrentRowIndicatorColumn;
}
} }

View File

@ -219,7 +219,7 @@ public class QuickGridView extends Vbox
} }
//default true for better UI experience //default true for better UI experience
if (ClientInfo.isMobile()) if (ClientInfo.isMobile())
modeless = MSysConfig.getBooleanValue(MSysConfig.ZK_GRID_MOBILE_EDIT_MODELESS, false); modeless = MSysConfig.getBooleanValue(MSysConfig.ZK_GRID_MOBILE_EDIT_MODELESS, false) && MSysConfig.getBooleanValue(MSysConfig.ZK_GRID_MOBILE_EDITABLE, false);
else else
modeless = MSysConfig.getBooleanValue(MSysConfig.ZK_GRID_EDIT_MODELESS, true); modeless = MSysConfig.getBooleanValue(MSysConfig.ZK_GRID_EDIT_MODELESS, true);

View File

@ -17,6 +17,7 @@
package org.adempiere.webui.adwindow; package org.adempiere.webui.adwindow;
import org.adempiere.webui.ClientInfo;
import org.adempiere.webui.LayoutUtils; import org.adempiere.webui.LayoutUtils;
import org.adempiere.webui.apps.form.WQuickForm; import org.adempiere.webui.apps.form.WQuickForm;
import org.adempiere.webui.component.DocumentLink; import org.adempiere.webui.component.DocumentLink;
@ -105,6 +106,9 @@ public class StatusBar extends Panel implements EventListener<Event>
appendChild(west); appendChild(west);
appendChild(east); appendChild(east);
if (ClientInfo.isMobile())
ClientInfo.onClientInfo(this, this::onClientInfo);
} }
/** /**
@ -171,11 +175,35 @@ public class StatusBar extends Panel implements EventListener<Event>
String labelText = buildLabelText(m_statusText); String labelText = buildLabelText(m_statusText);
if (error) { if (error) {
Notification.show(buildNotificationText(m_statusText), "error", findTabpanel(this), "top_left", 3500, true); Notification.show(buildNotificationText(m_statusText), "error", findTabpanel(this), "top_left", 3500, true);
} else if (ClientInfo.maxWidth(ClientInfo.SMALL_WIDTH)) {
Notification.show(buildNotificationText(m_statusText), "info", findTabpanel(this), "top_left", 2000, true);
} }
Label label = new Label(labelText);
messageContainer.setSclass(error ? "docstatus-error" : "docstatus-normal"); messageContainer.setSclass(error ? "docstatus-error" : "docstatus-normal");
messageContainer.appendChild(label); if (!ClientInfo.maxWidth(ClientInfo.SMALL_WIDTH))
if (m_logs != null) { {
Label label = new Label(labelText);
messageContainer.appendChild(label);
if (labelText.length() != m_statusText.length() || (div != null && div.getChildren().size() > 0)) {
label.addEventListener(Events.ON_CLICK, this);
label.setStyle("cursor: pointer");
label = new Label(" ...");
label.setStyle("cursor: pointer");
messageContainer.appendChild(label);
label.addEventListener(Events.ON_CLICK, this);
}
messageContainer.appendChild(new Space());
}
else
{
Label label = new Label("...");
label.setStyle("cursor: pointer");
messageContainer.appendChild(label);
label.addEventListener(Events.ON_CLICK, this);
}
if (m_logs != null) {
div = new Div(); div = new Div();
for (int i = 0; i < m_logs.length; i++) { for (int i = 0; i < m_logs.length; i++) {
if (m_logs[i].getP_Msg() != null) { if (m_logs[i].getP_Msg() != null) {
@ -189,24 +217,12 @@ public class StatusBar extends Panel implements EventListener<Event>
} }
} }
} }
if (labelText.length() != m_statusText.length() || (div != null && div.getChildren().size() > 0)) {
label.addEventListener(Events.ON_CLICK, this);
label.setStyle("cursor: pointer");
label = new Label(" ...");
label.setStyle("cursor: pointer");
messageContainer.appendChild(label);
label.addEventListener(Events.ON_CLICK, this);
}
messageContainer.appendChild(new Space());
createPopupContent(); createPopupContent();
if(div!=null) if(div!=null)
{ {
msgPopupCnt.appendChild(div); msgPopupCnt.appendChild(div);
} }
} }
private String buildLabelText(String statusText) { private String buildLabelText(String statusText) {
@ -295,11 +311,14 @@ public class StatusBar extends Panel implements EventListener<Event>
msgPopup.setClosable(true); msgPopup.setClosable(true);
msgPopup.setSizable(true); msgPopup.setSizable(true);
msgPopup.setContentStyle("overflow: auto"); msgPopup.setContentStyle("overflow: auto");
ZKUpdateUtil.setWidth(msgPopup, "500px"); ZKUpdateUtil.setWindowWidthX(msgPopup, 500);
msgPopup.appendChild(msgPopupCnt); msgPopup.appendChild(msgPopupCnt);
msgPopup.setShadow(true); msgPopup.setShadow(true);
msgPopupCaption = new Caption(); msgPopupCaption = new Caption();
msgPopup.appendChild(msgPopupCaption); msgPopup.appendChild(msgPopupCaption);
} }
} protected void onClientInfo() {
ZKUpdateUtil.setWindowWidthX(msgPopup, 500);
}
}

View File

@ -170,7 +170,7 @@ public class GlobalSearch extends Div implements EventListener<Event> {
} else if (event.getName().equals(ON_CREATE_ECHO)) { } else if (event.getName().equals(ON_CREATE_ECHO)) {
StringBuilder script = new StringBuilder("jq('#") StringBuilder script = new StringBuilder("jq('#")
.append(bandbox.getUuid()) .append(bandbox.getUuid())
.append("').bind('keydown', function(e) {var code=e.keyCode||e.which;console.log(code);if(code==13){") .append("').bind('keydown', function(e) {var code=e.keyCode||e.which;if(code==13){")
.append("var widget=zk.Widget.$(this);") .append("var widget=zk.Widget.$(this);")
.append("var event=new zk.Event(widget,'") .append("var event=new zk.Event(widget,'")
.append(ON_ENTER_KEY) .append(ON_ENTER_KEY)

View File

@ -40,6 +40,8 @@ import org.zkoss.zul.Messagebox;
**/ **/
public final class ConfirmPanel extends Div public final class ConfirmPanel extends Div
{ {
private static final String SMALL_SCREEN_BUTTON_CLASS = "btn-small small-img-btn";
/** /**
* *
*/ */
@ -243,6 +245,8 @@ public final class ConfirmPanel extends Div
private String extraButtonSClass; private String extraButtonSClass;
private boolean useSmallButtonClassForSmallScreen;
/** /**
* initialise components * initialise components
*/ */
@ -301,6 +305,8 @@ public final class ConfirmPanel extends Div
if (!buttonMap.containsKey(button.getId())) if (!buttonMap.containsKey(button.getId()))
buttonMap.put(button.getId(), button); buttonMap.put(button.getId(), button);
pnlBtnLeft.appendChild(button); pnlBtnLeft.appendChild(button);
if (useSmallButtonClassForSmallScreen)
LayoutUtils.addSclass(SMALL_SCREEN_BUTTON_CLASS, button);
} }
/** /**
@ -312,6 +318,8 @@ public final class ConfirmPanel extends Div
if (!buttonMap.containsKey(button.getId())) if (!buttonMap.containsKey(button.getId()))
buttonMap.put(button.getId(), button); buttonMap.put(button.getId(), button);
pnlBtnRight.appendChild(button); pnlBtnRight.appendChild(button);
if (useSmallButtonClassForSmallScreen)
LayoutUtils.addSclass(SMALL_SCREEN_BUTTON_CLASS, button);
} }
/** /**
@ -324,6 +332,8 @@ public final class ConfirmPanel extends Div
if (!buttonMap.containsKey(button.getId())) if (!buttonMap.containsKey(button.getId()))
buttonMap.put(button.getId(), button); buttonMap.put(button.getId(), button);
pnlBtnCenter.appendChild(button); pnlBtnCenter.appendChild(button);
if (useSmallButtonClassForSmallScreen)
LayoutUtils.addSclass(SMALL_SCREEN_BUTTON_CLASS, button);
} }
/** /**
@ -561,4 +571,9 @@ public final class ConfirmPanel extends Div
LayoutUtils.removeSclass(cls, btn); LayoutUtils.removeSclass(cls, btn);
} }
} }
public void useSmallButtonClassForSmallScreen() {
useSmallButtonClassForSmallScreen = true;
addButtonSclass(SMALL_SCREEN_BUTTON_CLASS);
}
} // ConfirmPanel } // ConfirmPanel

View File

@ -332,7 +332,7 @@ public class DefaultDesktop extends TabbedDesktop implements MenuListener, Seria
btn.setIconSclass("z-icon-remove"); btn.setIconSclass("z-icon-remove");
btn.addEventListener(Events.ON_CLICK, evt -> eastPopup.close()); btn.addEventListener(Events.ON_CLICK, evt -> eastPopup.close());
eastPopup.appendChild(btn); eastPopup.appendChild(btn);
btn.setStyle("position: absolute; top: 4px; right: 4px; padding: 2px 6px;"); btn.setStyle("position: absolute; top: 20px; right: 0px; padding: 2px 0px;");
eastPopup.setStyle("padding-top: 20px;"); eastPopup.setStyle("padding-top: 20px;");
eastPopup.appendChild(content); eastPopup.appendChild(content);
eastPopup.setPage(getComponent().getPage()); eastPopup.setPage(getComponent().getPage());
@ -577,7 +577,7 @@ public class DefaultDesktop extends TabbedDesktop implements MenuListener, Seria
westPopup.removeAttribute(POPUP_OPEN_ATTR); westPopup.removeAttribute(POPUP_OPEN_ATTR);
}); });
westPopup.appendChild(btn); westPopup.appendChild(btn);
btn.setStyle("position: absolute; top: 4px; right: 4px; padding: 2px 6px;"); btn.setStyle("position: absolute; top: 10px; right: 0px; padding: 2px 0px;");
} }
logo = pnlHead.getLogo(); logo = pnlHead.getLogo();
if (mobile && logo != null) if (mobile && logo != null)

View File

@ -51,12 +51,14 @@ import org.compiere.model.MColumn;
import org.compiere.model.MLookup; import org.compiere.model.MLookup;
import org.compiere.model.MLookupFactory; import org.compiere.model.MLookupFactory;
import org.compiere.model.MRole; import org.compiere.model.MRole;
import org.compiere.model.MSysConfig;
import org.compiere.model.MTable; import org.compiere.model.MTable;
import org.compiere.model.X_AD_CtxHelp; import org.compiere.model.X_AD_CtxHelp;
import org.compiere.util.CLogger; import org.compiere.util.CLogger;
import org.compiere.util.DisplayType; import org.compiere.util.DisplayType;
import org.compiere.util.Env; import org.compiere.util.Env;
import org.compiere.util.NamePair; import org.compiere.util.NamePair;
import org.compiere.util.Util;
import org.zkoss.zk.au.out.AuScript; import org.zkoss.zk.au.out.AuScript;
import org.zkoss.zk.ui.Component; import org.zkoss.zk.ui.Component;
import org.zkoss.zk.ui.Executions; import org.zkoss.zk.ui.Executions;
@ -839,7 +841,18 @@ public class WSearchEditor extends WEditor implements ContextMenuListener, Value
super.dynamicDisplay(ctx); super.dynamicDisplay(ctx);
} }
@Override
public String getDisplayTextForGridView(Object value) {
String s = super.getDisplayTextForGridView(value);
if (ClientInfo.isMobile() && MSysConfig.getBooleanValue(MSysConfig.ZK_GRID_MOBILE_LINE_BREAK_AS_IDENTIFIER_SEPARATOR, true)) {
String separator = MSysConfig.getValue(MSysConfig.IDENTIFIER_SEPARATOR, null, Env.getAD_Client_ID(Env.getCtx()));
if (!Util.isEmpty(separator, true) && s.indexOf(separator) >= 0) {
s = s.replace(separator, "\n");
}
}
return s;
}
static class CustomSearchBox extends ComboEditorBox { static class CustomSearchBox extends ComboEditorBox {
/** /**

View File

@ -25,6 +25,7 @@ import java.util.Properties;
import javax.swing.event.ListDataEvent; import javax.swing.event.ListDataEvent;
import javax.swing.event.ListDataListener; import javax.swing.event.ListDataListener;
import org.adempiere.webui.ClientInfo;
import org.adempiere.webui.ValuePreference; import org.adempiere.webui.ValuePreference;
import org.adempiere.webui.apps.AEnv; import org.adempiere.webui.apps.AEnv;
import org.adempiere.webui.component.AutoComplete; import org.adempiere.webui.component.AutoComplete;
@ -47,6 +48,7 @@ import org.compiere.model.MLocation;
import org.compiere.model.MLocator; import org.compiere.model.MLocator;
import org.compiere.model.MLookup; import org.compiere.model.MLookup;
import org.compiere.model.MRole; import org.compiere.model.MRole;
import org.compiere.model.MSysConfig;
import org.compiere.model.MTable; import org.compiere.model.MTable;
import org.compiere.util.CCache; import org.compiere.util.CCache;
import org.compiere.util.CLogger; import org.compiere.util.CLogger;
@ -789,7 +791,19 @@ ContextMenuListener, IZoomableEditor
public void setEditor(WTableDirEditor editor); public void setEditor(WTableDirEditor editor);
public void cleanup(); public void cleanup();
} }
@Override
public String getDisplayTextForGridView(Object value) {
String s = super.getDisplayTextForGridView(value);
if (ClientInfo.isMobile( )&& MSysConfig.getBooleanValue(MSysConfig.ZK_GRID_MOBILE_LINE_BREAK_AS_IDENTIFIER_SEPARATOR, true)) {
String separator = MSysConfig.getValue(MSysConfig.IDENTIFIER_SEPARATOR, null, Env.getAD_Client_ID(Env.getCtx()));
if (!Util.isEmpty(separator, true) && s.indexOf(separator) >= 0) {
s = s.replace(separator, "\n");
}
}
return s;
}
private static class EditorCombobox extends Combobox implements ITableDirEditor { private static class EditorCombobox extends Combobox implements ITableDirEditor {
/** /**
* generated serial id * generated serial id
@ -913,6 +927,8 @@ ContextMenuListener, IZoomableEditor
refresh(""); refresh("");
} }
} }
} }
private static class CCacheListener extends CCache<String, Object> { private static class CCacheListener extends CCache<String, Object> {

View File

@ -41,7 +41,6 @@ import org.compiere.util.Util;
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.event.SwipeEvent;
import org.zkoss.zul.Center; import org.zkoss.zul.Center;
import org.zkoss.zul.South; import org.zkoss.zul.South;
@ -327,15 +326,6 @@ public class InfoProductWindow extends InfoWindow {
south.setSplittable(true); south.setSplittable(true);
south.setTitle(Msg.translate(Env.getCtx(), "WarehouseStock")); south.setTitle(Msg.translate(Env.getCtx(), "WarehouseStock"));
south.setTooltiptext(Msg.translate(Env.getCtx(), "WarehouseStock")); south.setTooltiptext(Msg.translate(Env.getCtx(), "WarehouseStock"));
south.addEventListener(Events.ON_SWIPE, new EventListener<SwipeEvent>() {
@Override
public void onEvent(SwipeEvent event) throws Exception {
South south = (South) event.getTarget();
if ("down".equals(event.getSwipeDirection())) {
south.setOpen(false);
}
}
});
south.setSclass("south-collapsible-with-title"); south.setSclass("south-collapsible-with-title");
if (ClientInfo.maxHeight(ClientInfo.MEDIUM_HEIGHT-1)) if (ClientInfo.maxHeight(ClientInfo.MEDIUM_HEIGHT-1))
{ {

View File

@ -97,7 +97,6 @@ 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.event.SelectEvent; import org.zkoss.zk.ui.event.SelectEvent;
import org.zkoss.zk.ui.event.SwipeEvent;
import org.zkoss.zk.ui.util.Clients; import org.zkoss.zk.ui.util.Clients;
import org.zkoss.zul.Center; import org.zkoss.zul.Center;
import org.zkoss.zul.Checkbox; import org.zkoss.zul.Checkbox;
@ -1355,16 +1354,6 @@ public class InfoWindow extends InfoPanel implements ValueChangeListener, EventL
south.setSplittable(true); south.setSplittable(true);
south.setTitle(Msg.translate(Env.getCtx(), "Related Information")); south.setTitle(Msg.translate(Env.getCtx(), "Related Information"));
south.setTooltiptext(Msg.translate(Env.getCtx(), "Related Information")); south.setTooltiptext(Msg.translate(Env.getCtx(), "Related Information"));
south.addEventListener(Events.ON_SWIPE, new EventListener<SwipeEvent>() {
@Override
public void onEvent(SwipeEvent event) throws Exception {
South south = (South) event.getTarget();
if ("down".equals(event.getSwipeDirection())) {
south.setOpen(false);
}
}
});
south.setSclass("south-collapsible-with-title"); south.setSclass("south-collapsible-with-title");
south.setAutoscroll(true); south.setAutoscroll(true);
//south.sets //south.sets

View File

@ -364,7 +364,7 @@ public abstract class InfoPanel extends Window implements EventListener<Event>,
{ {
if (ClientInfo.maxWidth(ClientInfo.SMALL_WIDTH) || ClientInfo.maxHeight(ClientInfo.SMALL_HEIGHT)) if (ClientInfo.maxWidth(ClientInfo.SMALL_WIDTH) || ClientInfo.maxHeight(ClientInfo.SMALL_HEIGHT))
{ {
confirmPanel.addButtonSclass("btn-small small-img-btn"); confirmPanel.useSmallButtonClassForSmallScreen();
} }
} }

View File

@ -112,7 +112,6 @@ public class WindowContainer extends AbstractUIPart implements EventListener<Eve
if (isMobile()) { if (isMobile()) {
updateMobileTabState(tabbox.getSelectedTab()); updateMobileTabState(tabbox.getSelectedTab());
updateTabListButton(); updateTabListButton();
tabbox.getTabs().invalidate();
} }
}); });
@ -531,8 +530,6 @@ public class WindowContainer extends AbstractUIPart implements EventListener<Eve
if (isMobile()) if (isMobile())
updateMobileTabState(tab); updateMobileTabState(tab);
tabbox.setSelectedTab(tab); tabbox.setSelectedTab(tab);
if (isMobile())
tabbox.getTabs().invalidate();
} }
private void updateMobileTabState(org.zkoss.zul.Tab tab) { private void updateMobileTabState(org.zkoss.zul.Tab tab) {

View File

@ -1,8 +1,11 @@
package org.adempiere.webui.window; package org.adempiere.webui.window;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map; import java.util.Map;
import org.adempiere.webui.adwindow.ADTabpanel;
import org.adempiere.webui.adwindow.GridView; import org.adempiere.webui.adwindow.GridView;
import org.adempiere.webui.adwindow.QuickGridView; import org.adempiere.webui.adwindow.QuickGridView;
import org.adempiere.webui.apps.AEnv; import org.adempiere.webui.apps.AEnv;
@ -11,8 +14,12 @@ import org.adempiere.webui.panel.CustomizeGridViewPanel;
import org.adempiere.webui.theme.ThemeManager; import org.adempiere.webui.theme.ThemeManager;
import org.adempiere.webui.util.ZKUpdateUtil; import org.adempiere.webui.util.ZKUpdateUtil;
import org.adempiere.webui.panel.QuickCustomizeGridViewPanel; import org.adempiere.webui.panel.QuickCustomizeGridViewPanel;
import org.compiere.model.GridField;
import org.compiere.util.Env; import org.compiere.util.Env;
import org.compiere.util.Msg; import org.compiere.util.Msg;
import org.zkoss.zk.ui.Component;
import org.zkoss.zul.Column;
import org.zkoss.zul.Columns;
public class CustomizeGridViewDialog extends Window { public class CustomizeGridViewDialog extends Window {
@ -52,30 +59,29 @@ public class CustomizeGridViewDialog extends Window {
customizePanel = new CustomizeGridViewPanel(windowNo, AD_Tab_ID, AD_User_ID, columnsWidth, gridFieldIds); customizePanel = new CustomizeGridViewPanel(windowNo, AD_Tab_ID, AD_User_ID, columnsWidth, gridFieldIds);
} }
this.setStyle("position : relative;"); this.setStyle("position : relative;");
if (!ThemeManager.isUseCSSForWindowSize()) {
ZKUpdateUtil.setWindowWidthX(this, 600);
ZKUpdateUtil.setWindowHeightX(this, 500);
} else {
addCallback(AFTER_PAGE_ATTACHED, t-> {
ZKUpdateUtil.setCSSHeight(this);
ZKUpdateUtil.setCSSWidth(this);
});
}
this.setBorder("normal"); this.setBorder("normal");
this.setSclass("popup-dialog customize-grid-view-dialog"); this.setSclass("popup-dialog customize-grid-view-dialog");
if (isQuickForm) if (isQuickForm)
{ {
ZKUpdateUtil.setWidth(this, "500px"); ZKUpdateUtil.setWindowWidthX(this, 500);
ZKUpdateUtil.setHeight(this, "410px"); ZKUpdateUtil.setWindowHeightX(this, 410);
quickCustomizePanel.createUI(); quickCustomizePanel.createUI();
quickCustomizePanel.loadData(); quickCustomizePanel.loadData();
appendChild(quickCustomizePanel); appendChild(quickCustomizePanel);
} }
else else
{ {
ZKUpdateUtil.setWidth(this, "600px"); if (!ThemeManager.isUseCSSForWindowSize()) {
ZKUpdateUtil.setHeight(this, "500px"); ZKUpdateUtil.setWindowWidthX(this, 600);
ZKUpdateUtil.setWindowHeightX(this, 500);
} else {
addCallback(AFTER_PAGE_ATTACHED, t-> {
ZKUpdateUtil.setCSSHeight(this);
ZKUpdateUtil.setCSSWidth(this);
});
}
appendChild(customizePanel); appendChild(customizePanel);
customizePanel.createUI(); customizePanel.createUI();
@ -97,6 +103,31 @@ public class CustomizeGridViewDialog extends Window {
customizePanel.setGridPanel(gridPanel); customizePanel.setGridPanel(gridPanel);
} }
/**
* show grid view customization dialog for tabPanel
* @param tabPanel
* @return true if saved is ok
*/
public static boolean onCustomize(ADTabpanel tabPanel) {
Columns columns = tabPanel.getGridView().getListbox().getColumns();
List<Component> columnList = columns.getChildren();
GridField[] fields = tabPanel.getGridView().getFields();
Map<Integer, String> columnsWidth = new HashMap<Integer, String>();
ArrayList<Integer> gridFieldIds = new ArrayList<Integer>();
for (int i = 0; i < fields.length; i++) {
// 2 is offset of num of column in grid view and actual data fields.
// in grid view, add two function column, indicator column and selection (checkbox) column
// @see GridView#setupColumns
int offset = tabPanel.getGridView().isShowCurrentRowIndicatorColumn() ? 2 : 1;
Column column = (Column) columnList.get(i+offset);
String width = column.getWidth();
columnsWidth.put(fields[i].getAD_Field_ID(), width);
gridFieldIds.add(fields[i].getAD_Field_ID());
}
return showCustomize(0, tabPanel.getGridTab().getAD_Tab_ID(), columnsWidth,gridFieldIds,tabPanel.getGridView(), null, false);
}
/** /**
* Show User customize (modal) * Show User customize (modal)
* @param WindowNo window no * @param WindowNo window no

View File

@ -27,6 +27,7 @@ import java.util.Vector;
import java.util.logging.Level; import java.util.logging.Level;
import org.adempiere.webui.AdempiereWebUI; import org.adempiere.webui.AdempiereWebUI;
import org.adempiere.webui.ClientInfo;
import org.adempiere.webui.apps.AEnv; import org.adempiere.webui.apps.AEnv;
import org.adempiere.webui.component.ConfirmPanel; import org.adempiere.webui.component.ConfirmPanel;
import org.adempiere.webui.component.Listbox; import org.adempiere.webui.component.Listbox;
@ -221,6 +222,12 @@ public class WRecordInfo extends Window implements EventListener<Event>
} }
} }
}); });
if (ClientInfo.isMobile())
{
group.setSelectedIndex(1);
Events.sendEvent(Events.ON_CHECK, group, null);
}
} }
else else
{ {

View File

@ -79,22 +79,22 @@
<library-property> <library-property>
<name>org.zkoss.zul.theme.fontSizeM <name>org.zkoss.zul.theme.fontSizeM
</name> </name>
<value>11px</value> <value>14px</value>
</library-property> </library-property>
<library-property> <library-property>
<name>org.zkoss.zul.theme.fontSizeS <name>org.zkoss.zul.theme.fontSizeS
</name> </name>
<value>10px</value> <value>12px</value>
</library-property> </library-property>
<library-property> <library-property>
<name>org.zkoss.zul.theme.fontSizeXS <name>org.zkoss.zul.theme.fontSizeXS
</name> </name>
<value>9px</value> <value>10px</value>
</library-property> </library-property>
<library-property> <library-property>
<name>org.zkoss.zul.theme.fontSizeMS <name>org.zkoss.zul.theme.fontSizeMS
</name> </name>
<value>11px</value> <value>12px</value>
</library-property> </library-property>
<!-- turn off borderlayout animation --> <!-- turn off borderlayout animation -->
<library-property> <library-property>

View File

@ -3,7 +3,6 @@
<%-- breadcrumb --%> <%-- breadcrumb --%>
.breadcrumb-toolbar-button { .breadcrumb-toolbar-button {
background-color: transparent; background-color: transparent;
height: 22px;
} }
.breadcrumb-toolbar-button img { .breadcrumb-toolbar-button img {
width: 22px; width: 22px;
@ -60,6 +59,7 @@
display: inline-block; display: inline-block;
position: absolute; position: absolute;
right: 4px; right: 4px;
max-width: 90%;
} }
.docstatus-normal .z-label { .docstatus-normal .z-label {
@ -89,12 +89,35 @@
} }
.adwindow-breadcrumb { .adwindow-breadcrumb {
height: 30px; min-height: 30px;
background-color: #FFF; background-color: #FFF;
padding: 0px; padding: 0px;
padding-left: 5px; padding-left: 5px;
border-bottom: 1px solid #C5C5C5 !important; border-bottom: 1px solid #C5C5C5 !important;
clear: both; display: flex;
align-items: center;
flex-wrap: wrap;
justify-content: space-between
}
.adwindow-breadcrumb-paths {
display: inline-block;
padding: 4px 0px;
}
.adwindow-breadcrumb-toolbar {
display: inline-block;
text-align: right;
}
.adwindow-breadcrumb-toolbar .z-toolbar {
background-image: none;
background-color: transparent;
border: none;
}
.adwindow-breadcrumb .breadcrumb-record-info.link {
padding-top: 4px;
padding-bottom: 0px;
}
.adwindow-breadcrumb .z-toolbarbutton-content {
line-height: inherit;
} }
.adwindow-detailpane { .adwindow-detailpane {
@ -302,6 +325,9 @@
.activity-card .help-content { .activity-card .help-content {
font-size: 13px; font-size: 13px;
} }
.mobile .activity-card .help-content {
font-size: 16px;
}
.record-info-dialog .record-info-radiogroup { .record-info-dialog .record-info-radiogroup {
padding: 4px 4px 8px 4px; padding: 4px 4px 8px 4px;
} }
@ -309,3 +335,15 @@
margin-left: 3px; margin-left: 3px;
margin-right: 3px; margin-right: 3px;
} }
@media only screen
and (max-device-width: 700px) {
.adtab-grid > .z-cell > .z-label {
white-space: pre-line;
}
}
.adtab-grid > .z-grid-header > table > tbody > tr.z-columns > th.z-column > .z-column-content {
white-space: pre-wrap;
text-overflow: ellipsis;
}

View File

@ -113,7 +113,10 @@
.global-search-tabpanel { .global-search-tabpanel {
width: 600px; width: 600px;
} }
@media screen and (max-width: 599px) { @media screen and (max-width: 649px) {
.global-search-box.z-bandbox-popup {
width: 90% !important;
}
.global-search-tabpanel { .global-search-tabpanel {
width: 100%; width: 100%;
} }

View File

@ -255,7 +255,8 @@
.window-container-toolbar-btn.z-toolbarbutton .z-toolbarbutton-content [class^="z-icon"] { .window-container-toolbar-btn.z-toolbarbutton .z-toolbarbutton-content [class^="z-icon"] {
display:inline-flex; display:inline-flex;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
border-bottom: 0px;
} }
.user-panel-popup .z-popup-content { .user-panel-popup .z-popup-content {

View File

@ -215,9 +215,13 @@
.help-content .help-content
{ {
padding: 2px; padding: 2px;
font-size: 11px; font-size: 12px;
font-weight: normal; font-weight: normal;
} }
.mobile .help-content
{
font-size: 14px;
}
.fav-new-btn.z-toolbarbutton [class^="z-icon-"] { .fav-new-btn.z-toolbarbutton [class^="z-icon-"] {
font-size: smaller; font-size: smaller;

View File

@ -58,7 +58,12 @@ div.z-column-cnt, div.z-grid-header div.z-auxheader-cnt {
display: inline-block; display: inline-block;
width: 100%; width: 100%;
} }
@media only screen
and (max-device-width: 700px) {
.z-listcell > div.z-listcell-content {
white-space: pre-line;
}
}
.z-column-content, .z-listheader-content, .z-listcell-content { .z-column-content, .z-listheader-content, .z-listcell-content {
padding: 2px 3px 1px; padding: 2px 3px 1px;
} }

View File

@ -32,3 +32,8 @@
.info-panel.z-window .z-borderlayout > div > .z-north { .info-panel.z-window .z-borderlayout > div > .z-north {
max-height: 50%; max-height: 50%;
} }
.info-panel .z-listheader > .z-listheader-content {
white-space: pre-line;
text-overflow: ellipsis;
}

View File

@ -45,6 +45,7 @@ when detect side effect, fix to only apply for parameter window*/
max-height: 300pt; max-height: 300pt;
overflow: hidden; overflow: hidden;
margin: 10px; margin: 10px;
line-height: normal;
} }
.option-input-parameter{ .option-input-parameter{

View File

@ -14,3 +14,17 @@
.z-tab-button :hover { .z-tab-button :hover {
color: blue; color: blue;
} }
.z-tabbox-icon.z-tabbox-left-scroll, .z-tabbox-icon.z-tabbox-right-scroll {
padding: 0px;
border-radius: 0px;
background-color: transparent;
background: none;
}
.z-tabbox-icon.z-tabbox-left-scroll .z-icon-chevron-left, .z-tabbox-icon.z-tabbox-right-scroll .z-icon-chevron-right {
opacity: 1;
}
.z-tab-button > .z-icon-times.z-tab-icon {
margin-top: -9px;
}

View File

@ -1,5 +1,6 @@
.z-toolbar.z-toolbar-tabs { .z-toolbar.z-toolbar-tabs {
padding-top: 0px; padding-top: 0px;
padding-bottom: 0px;
} }
.toolbar { .toolbar {
@ -44,7 +45,6 @@
} }
.z-toolbarbutton [class^="z-icon-"] { .z-toolbarbutton [class^="z-icon-"] {
font-size: larger;
color: inherit; color: inherit;
} }
.z-toolbarbutton.toolbarbutton-with-text [class^="z-icon-"] { .z-toolbarbutton.toolbarbutton-with-text [class^="z-icon-"] {
@ -99,7 +99,6 @@
margin-right: 10px; margin-right: 10px;
margin-left: 10px; margin-left: 10px;
border: 1px; border: 1px;
padding: 1px;
} }
@media screen and (max-width: 768px) { @media screen and (max-width: 768px) {
.toolbar-searchbox { .toolbar-searchbox {

View File

@ -17,10 +17,17 @@ html,body {
margin:0px; margin:0px;
} }
<%-- Tablet --%> [class*="z-"]:not([class*="z-icon-"]) {
font-size: 14px;
}
<%-- Mobile/Tablet --%>
.tablet-scrolling { .tablet-scrolling {
-webkit-overflow-scrolling: touch; -webkit-overflow-scrolling: touch;
} }
.mobile [class*="z-"]:not([class*="z-icon-"]) {
font-size: 16px;
}
<%-- vbox fix for firefox and ie --%> <%-- vbox fix for firefox and ie --%>
table.z-vbox > tbody > tr > td > table { table.z-vbox > tbody > tr > td > table {