diff --git a/migration/i6.2/oracle/201904251644_IDEMPIERE-3956.sql b/migration/i6.2/oracle/201904251644_IDEMPIERE-3956.sql new file mode 100644 index 0000000000..baad83e6d5 --- /dev/null +++ b/migration/i6.2/oracle/201904251644_IDEMPIERE-3956.sql @@ -0,0 +1,15 @@ +SET SQLBLANKLINES ON +SET DEFINE OFF + +-- IDEMPIERE-3956 Add Close Windows to the Left/Right - expanding IDEMPIERE-2335 +-- Apr 25, 2019, 4:43:29 PM CEST +INSERT INTO AD_Message (MsgType,MsgText,AD_Client_ID,AD_Org_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy,AD_Message_ID,Value,EntityType,AD_Message_UU) VALUES ('I','Close Windows to the Right',0,0,'Y',TO_DATE('2019-04-25 16:43:29','YYYY-MM-DD HH24:MI:SS'),100,TO_DATE('2019-04-25 16:43:29','YYYY-MM-DD HH24:MI:SS'),100,200510,'CloseWindowsToTheRight','D','b90cf739-eb4d-41eb-a8cb-7c1960e7af2a') +; + +-- Apr 25, 2019, 4:44:18 PM CEST +INSERT INTO AD_Message (MsgType,MsgText,AD_Client_ID,AD_Org_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy,AD_Message_ID,Value,EntityType,AD_Message_UU) VALUES ('I','Close Windows to the Left',0,0,'Y',TO_DATE('2019-04-25 16:44:17','YYYY-MM-DD HH24:MI:SS'),100,TO_DATE('2019-04-25 16:44:17','YYYY-MM-DD HH24:MI:SS'),100,200511,'CloseWindowsToTheLeft','D','c150a69a-ae19-4403-8d03-0040e7714ef9') +; + +SELECT register_migration_script('201904251644_IDEMPIERE-3956.sql') FROM dual +; + diff --git a/migration/i6.2/oracle/201904271403_IDEMPIERE-3957.sql b/migration/i6.2/oracle/201904271403_IDEMPIERE-3957.sql new file mode 100644 index 0000000000..148696b5ab --- /dev/null +++ b/migration/i6.2/oracle/201904271403_IDEMPIERE-3957.sql @@ -0,0 +1,11 @@ +SET SQLBLANKLINES ON +SET DEFINE OFF + +-- CPH::ERP Comments: +-- 26. apr. 2019 20.56.39 CEST +INSERT INTO AD_Message (MsgType,MsgText,AD_Client_ID,AD_Org_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy,AD_Message_ID,Value,EntityType,AD_Message_UU) VALUES ('E','No query columns found',0,0,'Y',TO_DATE('2019-04-26 20:56:38','YYYY-MM-DD HH24:MI:SS'),100,TO_DATE('2019-04-26 20:56:38','YYYY-MM-DD HH24:MI:SS'),100,200512,'NoQueryColumnsFound','C','6c8ad45a-43a1-4386-96e1-b3958844fd4a') +; + +SELECT register_migration_script('201904271403_IDEMPIERE-3957.sql') FROM dual +; + diff --git a/migration/i6.2/postgresql/201904251644_IDEMPIERE-3956.sql b/migration/i6.2/postgresql/201904251644_IDEMPIERE-3956.sql new file mode 100644 index 0000000000..fae7611d01 --- /dev/null +++ b/migration/i6.2/postgresql/201904251644_IDEMPIERE-3956.sql @@ -0,0 +1,12 @@ +-- IDEMPIERE-3956 Add Close Windows to the Left/Right - expanding IDEMPIERE-2335 +-- Apr 25, 2019, 4:43:29 PM CEST +INSERT INTO AD_Message (MsgType,MsgText,AD_Client_ID,AD_Org_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy,AD_Message_ID,Value,EntityType,AD_Message_UU) VALUES ('I','Close Windows to the Right',0,0,'Y',TO_TIMESTAMP('2019-04-25 16:43:29','YYYY-MM-DD HH24:MI:SS'),100,TO_TIMESTAMP('2019-04-25 16:43:29','YYYY-MM-DD HH24:MI:SS'),100,200510,'CloseWindowsToTheRight','D','b90cf739-eb4d-41eb-a8cb-7c1960e7af2a') +; + +-- Apr 25, 2019, 4:44:18 PM CEST +INSERT INTO AD_Message (MsgType,MsgText,AD_Client_ID,AD_Org_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy,AD_Message_ID,Value,EntityType,AD_Message_UU) VALUES ('I','Close Windows to the Left',0,0,'Y',TO_TIMESTAMP('2019-04-25 16:44:17','YYYY-MM-DD HH24:MI:SS'),100,TO_TIMESTAMP('2019-04-25 16:44:17','YYYY-MM-DD HH24:MI:SS'),100,200511,'CloseWindowsToTheLeft','D','c150a69a-ae19-4403-8d03-0040e7714ef9') +; + +SELECT register_migration_script('201904251644_IDEMPIERE-3956.sql') FROM dual +; + diff --git a/migration/i6.2/postgresql/201904271403_IDEMPIERE-3957.sql b/migration/i6.2/postgresql/201904271403_IDEMPIERE-3957.sql new file mode 100644 index 0000000000..a3108c2bb3 --- /dev/null +++ b/migration/i6.2/postgresql/201904271403_IDEMPIERE-3957.sql @@ -0,0 +1,8 @@ +-- CPH::ERP Comments: +-- 26. apr. 2019 20.56.39 CEST +INSERT INTO AD_Message (MsgType,MsgText,AD_Client_ID,AD_Org_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy,AD_Message_ID,Value,EntityType,AD_Message_UU) VALUES ('E','No query columns found',0,0,'Y',TO_TIMESTAMP('2019-04-26 20:56:38','YYYY-MM-DD HH24:MI:SS'),100,TO_TIMESTAMP('2019-04-26 20:56:38','YYYY-MM-DD HH24:MI:SS'),100,200512,'NoQueryColumnsFound','C','6c8ad45a-43a1-4386-96e1-b3958844fd4a') +; + +SELECT register_migration_script('201904271403_IDEMPIERE-3957.sql') FROM dual +; + diff --git a/org.adempiere.server-feature/utils.unix/unix/DebianInstaller/DEBIAN/control b/org.adempiere.server-feature/utils.unix/unix/DebianInstaller/DEBIAN/control index 0bd86537eb..2f3b589870 100644 --- a/org.adempiere.server-feature/utils.unix/unix/DebianInstaller/DEBIAN/control +++ b/org.adempiere.server-feature/utils.unix/unix/DebianInstaller/DEBIAN/control @@ -3,7 +3,7 @@ Version: 6.2 Section: web Priority: extra Architecture: all -Pre-Depends: openjdk-11-jdk|openjdk-12-jdk, postgresql-11|postgresql-10|postgresql-9.6, postgresql-contrib, adduser +Pre-Depends: openjdk-11-jdk|openjdk-12-jdk, postgresql-11|postgresql-10|postgresql-contrib-9.6, adduser Suggests: firefox Installed-Size: 968668 Maintainer: Carlos Ruiz diff --git a/org.adempiere.server-feature/utils.unix/unix/DebianInstaller/etc/init.d/idempiere b/org.adempiere.server-feature/utils.unix/unix/DebianInstaller/etc/init.d/idempiere index 356ca5418e..d159e7dd8f 100755 --- a/org.adempiere.server-feature/utils.unix/unix/DebianInstaller/etc/init.d/idempiere +++ b/org.adempiere.server-feature/utils.unix/unix/DebianInstaller/etc/init.d/idempiere @@ -550,7 +550,7 @@ configure() configure_perform CONFIGURE_RUN=true write_sysconfig - echo To access the iDempiere Server Home Page, start the server with '/etc/init.d/idempiere start' + echo To access the iDempiere Server Home Page, start the server with 'systemctl start idempiere' echo and then go to \"http://127.0.0.1:${ADEMPIERE_WEB_PORT}\" } diff --git a/org.adempiere.server/WEB-INF/web.xml b/org.adempiere.server/WEB-INF/web.xml index 5ced24fb3b..4e0ea919e4 100644 --- a/org.adempiere.server/WEB-INF/web.xml +++ b/org.adempiere.server/WEB-INF/web.xml @@ -54,6 +54,14 @@ org.adempiere.web.server.ServerApplication --> + + default + org.eclipse.jetty.servlet.DefaultServlet + + dirAllowed + false + + JnlpDownloadServlet *.jnlp diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/info/InfoWindow.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/info/InfoWindow.java index 585a5b753c..7a7805f90f 100644 --- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/info/InfoWindow.java +++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/info/InfoWindow.java @@ -1633,10 +1633,7 @@ public class InfoWindow extends InfoPanel implements ValueChangeListener, EventL dataSql = dataSql + " " + otherClause; } - if (indexOrderColumn > -1) - dataSql = dataSql + getUserOrderClause(); - else - dataSql = dataSql + m_sqlOrder; + dataSql = dataSql + getUserOrderClause(); if (end > start && isUseDatabasePaging() && DB.getDatabase().isPagingSupported()) { diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/panel/InfoGeneralPanel.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/panel/InfoGeneralPanel.java index 6bfe7fcbde..60280942b4 100644 --- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/panel/InfoGeneralPanel.java +++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/panel/InfoGeneralPanel.java @@ -415,7 +415,7 @@ public class InfoGeneralPanel extends InfoPanel implements EventListener // Miminum check if (m_queryColumns.size() == 0) { - FDialog.error(p_WindowNo, this, "Error", "No query columns found"); + FDialog.error(p_WindowNo, this, "Error", Msg.getMsg(Env.getCtx(),"NoQueryColumnsFound")); log.log(Level.SEVERE, "No query columns found"); return false; } diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/panel/InfoPanel.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/panel/InfoPanel.java index 748b8007c8..8e01796548 100644 --- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/panel/InfoPanel.java +++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/panel/InfoPanel.java @@ -63,6 +63,7 @@ import org.adempiere.webui.event.ValueChangeListener; import org.adempiere.webui.event.WTableModelEvent; import org.adempiere.webui.event.WTableModelListener; import org.adempiere.webui.factory.InfoManager; +import org.adempiere.webui.info.InfoWindow; import org.adempiere.webui.part.ITabOnSelectHandler; import org.adempiere.webui.part.WindowContainer; import org.adempiere.webui.session.SessionManager; @@ -374,6 +375,7 @@ public abstract class InfoPanel extends Window implements EventListener, private String m_sqlUserOrder; /* sql column of infocolumn (can be alias) */ protected int indexOrderColumn = -1; + protected String sqlOrderColumn; protected Boolean isColumnSortAscending = null; /**ValueChange listeners */ private ArrayList listeners = new ArrayList(); @@ -1041,10 +1043,9 @@ public abstract class InfoPanel extends Window implements EventListener, int index = sql.lastIndexOf(" WHERE"); sql.delete(index, sql.length()); } - if (indexOrderColumn > -1) - sql.append(getUserOrderClause()); - else - sql.append(m_sqlOrder); + + sql.append(getUserOrderClause()); + dataSql = Msg.parseTranslation(Env.getCtx(), sql.toString()); // Variables dataSql = MRole.getDefault().addAccessSQL(dataSql, getTableName(), MRole.SQL_FULLYQUALIFIED, MRole.SQL_RO); @@ -1055,14 +1056,40 @@ public abstract class InfoPanel extends Window implements EventListener, return dataSql; } + /** + * column of grid isn't fix, it can change by display logic of column each time load data + * {@link InfoWindow#prepareTable(ColumnInfo[], String, String, String)} + * so need to validate it by compare sql of current sort column + */ + protected void validateOrderIndex() { + if (indexOrderColumn > 0 && (indexOrderColumn + 1 > p_layout.length || !p_layout[indexOrderColumn].getColSQL().trim().equals(sqlOrderColumn))) { + // try to find out new index of ordered column, in case has other column is hide or display + for (int testIndex = 0; testIndex < p_layout.length; testIndex++) { + if (p_layout[testIndex].getColSQL().trim().equals(sqlOrderColumn)) { + indexOrderColumn = testIndex; + break; + } + } + + // index still incorrect and can't find out new index (ordered column become hide column) + if (indexOrderColumn > 0 && (indexOrderColumn + 1 > p_layout.length || !p_layout[indexOrderColumn].getColSQL().trim().equals(sqlOrderColumn))) { + indexOrderColumn = -1; + sqlOrderColumn = null; + m_sqlUserOrder = null; + } + } + + } /** * build order clause of current sort order, and save it to m_sqlUserOrder * @return */ protected String getUserOrderClause() { + validateOrderIndex(); if (indexOrderColumn < 0) { - return null; + return m_sqlOrder; } + if (m_sqlUserOrder == null) { m_sqlUserOrder = getUserOrderClause (indexOrderColumn); } @@ -2296,24 +2323,26 @@ public abstract class InfoPanel extends Window implements EventListener, } } + protected void correctHeaderOrderIndicator() { + Listhead listHead = contentPanel.getListHead(); + if (listHead != null) { + List headers = listHead.getChildren(); + for(Object obj : headers) + { + Listheader header = (Listheader) obj; + // idempiere use mix method. sometime call model method, sometime call component method + // so index can be difference on complicate case, just wait to fix + if (header.getColumnIndex() == indexOrderColumn) + header.setSortDirection(isColumnSortAscending?"ascending":"descending"); + else + header.setSortDirection("natural"); + } + } + } public void onQueryCallback(Event event) { try { - Listhead listHead = contentPanel.getListHead(); - if (listHead != null) { - List headers = listHead.getChildren(); - for(Object obj : headers) - { - Listheader header = (Listheader) obj; - // idempiere use mix method. sometime call model method, sometime call component method - // so index can be difference on complicate case, just wait to fix - if (header.getColumnIndex() == indexOrderColumn) - header.setSortDirection(isColumnSortAscending?"ascending":"descending"); - else - header.setSortDirection("natural"); - } - } // m_sqlUserOrder=""; // event == null mean direct call from reset button if (event == null) @@ -2321,7 +2350,10 @@ public abstract class InfoPanel extends Window implements EventListener, else executeQuery(); - renderItems(); + renderItems(); + + correctHeaderOrderIndicator(); + // IDEMPIERE-1334 after refresh, restore prev selected item start // just evaluate display logic of process button when requery by use click requery button if (isQueryByUser){ @@ -2454,6 +2486,7 @@ public abstract class InfoPanel extends Window implements EventListener, int col = lsc.getColumnIndex(); indexOrderColumn = col; isColumnSortAscending = ascending; + sqlOrderColumn = p_layout[col].getColSQL().trim(); m_sqlUserOrder = null; // clear cache value if (m_useDatabasePaging) diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/part/WindowContainer.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/part/WindowContainer.java index 81d300f0e0..f588936d7a 100644 --- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/part/WindowContainer.java +++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/part/WindowContainer.java @@ -39,6 +39,7 @@ import org.zkoss.zk.ui.event.Event; import org.zkoss.zk.ui.event.EventListener; import org.zkoss.zk.ui.event.Events; import org.zkoss.zk.ui.event.KeyEvent; +import org.zkoss.zk.ui.event.OpenEvent; import org.zkoss.zk.ui.event.SwipeEvent; import org.zkoss.zul.Menuitem; @@ -49,6 +50,12 @@ import org.zkoss.zul.Menuitem; */ public class WindowContainer extends AbstractUIPart implements EventListener { + private static final String OPTION_CLOSE = "Close"; + private static final String OPTION_CLOSE_OTHER_WINDOWS = "CloseOtherWindows"; + private static final String OPTION_CLOSE_WINDOWS_TO_THE_LEFT = "CloseWindowsToTheLeft"; + private static final String OPTION_CLOSE_WINDOWS_TO_THE_RIGHT = "CloseWindowsToTheRight"; + private static final String OPTION_CLOSE_ALL_WINDOWS = "CloseAllWindows"; + public static final String ON_MOBILE_SET_SELECTED_TAB = "onMobileSetSelectedTab"; private static final String ON_AFTER_TAB_CLOSE = "onAfterTabClose"; @@ -279,6 +286,8 @@ public class WindowContainer extends AbstractUIPart implements EventListener() { public void onEvent(Event event) throws Exception { int currentTabIndex = tab.getIndex(); + int focusTabIndex = currentTabIndex; int tabsSizeBeforeClose = tabbox.getTabs().getChildren().size(); - - if ( tabsSizeBeforeClose == currentTabIndex + 1 ) { - currentTabIndex--; - } - if ( tab.getPreviousSibling() != null ) { - tab.onClose(); - // Update the current tab index. - if ( tabsSizeBeforeClose != tabbox.getTabs().getChildren().size() ) - tabbox.setSelectedIndex( currentTabIndex ); - Events.postEvent(ON_AFTER_TAB_CLOSE, tabbox, null); + if (tabsSizeBeforeClose == currentTabIndex + 1) { + focusTabIndex = currentTabIndex - 1; } + closeTabs(tab, currentTabIndex, currentTabIndex, focusTabIndex); } }); - mi = new Menuitem(Msg.getMsg(Env.getCtx(), "CloseOtherWindows")); + mi = new Menuitem(Msg.getMsg(Env.getCtx(), OPTION_CLOSE_OTHER_WINDOWS)); + mi.setAttribute("option", OPTION_CLOSE_OTHER_WINDOWS); popupClose.appendChild(mi); mi.addEventListener(Events.ON_CLICK, new EventListener() { public void onEvent(Event event) throws Exception { + int currentTabIndex = tab.getIndex(); + closeTabs(tab, currentTabIndex + 1, -1, currentTabIndex); // Right int focusTabIndex = 1; - List tabs = tabbox.getTabs().getChildren(); - for ( int i = tabs.size() - 1; i > 0; i-- ) { - if(!((Tab)tabs.get( i )).equals(tab)){ - ((Tab)tabs.get( i )).setSelected(false); + closeTabs(tab, 1, currentTabIndex - 1, focusTabIndex); // Left + } + }); - ((Tab)tabs.get( i )).onClose(); - } - } - tabbox.setSelectedIndex(focusTabIndex); - Events.postEvent(ON_AFTER_TAB_CLOSE, tabbox, null); + mi = new Menuitem(Msg.getMsg(Env.getCtx(), OPTION_CLOSE_WINDOWS_TO_THE_LEFT)); + mi.setAttribute("option", OPTION_CLOSE_WINDOWS_TO_THE_LEFT); + popupClose.appendChild(mi); + mi.addEventListener(Events.ON_CLICK, new EventListener() { + public void onEvent(Event event) throws Exception { + int currentTabIndex = tab.getIndex(); + int focusTabIndex = 1; + closeTabs(tab, 1, currentTabIndex - 1, focusTabIndex); + } + }); + + mi = new Menuitem(Msg.getMsg(Env.getCtx(), OPTION_CLOSE_WINDOWS_TO_THE_RIGHT)); + mi.setAttribute("option", OPTION_CLOSE_WINDOWS_TO_THE_RIGHT); + popupClose.appendChild(mi); + mi.addEventListener(Events.ON_CLICK, new EventListener() { + public void onEvent(Event event) throws Exception { + int currentTabIndex = tab.getIndex(); + closeTabs(tab, currentTabIndex + 1, -1, currentTabIndex); } }); } - mi = new Menuitem(Msg.getMsg(Env.getCtx(), "CloseAllWindows")); - mi.addEventListener(Events.ON_CLICK, new EventListener() { - public void onEvent(Event event) throws Exception { - int focusTabIndex = 0; - List tabs = tabbox.getTabs().getChildren(); - for ( int i = tabs.size() - 1; i > 0; i-- ) { - ((Tab)tabs.get( i )).setSelected(false); - ((Tab)tabs.get( i )).onClose(); - } - tabbox.setSelectedIndex( focusTabIndex ); - Events.postEvent(ON_AFTER_TAB_CLOSE, tabbox, null); - } - }); - popupClose.appendChild(mi); - ZKUpdateUtil.setWidth(popupClose, "auto"); - popupClose.setPage(tab.getPage()); - tab.setContext(popupClose); - + mi = new Menuitem(Msg.getMsg(Env.getCtx(), OPTION_CLOSE_ALL_WINDOWS)); + mi.setAttribute("option", OPTION_CLOSE_ALL_WINDOWS); + popupClose.appendChild(mi); + mi.addEventListener(Events.ON_CLICK, new EventListener() { + public void onEvent(Event event) throws Exception { + int focusTabIndex = 0; + closeTabs(tab, 1, -1, focusTabIndex); + } + }); + + ZKUpdateUtil.setWidth(popupClose, "auto"); + popupClose.setPage(tab.getPage()); + tab.setContext(popupClose); + updateTabListButton(); return tab; } + protected void closeTabs(Tab tab, int start, int end, int focus) { + List tabs = tabbox.getTabs().getChildren(); + if (end == -1) { + end = tabs.size() - 1; + } + for (int i = end; i >= start; i--) { + ((Tab)tabs.get( i )).setSelected(false); + ((Tab)tabs.get( i )).onClose(); + } + tabbox.setSelectedIndex(focus); + Events.postEvent(ON_AFTER_TAB_CLOSE, tabbox, null); + } + private void updateTabListButton() { if (isMobile() && tabListBtn != null) { int cnt = tabbox.getTabs().getChildren().size()-1; @@ -593,6 +621,37 @@ public class WindowContainer extends AbstractUIPart implements EventListener tabs = tabbox.getTabs().getChildren(); + int tabsSize = tabs.size(); + int currentTabIdx = -1; + if (popup.getAttribute("tab") != null) { + Tab currentTab = (Tab) popup.getAttribute("tab"); + for ( int i = tabsSize - 1; i > 0; i-- ) { + Tab tab = ((Tab)tabs.get(i)); + if (currentTab.equals(tab)) { + currentTabIdx = i; + break; + } + } + } + if (currentTabIdx > 0) { + List items = popup.getChildren(); + for (Component item : items) { + if (item instanceof Menuitem) { + String option = (String) item.getAttribute("option"); + boolean visible = + (OPTION_CLOSE.equals(option)) + || (tabsSize > 2 && (OPTION_CLOSE_OTHER_WINDOWS.equals(option) || OPTION_CLOSE_ALL_WINDOWS.equals(option))) + || (currentTabIdx < tabsSize - 1 && OPTION_CLOSE_WINDOWS_TO_THE_RIGHT.equals(option)) + || (currentTabIdx > 1 && OPTION_CLOSE_WINDOWS_TO_THE_LEFT.equals(option)); + item.setVisible(visible); + } + } + } + } }else if (Events.ON_CTRL_KEY.equals(event.getName())) { KeyEvent keyEvent = (KeyEvent) event; if (keyEvent.isAltKey() && keyEvent.getKeyCode() == KeyEvent.PAGE_DOWN diff --git a/org.adempiere.ui.zk/WEB-INF/web.xml b/org.adempiere.ui.zk/WEB-INF/web.xml index 712bf901c1..15898c060e 100644 --- a/org.adempiere.ui.zk/WEB-INF/web.xml +++ b/org.adempiere.ui.zk/WEB-INF/web.xml @@ -35,6 +35,14 @@ true + + default + org.eclipse.jetty.servlet.DefaultServlet + + dirAllowed + false + + AtmosphereServlet /zkau/comet diff --git a/org.idempiere.webservices/WEB-INF/web.xml b/org.idempiere.webservices/WEB-INF/web.xml index f83446e40a..08ab39b75b 100644 --- a/org.idempiere.webservices/WEB-INF/web.xml +++ b/org.idempiere.webservices/WEB-INF/web.xml @@ -27,7 +27,14 @@ 1 - + + default + org.eclipse.jetty.servlet.DefaultServlet + + dirAllowed + false + + CXFServlet /services/*