diff --git a/migration/i4.1z/oracle/201710232100_IDEMPIERE-3528.sql b/migration/i4.1z/oracle/201710232100_IDEMPIERE-3528.sql new file mode 100644 index 0000000000..c46d69881a --- /dev/null +++ b/migration/i4.1z/oracle/201710232100_IDEMPIERE-3528.sql @@ -0,0 +1,23 @@ +SET SQLBLANKLINES ON +SET DEFINE OFF + +-- IDEMPIERE-3528 Add to Favorite for Menu Search Panel +-- Oct 23, 2017 11:59:39 PM GMT+08:00 +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','Add To Favourite',0,0,'Y',TO_DATE('2017-10-23 23:59:38','YYYY-MM-DD HH24:MI:SS'),100,TO_DATE('2017-10-23 23:59:38','YYYY-MM-DD HH24:MI:SS'),100,200435,'AddToFavourite','D','ddbf357f-3f1c-49dd-9ce7-3d8f0cc3b30a') +; + +-- Oct 24, 2017 12:00:05 AM GMT+08:00 +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','Remove From Favourite',0,0,'Y',TO_DATE('2017-10-24 00:00:05','YYYY-MM-DD HH24:MI:SS'),100,TO_DATE('2017-10-24 00:00:05','YYYY-MM-DD HH24:MI:SS'),100,200436,'RemoveFromFavourite','D','36985206-17fb-4bf2-a339-3aac5e2601f3') +; + +-- Oct 24, 2017 12:00:51 AM GMT+08:00 +UPDATE AD_Message SET MsgText='Add To Favourites', Value='AddToFavourites',Updated=TO_DATE('2017-10-24 00:00:51','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Message_ID=200435 +; + +-- Oct 24, 2017 12:00:58 AM GMT+08:00 +UPDATE AD_Message SET MsgText='Remove From Favourites', Value='RemoveFromFavourites',Updated=TO_DATE('2017-10-24 00:00:58','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Message_ID=200436 +; + +SELECT register_migration_script('201710232100_IDEMPIERE-3528.sql') FROM dual +; + diff --git a/migration/i4.1z/oracle/201710240900_IDEMPIERE-3518.sql b/migration/i4.1z/oracle/201710240900_IDEMPIERE-3518.sql new file mode 100644 index 0000000000..49b1e57eb1 --- /dev/null +++ b/migration/i4.1z/oracle/201710240900_IDEMPIERE-3518.sql @@ -0,0 +1,11 @@ +SET SQLBLANKLINES ON +SET DEFINE OFF + +-- IDEMPIERE-3518 Improvement For Mobile Compatibility +-- Oct 24, 2017 7:34:07 AM GMT+08:00 +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','Select location to move selected item to',0,0,'Y',TO_DATE('2017-10-24 07:34:06','YYYY-MM-DD HH24:MI:SS'),100,TO_DATE('2017-10-24 07:34:06','YYYY-MM-DD HH24:MI:SS'),100,200437,'MoveSelectedTreeItem','D','95d7bb4b-c7af-4b17-b274-23916870a7fa') +; + +SELECT register_migration_script('201710240900_IDEMPIERE-3518.sql') FROM dual +; + diff --git a/migration/i4.1z/postgresql/201710232100_IDEMPIERE-3528.sql b/migration/i4.1z/postgresql/201710232100_IDEMPIERE-3528.sql new file mode 100644 index 0000000000..5f8a5eafbb --- /dev/null +++ b/migration/i4.1z/postgresql/201710232100_IDEMPIERE-3528.sql @@ -0,0 +1,20 @@ +-- IDEMPIERE-3528 Add to Favorite for Menu Search Panel +-- Oct 23, 2017 11:59:39 PM GMT+08:00 +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','Add To Favourite',0,0,'Y',TO_TIMESTAMP('2017-10-23 23:59:38','YYYY-MM-DD HH24:MI:SS'),100,TO_TIMESTAMP('2017-10-23 23:59:38','YYYY-MM-DD HH24:MI:SS'),100,200435,'AddToFavourite','D','ddbf357f-3f1c-49dd-9ce7-3d8f0cc3b30a') +; + +-- Oct 24, 2017 12:00:05 AM GMT+08:00 +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','Remove From Favourite',0,0,'Y',TO_TIMESTAMP('2017-10-24 00:00:05','YYYY-MM-DD HH24:MI:SS'),100,TO_TIMESTAMP('2017-10-24 00:00:05','YYYY-MM-DD HH24:MI:SS'),100,200436,'RemoveFromFavourite','D','36985206-17fb-4bf2-a339-3aac5e2601f3') +; + +-- Oct 24, 2017 12:00:51 AM GMT+08:00 +UPDATE AD_Message SET MsgText='Add To Favourites', Value='AddToFavourites',Updated=TO_TIMESTAMP('2017-10-24 00:00:51','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Message_ID=200435 +; + +-- Oct 24, 2017 12:00:58 AM GMT+08:00 +UPDATE AD_Message SET MsgText='Remove From Favourites', Value='RemoveFromFavourites',Updated=TO_TIMESTAMP('2017-10-24 00:00:58','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Message_ID=200436 +; + +SELECT register_migration_script('201710232100_IDEMPIERE-3528.sql') FROM dual +; + diff --git a/migration/i4.1z/postgresql/201710240900_IDEMPIERE-3518.sql b/migration/i4.1z/postgresql/201710240900_IDEMPIERE-3518.sql new file mode 100644 index 0000000000..4afed1aa0a --- /dev/null +++ b/migration/i4.1z/postgresql/201710240900_IDEMPIERE-3518.sql @@ -0,0 +1,8 @@ +-- IDEMPIERE-3518 Improvement For Mobile Compatibility +-- Oct 24, 2017 7:34:07 AM GMT+08:00 +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','Select location to move selected item to',0,0,'Y',TO_TIMESTAMP('2017-10-24 07:34:06','YYYY-MM-DD HH24:MI:SS'),100,TO_TIMESTAMP('2017-10-24 07:34:06','YYYY-MM-DD HH24:MI:SS'),100,200437,'MoveSelectedTreeItem','D','95d7bb4b-c7af-4b17-b274-23916870a7fa') +; + +SELECT register_migration_script('201710240900_IDEMPIERE-3518.sql') FROM dual +; + diff --git a/org.adempiere.pipo/src/org/adempiere/pipo2/PoFiller.java b/org.adempiere.pipo/src/org/adempiere/pipo2/PoFiller.java index e8570fae9b..25a1a6334c 100644 --- a/org.adempiere.pipo/src/org/adempiere/pipo2/PoFiller.java +++ b/org.adempiere.pipo/src/org/adempiere/pipo2/PoFiller.java @@ -41,16 +41,30 @@ public class PoFiller{ this.handler = handler; } + protected String getStringValue (String columnName){ + Element e = element.properties.get(columnName); + String value = e != null ? e.contents.toString() : null; + + value = "".equals(value) ? null : value; + return value; + } + + protected boolean isBlobOnPackinFile (String columnName){ + String value = getStringValue(columnName); + if(value == null) + return false; + + String strParts [] = value.split("[|]"); + return strParts.length == 2; + + } + /** * * @param columnName */ public void setString(String columnName){ - - Element e = element.properties.get(columnName); - String value = e != null ? e.contents.toString() : null; - - value = "".equals(value) ? null : value; + String value = getStringValue(columnName); Object oldValue = po.get_Value(columnName); if (value == null && oldValue == null) @@ -288,6 +302,12 @@ public class PoFiller{ setInteger(qName); } else if (info.getColumnClass(index) == Timestamp.class) { setTimestamp(qName); + }else if(DisplayType.TextLong == info.getColumnDisplayType(index)) {// export column from system have type is normal string, but import to system have this column but type is textlong (mean blob) + if (getStringValue (qName) != null || !isBlobOnPackinFile(qName)) { + setString(qName); + }else { + setBlob(qName); + } } else if (DisplayType.isLOB(info.getColumnDisplayType(index))) { setBlob(qName); } else { diff --git a/org.adempiere.sdk-feature/feature.xml b/org.adempiere.sdk-feature/feature.xml index c18971989a..3f57621ee7 100644 --- a/org.adempiere.sdk-feature/feature.xml +++ b/org.adempiere.sdk-feature/feature.xml @@ -38,6 +38,10 @@ id="org.idempiere.fitnesse" version="0.0.0"/> + + - + @@ -74,7 +74,6 @@ - @@ -82,7 +81,7 @@ - + diff --git a/org.adempiere.server-feature/buckminster.properties b/org.adempiere.server-feature/buckminster.properties index 8ed6e52f98..0af91deea8 100644 --- a/org.adempiere.server-feature/buckminster.properties +++ b/org.adempiere.server-feature/buckminster.properties @@ -10,9 +10,9 @@ target.os=* target.ws=* target.arch=* -product.features=org.idempiere.eclipse.platform.feature.group, org.idempiere.fitnesse.feature.group +product.features=org.idempiere.fitnesse.feature.group, org.idempiere.equinox.p2.director.feature.group product.profile=DefaultProfile -product.id=org.adempiere.server.product +product.id=org.adempiere.server.product, org.eclipse.equinox.p2.director osgi.user.area=${user.home} osgi.user.area.default=${user.home} diff --git a/org.adempiere.server-feature/buckminster_linux_gtk_x86.properties b/org.adempiere.server-feature/buckminster_linux_gtk_x86.properties index 5fd88424ac..512965b826 100644 --- a/org.adempiere.server-feature/buckminster_linux_gtk_x86.properties +++ b/org.adempiere.server-feature/buckminster_linux_gtk_x86.properties @@ -10,9 +10,9 @@ target.os=linux target.ws=gtk target.arch=x86 -product.features=org.idempiere.eclipse.platform.feature.group, org.idempiere.fitnesse.feature.group +product.features=org.idempiere.fitnesse.feature.group, org.idempiere.equinox.p2.director.feature.group product.profile=DefaultProfile -product.id=org.adempiere.server.product +product.id=org.adempiere.server.product, org.eclipse.equinox.p2.director osgi.user.area=${user.home} osgi.user.area.default=${user.home} diff --git a/org.adempiere.server-feature/buckminster_linux_gtk_x86_64.properties b/org.adempiere.server-feature/buckminster_linux_gtk_x86_64.properties index 3d952a40b5..22d5db826b 100644 --- a/org.adempiere.server-feature/buckminster_linux_gtk_x86_64.properties +++ b/org.adempiere.server-feature/buckminster_linux_gtk_x86_64.properties @@ -10,9 +10,9 @@ target.os=linux target.ws=gtk target.arch=x86_64 -product.features=org.idempiere.eclipse.platform.feature.group, org.idempiere.fitnesse.feature.group +product.features=org.idempiere.fitnesse.feature.group, org.idempiere.equinox.p2.director.feature.group product.profile=DefaultProfile -product.id=org.adempiere.server.product +product.id=org.adempiere.server.product, org.eclipse.equinox.p2.director osgi.user.area=${user.home} osgi.user.area.default=${user.home} diff --git a/org.adempiere.server-feature/buckminster_macosx_x86.properties b/org.adempiere.server-feature/buckminster_macosx_x86.properties index b4de619240..9d1b4fb981 100644 --- a/org.adempiere.server-feature/buckminster_macosx_x86.properties +++ b/org.adempiere.server-feature/buckminster_macosx_x86.properties @@ -10,9 +10,9 @@ target.os=macosx target.ws=cocoa target.arch=x86 -product.features=org.idempiere.eclipse.platform.feature.group, org.idempiere.fitnesse.feature.group +product.features=org.idempiere.fitnesse.feature.group, org.idempiere.equinox.p2.director.feature.group product.profile=DefaultProfile -product.id=org.adempiere.server.product +product.id=org.adempiere.server.product, org.eclipse.equinox.p2.director osgi.user.area=${user.home} osgi.user.area.default=${user.home} diff --git a/org.adempiere.server-feature/buckminster_solaris_gtk_x86.properties b/org.adempiere.server-feature/buckminster_solaris_gtk_x86.properties index 154c3d39b1..223491493f 100644 --- a/org.adempiere.server-feature/buckminster_solaris_gtk_x86.properties +++ b/org.adempiere.server-feature/buckminster_solaris_gtk_x86.properties @@ -10,9 +10,9 @@ target.os=solaris target.ws=gtk target.arch=x86 -product.features=org.idempiere.eclipse.platform.feature.group, org.idempiere.fitnesse.feature.group +product.features=org.idempiere.fitnesse.feature.group, org.idempiere.equinox.p2.director.feature.group product.profile=DefaultProfile -product.id=org.adempiere.server.product +product.id=org.adempiere.server.product, org.eclipse.equinox.p2.director osgi.user.area=${user.home} osgi.user.area.default=${user.home} diff --git a/org.adempiere.server-feature/buckminster_win32_x86.properties b/org.adempiere.server-feature/buckminster_win32_x86.properties index cd31709746..02d08f0484 100644 --- a/org.adempiere.server-feature/buckminster_win32_x86.properties +++ b/org.adempiere.server-feature/buckminster_win32_x86.properties @@ -10,9 +10,9 @@ target.os=win32 target.ws=win32 target.arch=x86 -product.features=org.idempiere.eclipse.platform.feature.group, org.idempiere.fitnesse.feature.group +product.features=org.idempiere.fitnesse.feature.group, org.idempiere.equinox.p2.director.feature.group product.profile=DefaultProfile -product.id=org.adempiere.server.product +product.id=org.adempiere.server.product, org.eclipse.equinox.p2.director osgi.user.area=${user.home} osgi.user.area.default=${user.home} diff --git a/org.adempiere.server-feature/buckminster_win32_x86_64.properties b/org.adempiere.server-feature/buckminster_win32_x86_64.properties new file mode 100644 index 0000000000..ebdcc5d72b --- /dev/null +++ b/org.adempiere.server-feature/buckminster_win32_x86_64.properties @@ -0,0 +1,19 @@ +## buckminster.properties ## +#Where all the output should go +buckminster.output.root=${user.home}/buckminster.output +# Where the temp files should go +buckminster.temp.root=${user.home}/tmp +# How .qualifier in versions should be replaced +qualifier.replacement.*=generator:buildTimestamp +generator.buildTimestamp.format='v'yyyyMMdd-HHmm +target.os=win32 +target.ws=win32 +target.arch=x86_64 + +product.features=org.idempiere.fitnesse.feature.group, org.idempiere.equinox.p2.director.feature.group +product.profile=DefaultProfile +product.id=org.adempiere.server.product, org.eclipse.equinox.p2.director + +osgi.user.area=${user.home} +osgi.user.area.default=${user.home} +osgi.configuration.area.default=configuration diff --git a/org.adempiere.server-feature/copyjars.xml b/org.adempiere.server-feature/copyjars.xml index 2ee3001deb..e081ab9518 100644 --- a/org.adempiere.server-feature/copyjars.xml +++ b/org.adempiere.server-feature/copyjars.xml @@ -1,7 +1,6 @@ - diff --git a/org.adempiere.server-feature/server.product.launch b/org.adempiere.server-feature/server.product.launch index 138ac6d2e5..3b28df0763 100644 --- a/org.adempiere.server-feature/server.product.launch +++ b/org.adempiere.server-feature/server.product.launch @@ -27,8 +27,8 @@ - - + + diff --git a/org.adempiere.server-feature/utils.unix/RUN_ImportIdempiere.sh b/org.adempiere.server-feature/utils.unix/RUN_ImportIdempiere.sh index be1e5f3a61..4d44e42823 100644 --- a/org.adempiere.server-feature/utils.unix/RUN_ImportIdempiere.sh +++ b/org.adempiere.server-feature/utils.unix/RUN_ImportIdempiere.sh @@ -16,17 +16,6 @@ then SYSUSER=postgres fi -# for oracle or postgres version 9.1 or higher you run this the usual way: -# RUN_ImportIdempiere.sh -# for postgres versions 8.4 or 9.0 you can run this way: -# RUN_ImportIdempiere.sh 8.4 -# or -# RUN_ImportIdempiere.sh 9.0 -if [ "x$1" = x8.4 -o "x$1" = x9.0 ] -then - SUFFIX="_pg84" -fi - echo Re-Create idempiere User and import $IDEMPIERE_HOME/data/Adempiere${SUFFIX}.dmp - \($ADEMPIERE_DB_NAME\) echo == The import will show warnings. This is OK == cd $IDEMPIERE_HOME/data/seed diff --git a/org.adempiere.server-feature/utils.windows/RUN_ImportIdempiere.bat b/org.adempiere.server-feature/utils.windows/RUN_ImportIdempiere.bat index d5100b5a65..cc249bfa8e 100644 --- a/org.adempiere.server-feature/utils.windows/RUN_ImportIdempiere.bat +++ b/org.adempiere.server-feature/utils.windows/RUN_ImportIdempiere.bat @@ -8,15 +8,6 @@ SET SYSUSER=system if (%ADEMPIERE_DB_PATH%) == (postgresql) SET SUFFIX=_pg if (%ADEMPIERE_DB_PATH%) == (postgresql) SET SYSUSER=postgres -@Rem for oracle or postgres version 9.1 or higher you run this the usual way: -@Rem RUN_ImportIdempiere.sh -@Rem for postgres versions 8.4 or 9.0 you can run this way: -@Rem RUN_ImportIdempiere.sh 8.4 -@Rem or -@Rem RUN_ImportIdempiere.sh 9.0 -if (%1) == (8.4) SET SUFFIX=_pg84 -if (%1) == (9.0) SET SUFFIX=_pg84 - @echo Re-Create idempiere User and import %IDEMPIERE_HOME%\data\Adempiere.dmp - (%ADEMPIERE_DB_NAME%) cd %IDEMPIERE_HOME%\data\seed jar xvf Adempiere%SUFFIX%.jar diff --git a/org.adempiere.ui.zk/.classpath b/org.adempiere.ui.zk/.classpath index 44533378a5..e5c0183f04 100644 --- a/org.adempiere.ui.zk/.classpath +++ b/org.adempiere.ui.zk/.classpath @@ -1,5 +1,6 @@ + diff --git a/org.adempiere.ui.zk/META-INF/MANIFEST.MF b/org.adempiere.ui.zk/META-INF/MANIFEST.MF index d0073ab621..997c2bd496 100644 --- a/org.adempiere.ui.zk/META-INF/MANIFEST.MF +++ b/org.adempiere.ui.zk/META-INF/MANIFEST.MF @@ -21,6 +21,11 @@ Import-Package: groovy.transform.stc;version="2.4.7", net.sf.jasperreports.export, org.adempiere.report.jasper, org.apache.commons.codec.binary, + org.apache.commons.fileupload;version="1.2.2", + org.apache.commons.fileupload.disk;version="1.2.2", + org.apache.commons.fileupload.portlet;version="1.2.2", + org.apache.commons.fileupload.servlet;version="1.2.2", + org.apache.commons.fileupload.util;version="1.2.2", org.apache.ecs, org.apache.ecs.xhtml, org.apache.tools.ant, @@ -44,7 +49,8 @@ Import-Package: groovy.transform.stc;version="2.4.7", org.springframework.web.util DynamicImport-Package: action.images Bundle-ClassPath: ., - WEB-INF/lib/daisydiff-min.jar + WEB-INF/lib/daisydiff-min.jar, + WEB-INF/lib/ckez.jar Export-Package: fi.jawsy.jawwa.zk.atmosphere, metainfo.zk, org.adempiere.webui, @@ -77,7 +83,60 @@ Export-Package: fi.jawsy.jawwa.zk.atmosphere, org.adempiere.webui.theme, org.adempiere.webui.util, org.adempiere.webui.window, + org.zkforge.ckez, org.zkforge.keylistener, + web.ckez.html, + web.ckez.img, + web.js.ckez, + web.js.ckez.ext.CKeditor, + web.js.ckez.ext.CKeditor.adapters, + web.js.ckez.ext.CKeditor.lang, + web.js.ckez.ext.CKeditor.plugins, + web.js.ckez.ext.CKeditor.plugins.a11yhelp.dialogs, + web.js.ckez.ext.CKeditor.plugins.a11yhelp.dialogs.lang, + web.js.ckez.ext.CKeditor.plugins.about.dialogs, + web.js.ckez.ext.CKeditor.plugins.about.dialogs.hidpi, + web.js.ckez.ext.CKeditor.plugins.colordialog.dialogs, + web.js.ckez.ext.CKeditor.plugins.copyformatting.cursors, + web.js.ckez.ext.CKeditor.plugins.copyformatting.styles, + web.js.ckez.ext.CKeditor.plugins.dialog, + web.js.ckez.ext.CKeditor.plugins.div.dialogs, + web.js.ckez.ext.CKeditor.plugins.find.dialogs, + web.js.ckez.ext.CKeditor.plugins.flash.dialogs, + web.js.ckez.ext.CKeditor.plugins.flash.images, + web.js.ckez.ext.CKeditor.plugins.forms.dialogs, + web.js.ckez.ext.CKeditor.plugins.forms.images, + web.js.ckez.ext.CKeditor.plugins.iframe.dialogs, + web.js.ckez.ext.CKeditor.plugins.iframe.images, + web.js.ckez.ext.CKeditor.plugins.image.dialogs, + web.js.ckez.ext.CKeditor.plugins.image.images, + web.js.ckez.ext.CKeditor.plugins.link.dialogs, + web.js.ckez.ext.CKeditor.plugins.link.images, + web.js.ckez.ext.CKeditor.plugins.link.images.hidpi, + web.js.ckez.ext.CKeditor.plugins.liststyle.dialogs, + web.js.ckez.ext.CKeditor.plugins.magicline.images, + web.js.ckez.ext.CKeditor.plugins.magicline.images.hidpi, + web.js.ckez.ext.CKeditor.plugins.pagebreak.images, + web.js.ckez.ext.CKeditor.plugins.pastefromword.filter, + web.js.ckez.ext.CKeditor.plugins.preview, + web.js.ckez.ext.CKeditor.plugins.scayt, + web.js.ckez.ext.CKeditor.plugins.scayt.dialogs, + web.js.ckez.ext.CKeditor.plugins.scayt.skins, + web.js.ckez.ext.CKeditor.plugins.showblocks.images, + web.js.ckez.ext.CKeditor.plugins.smiley.dialogs, + web.js.ckez.ext.CKeditor.plugins.smiley.images, + web.js.ckez.ext.CKeditor.plugins.specialchar.dialogs, + web.js.ckez.ext.CKeditor.plugins.specialchar.dialogs.lang, + web.js.ckez.ext.CKeditor.plugins.table.dialogs, + web.js.ckez.ext.CKeditor.plugins.tableselection.styles, + web.js.ckez.ext.CKeditor.plugins.tabletools.dialogs, + web.js.ckez.ext.CKeditor.plugins.templates.dialogs, + web.js.ckez.ext.CKeditor.plugins.templates.templates, + web.js.ckez.ext.CKeditor.plugins.templates.templates.images, + web.js.ckez.ext.CKeditor.plugins.wsc, + web.js.ckez.ext.CKeditor.plugins.wsc.dialogs, + web.js.ckez.ext.CKeditor.plugins.wsc.skins, + web.js.ckez.ext.CKeditor.skins, web.js.zkforge, web.js.zkforge.mold Require-Bundle: org.adempiere.base;bundle-version="0.0.0", @@ -100,4 +159,3 @@ Eclipse-ExtensibleAPI: true Web-ContextPath: webui Service-Component: OSGI-INF/reportviewerprovider.xml, OSGI-INF/defaultinfofactory.xml, OSGI-INF/defaulteditorfactory.xml, OSGI-INF/jrviewerprovider.xml, OSGI-INF/resourcefinder.xml, OSGI-INF/defaultpaymentformfactory.xml, OSGI-INF/processfactory.xml, OSGI-INF/defaultprintshippinglabel.xml, OSGI-INF/defaultcreatefromfactory.xml, OSGI-INF/defaultformfactory.xml, OSGI-INF/feedbackservice.xml, OSGI-INF/zulgadgetfactory.xml, OSGI-INF/jfgchartrenderer.xml Bundle-ActivationPolicy: lazy -Eclipse-RegisterBuddy: org.idempiere.zk.extra diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/AdempiereWebUI.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/AdempiereWebUI.java index 8790a1672a..35746720a7 100644 --- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/AdempiereWebUI.java +++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/AdempiereWebUI.java @@ -35,6 +35,7 @@ import org.adempiere.webui.component.DrillCommand; import org.adempiere.webui.component.TokenCommand; import org.adempiere.webui.component.ZoomCommand; import org.adempiere.webui.desktop.DefaultDesktop; +import org.adempiere.webui.desktop.FavouriteController; import org.adempiere.webui.desktop.IDesktop; import org.adempiere.webui.session.SessionContextListener; import org.adempiere.webui.session.SessionManager; @@ -233,7 +234,7 @@ public class AdempiereWebUI extends Window implements EventListener, IWeb mSession.saveEx(); } - currSess.setAttribute("Check_AD_User_ID", Env.getAD_User_ID(ctx)); + currSess.setAttribute("Check_AD_User_ID", Env.getAD_User_ID(ctx)); //enable full interface, relook into this when doing preference Env.setContext(ctx, "#ShowTrl", true); @@ -281,6 +282,9 @@ public class AdempiereWebUI extends Window implements EventListener, IWeb Env.setContext(ctx, "#LocalHttpAddr", localHttpAddr.toString()); Clients.response(new AuScript("zAu.cmd0.clearBusy()")); + //init favorite + FavouriteController.getInstance(currSess); + processParameters(); } diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/adwindow/ADWindowToolbar.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/adwindow/ADWindowToolbar.java index 0b920de0af..970be8a714 100644 --- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/adwindow/ADWindowToolbar.java +++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/adwindow/ADWindowToolbar.java @@ -31,8 +31,10 @@ import org.adempiere.webui.LayoutUtils; import org.adempiere.webui.action.Actions; import org.adempiere.webui.action.IAction; import org.adempiere.webui.component.FToolbar; +import org.adempiere.webui.component.Tabpanel; import org.adempiere.webui.component.ToolBarButton; import org.adempiere.webui.event.ToolbarListener; +import org.adempiere.webui.part.WindowContainer; import org.adempiere.webui.session.SessionManager; import org.adempiere.webui.theme.ThemeManager; import org.adempiere.webui.util.ZKUpdateUtil; @@ -829,6 +831,18 @@ public class ADWindowToolbar extends FToolbar implements EventListener "}"); addEventListener(Events.ON_AFTER_SIZE, (AfterSizeEvent evt) -> onAfterSize(evt)); + addCallback(AFTER_PAGE_ATTACHED, t -> afterPageAttached()); + } + + private void afterPageAttached() { + Component p = getParent(); + while (p != null) { + if (p instanceof Tabpanel) { + p.addEventListener(WindowContainer.ON_MOBILE_SET_SELECTED_TAB, evt -> this.invalidate()); + break; + } + p = p.getParent(); + } } private void onAfterSize(AfterSizeEvent evt) { @@ -905,7 +919,9 @@ public class ADWindowToolbar extends FToolbar implements EventListener } public void onPostAfterSize() { - String script = "var w = zk.Widget.$('#" + getUuid() + "'); w.toolbarScrollable(w);"; - Clients.evalJavaScript(script); + if (this.getPage() != null) { + String script = "var w = zk.Widget.$('#" + getUuid() + "'); w.toolbarScrollable(w);"; + Clients.evalJavaScript(script); + } } } diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/adwindow/AbstractADWindowContent.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/adwindow/AbstractADWindowContent.java index d42c6e953e..b582207c43 100644 --- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/adwindow/AbstractADWindowContent.java +++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/adwindow/AbstractADWindowContent.java @@ -3060,8 +3060,15 @@ public abstract class AbstractADWindowContent extends AbstractUIPart implements //dialog.setWidth("500px"); dialog.setBorder("normal"); getComponent().getParent().appendChild(dialog); - showBusyMask(dialog); - LayoutUtils.openOverlappedWindow(getComponent(), dialog, "middle_center"); + if (ClientInfo.isMobile()) + { + dialog.doHighlighted(); + } + else + { + showBusyMask(dialog); + LayoutUtils.openOverlappedWindow(getComponent(), dialog, "middle_center"); + } dialog.focus(); } else diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/apps/AbstractProcessDialog.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/apps/AbstractProcessDialog.java index 36ee50297e..61d3b5710d 100644 --- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/apps/AbstractProcessDialog.java +++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/apps/AbstractProcessDialog.java @@ -248,7 +248,7 @@ public abstract class AbstractProcessDialog extends Window implements IProcessUI } layout(); - + return true; } @@ -375,7 +375,8 @@ public abstract class AbstractProcessDialog extends Window implements IProcessUI row.appendChild(notificationTypeField.getComponent()); runAsJobField.setChecked(MSysConfig.getBooleanValue(MSysConfig.BACKGROUND_JOB_BY_DEFAULT, false)); - notificationTypeField.getComponent().getParent().setVisible(runAsJobField.isChecked()); + notificationTypeField.getComponent().getParent().setVisible(runAsJobField.isChecked()); + notificationTypeField.fillHorizontal(); } } @@ -405,13 +406,13 @@ public abstract class AbstractProcessDialog extends Window implements IProcessUI bottomParameterLayout.appendChild(reportOptionLayout); freportType = new Listbox(); - freportType.setSclass("option-input-parameter"); + freportType.setSclass("option-input-parameter view-report-list"); chbIsSummary = new Checkbox(); chbIsSummary.setSclass("option-input-parameter"); Label lPrintFormat = new Label(Msg.translate(Env.getCtx(), "AD_PrintFormat_ID")); - lPrintFormat.setSclass("option-input-parameter"); + lPrintFormat.setSclass("option-input-parameter print-format-label"); Label lreportType = new Label(Msg.translate(Env.getCtx(), "view.report")); - lreportType.setSclass("option-input-parameter"); + lreportType.setSclass("option-input-parameter view-report-label"); Label lIsSummary = new Label(Msg.translate(Env.getCtx(), "Summary")); lIsSummary.setSclass("option-input-parameter"); @@ -426,7 +427,8 @@ public abstract class AbstractProcessDialog extends Window implements IProcessUI reportOptionLayout.appendChild(fLanguageType.getComponent()); ((Combobox)fLanguageType.getComponent()).setSclass("option-input-parameter"); } - fPrintFormat.getComponent().setSclass("option-input-parameter"); + fPrintFormat.getComponent().setSclass("option-input-parameter print-format-list"); + fPrintFormat.getComponent().setPlaceholder(lPrintFormat.getValue()); reportOptionLayout.appendChild(lreportType); reportOptionLayout.appendChild(freportType); reportOptionLayout.appendChild(lIsSummary); @@ -440,15 +442,19 @@ public abstract class AbstractProcessDialog extends Window implements IProcessUI } protected void savePrameterLayout(HtmlBasedComponent bottomParameterLayout) { - HtmlBasedComponent savePrameterLayout = new Hlayout(); + Hlayout savePrameterLayout = new Hlayout(); savePrameterLayout.setSclass("save-parameter-container"); bottomParameterLayout.appendChild(savePrameterLayout); + savePrameterLayout.setValign("middle"); lSaved = new Label(Msg.getMsg(Env.getCtx(), "SavedParameter")); + lSaved.setClass("saved-parameter-label"); savePrameterLayout.appendChild(lSaved); fSavedName = new Combobox(); fSavedName.addEventListener(Events.ON_CHANGE, this); savePrameterLayout.appendChild(fSavedName); + fSavedName.setPlaceholder(lSaved.getValue()); + fSavedName.setSclass("saved-parameter-list"); bSave.setEnabled(false); bSave.addActionListener(this); @@ -609,6 +615,7 @@ public abstract class AbstractProcessDialog extends Window implements IProcessUI if (component == runAsJobField && event.getName().equals(Events.ON_CHECK)) { notificationTypeField.getComponent().getParent().setVisible(runAsJobField.isChecked()); + mainParameterLayout.invalidate(); } else if (event.getName().equals(ON_COMPLETE)) diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/apps/MenuSearchController.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/apps/MenuSearchController.java index f25fd41c11..9f9b4c5933 100644 --- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/apps/MenuSearchController.java +++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/apps/MenuSearchController.java @@ -20,6 +20,8 @@ import java.util.List; import org.adempiere.webui.component.ListHead; import org.adempiere.webui.component.ListItem; import org.adempiere.webui.component.Listbox; +import org.adempiere.webui.component.ToolBarButton; +import org.adempiere.webui.desktop.FavouriteController; import org.adempiere.webui.theme.ThemeManager; import org.adempiere.webui.util.TreeItemAction; import org.adempiere.webui.util.TreeNodeAction; @@ -47,7 +49,6 @@ import org.zkoss.zul.Listitem; import org.zkoss.zul.ListitemRenderer; import org.zkoss.zul.ListitemRendererExt; import org.zkoss.zul.Textbox; -import org.zkoss.zul.Toolbarbutton; import org.zkoss.zul.Tree; import org.zkoss.zul.Treechildren; import org.zkoss.zul.Treeitem; @@ -61,14 +62,21 @@ import org.zkoss.zul.impl.LabelImageElement; */ public class MenuSearchController implements EventListener{ + public static final String M_TREE_NODE_ATTR = "MTreeNode"; + + private static final String Z_ICON_STAR_O = "z-icon-star-o"; + private static final String Z_ICON_STAR = "z-icon-star"; private static final String ON_SEARCH_ECHO = "onSearchEcho"; private static final String ON_LOAD_MORE = "onLoadMore"; private static final String ONSELECT_TIMESTAMP = "onselect.timestamp"; + private static final String STAR_BUTTON_NAME = "Star"; + private static final String NEW_BUTTON_NAME = "New"; private Tree tree; private Listbox listbox; private ListModelList model; private Vlayout layout; private ListModelList fullModel; + private boolean inStarEvent; private static final String ON_POST_SELECT_TREEITEM_EVENT = "onPostSelectTreeitem"; @@ -196,12 +204,21 @@ public class MenuSearchController implements EventListener{ Listheader listheader = new Listheader(); listhead.appendChild(listheader); listheader = new Listheader(); - ZKUpdateUtil.setWidth(listheader, "32px"); + listheader.setAlign("center"); + ZKUpdateUtil.setWidth(listheader, "28px"); + listhead.appendChild(listheader); + listheader = new Listheader(); + listheader.setAlign("center"); + ZKUpdateUtil.setWidth(listheader, "28px"); listhead.appendChild(listheader); layout.addEventListener(ON_SEARCH_ECHO, this); layout.addEventListener(ON_LOAD_MORE, this); updateListboxModel(model); + + FavouriteController controller = FavouriteController.getInstance(Executions.getCurrent().getSession()); + controller.addDeletedCallback(t -> onDeletedCallback(t)); + controller.addInsertedCallback(t -> onInsertedCallback(t)); } @Override @@ -221,18 +238,34 @@ public class MenuSearchController implements EventListener{ } else if (System.currentTimeMillis() - onSelect.longValue() > 1000) { onSelect(item, Boolean.FALSE); } - } else if (event.getTarget() instanceof Toolbarbutton) { - ListItem item = null; - Component parent = event.getTarget(); - while (parent != null) { - if (parent instanceof ListItem) { - item = (ListItem) parent; - break; + } else if (event.getTarget() instanceof ToolBarButton) { + ToolBarButton btn = (ToolBarButton) event.getTarget(); + if (NEW_BUTTON_NAME.equals(btn.getName())) { + ListItem item = null; + Component parent = event.getTarget(); + while (parent != null) { + if (parent instanceof ListItem) { + item = (ListItem) parent; + break; + } + parent = parent.getParent(); } - parent = parent.getParent(); - } - if (item != null) { - onSelect(item, Boolean.TRUE); + if (item != null) { + onSelect(item, Boolean.TRUE); + } + } else if (STAR_BUTTON_NAME.equals(btn.getName())) { + inStarEvent = true; + FavouriteController controller = FavouriteController.getInstance(Executions.getCurrent().getSession()); + if (Z_ICON_STAR_O.equals(btn.getIconSclass())) { + btn.setIconSclass(Z_ICON_STAR); + btn.setTooltiptext(Msg.getMsg(Env.getCtx(), "RemoveFromFavourites")); + controller.addNode((MTreeNode) btn.getAttribute(M_TREE_NODE_ATTR)); + } else if (Z_ICON_STAR.equals(btn.getIconSclass())) { + btn.setIconSclass(Z_ICON_STAR_O); + btn.setTooltiptext(Msg.getMsg(Env.getCtx(), "AddToFavourites")); + controller.removeNode(((MTreeNode) btn.getAttribute(M_TREE_NODE_ATTR)).getNode_ID()); + } + inStarEvent = false; } } } else if (event.getName().equals(ON_SEARCH_ECHO)) { @@ -241,6 +274,20 @@ public class MenuSearchController implements EventListener{ loadMore(); } } + + private void onInsertedCallback(MTreeNode node) { + if (inStarEvent) return; + ListModel t = listbox.getModel(); + listbox.setModel((ListModel)null); + listbox.setModel(t); + } + + private void onDeletedCallback(Integer nodeId) { + if (inStarEvent) return; + ListModel t = listbox.getModel(); + listbox.setModel((ListModel)null); + listbox.setModel(t); + } private void onSelect(ListItem selected, Boolean newRecord) { MenuItem item = selected.getValue(); @@ -438,6 +485,9 @@ public class MenuSearchController implements EventListener{ } private class MenuItemRenderer implements ListitemRenderer, ListitemRendererExt { + private static final String REMOVE_FROM_FAVOURITES_MSG = "RemoveFromFavourites"; + private static final String ADD_TO_FAVOURITES_MSG = "AddToFavourites"; + @Override public Listitem newListitem(org.zkoss.zul.Listbox listbox) { return new ListItem(); @@ -466,13 +516,41 @@ public class MenuSearchController implements EventListener{ item.appendChild(cell); boolean isWindow = data.getType() != null && data.getType().equals("window"); if (isWindow) { - Toolbarbutton newBtn = new Toolbarbutton(null, ThemeManager.getThemeResource("images/New16.png")); + ToolBarButton newBtn = new ToolBarButton(); + newBtn.setImage(ThemeManager.getThemeResource("images/New16.png")); newBtn.addEventListener(Events.ON_CLICK, MenuSearchController.this); newBtn.setSclass("fav-new-btn"); - newBtn.setTooltiptext(Util.cleanAmp(Msg.getMsg(Env.getCtx(), "New"))); + newBtn.setTooltiptext(Util.cleanAmp(Msg.getMsg(Env.getCtx(), NEW_BUTTON_NAME))); + newBtn.setName(NEW_BUTTON_NAME); cell.appendChild(newBtn); } - } + cell = new Listcell(); + item.appendChild(cell); + MTreeNode node = null; + if (data.getData() instanceof MTreeNode) { + node = (MTreeNode) data.getData(); + } else if (data.getData() instanceof Treeitem) { + Treeitem value = (Treeitem) data.getData(); + if (value != null) { + node = (MTreeNode) value.getAttribute(M_TREE_NODE_ATTR); + } + } + if (node != null) { + FavouriteController controller = FavouriteController.getInstance(Executions.getCurrent().getSession()); + ToolBarButton starBtn = new ToolBarButton(); + starBtn.setAttribute(M_TREE_NODE_ATTR, node); + starBtn.setName(STAR_BUTTON_NAME); + if (controller.hasNode(node.getNode_ID())) { + starBtn.setIconSclass(Z_ICON_STAR); + starBtn.setTooltiptext(Msg.getMsg(Env.getCtx(), REMOVE_FROM_FAVOURITES_MSG)); + } else { + starBtn.setIconSclass(Z_ICON_STAR_O); + starBtn.setTooltiptext(Msg.getMsg(Env.getCtx(), ADD_TO_FAVOURITES_MSG)); + } + cell.appendChild(starBtn); + starBtn.addEventListener(Events.ON_CLICK, MenuSearchController.this); + } + } } } diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/apps/ProcessModalDialog.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/apps/ProcessModalDialog.java index 182800d101..a68116e8a2 100644 --- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/apps/ProcessModalDialog.java +++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/apps/ProcessModalDialog.java @@ -18,14 +18,16 @@ package org.adempiere.webui.apps; import java.util.logging.Level; +import org.adempiere.webui.ClientInfo; import org.adempiere.webui.LayoutUtils; import org.adempiere.webui.component.Window; import org.adempiere.webui.event.DialogEvents; -import org.adempiere.webui.session.SessionManager; +import org.adempiere.webui.util.ZKUpdateUtil; import org.compiere.process.ProcessInfo; import org.compiere.util.CLogger; import org.compiere.util.Env; import org.zkoss.zk.ui.Component; +import org.zkoss.zk.ui.HtmlBasedComponent; import org.zkoss.zk.ui.event.Event; import org.zkoss.zk.ui.event.EventListener; @@ -49,6 +51,7 @@ public class ProcessModalDialog extends AbstractProcessDialog implements EventLi /** Logger */ private static CLogger log = CLogger.getCLogger(ProcessModalDialog.class); // + private String orientation; /** * @param aProcess @@ -82,8 +85,28 @@ public class ProcessModalDialog extends AbstractProcessDialog implements EventLi { init(Env.getCtx(), WindowNo, pi.getAD_Process_ID(), pi, autoStart, true); if (mainParameterLayout != null)// when auto start it's null - mainParameterLayout.setStyle("max-height:" + (SessionManager.getAppDesktop().getClientInfo().desktopHeight - 150) + "px"); - this.setSclass("popup-dialog"); + { + mainParameterLayout.setStyle("max-height:" + ClientInfo.get().desktopHeight + "px"); + ZKUpdateUtil.setVflex(mainParameterLayout, "min"); + } + if (topParameterLayout != null) + { + topParameterLayout.setStyle("max-height:" + (ClientInfo.get().desktopHeight-130) + "px"); + } + if (bottomParameterLayout != null) + { + for(Component c : bottomParameterLayout.getChildren()) + { + if (c instanceof HtmlBasedComponent) + ZKUpdateUtil.setVflex((HtmlBasedComponent) c, "min"); + } + } + this.setSclass("popup-dialog process-modal-dialog"); + if (ClientInfo.isMobile()) + { + orientation = ClientInfo.get().orientation; + ClientInfo.onClientInfo(this, this::onClientInfo); + } } catch(Exception ex) { @@ -183,5 +206,23 @@ public class ProcessModalDialog extends AbstractProcessDialog implements EventLi }else { super.onEvent(event); } - } + } + + protected void onClientInfo() { + if (getPage() != null) { + String newOrientation = ClientInfo.get().orientation; + if (!newOrientation.equals(orientation)) { + orientation = newOrientation; + if (mainParameterLayout != null)// when auto start it's null + { + mainParameterLayout.setStyle("max-height:" + ClientInfo.get().desktopHeight + "px"); + } + if (topParameterLayout != null) + { + topParameterLayout.setStyle("max-height:" + (ClientInfo.get().desktopHeight-130) + "px"); + } + this.invalidate(); + } + } + } } // ProcessModalDialog diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/apps/ProcessParameterPanel.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/apps/ProcessParameterPanel.java index f5da8c2809..8ed12df463 100644 --- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/apps/ProcessParameterPanel.java +++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/apps/ProcessParameterPanel.java @@ -62,8 +62,9 @@ import org.zkoss.zk.ui.event.Event; import org.zkoss.zk.ui.event.EventListener; import org.zkoss.zk.ui.event.Events; import org.zkoss.zul.Div; -import org.zkoss.zul.Hbox; import org.zkoss.zul.Label; +import org.zkoss.zul.Space; +import org.zkoss.zul.impl.InputElement; import org.zkoss.zul.impl.XulElement; /** @@ -131,7 +132,7 @@ public class ProcessParameterPanel extends Panel implements // ranges private ArrayList m_mFields = new ArrayList(); private ArrayList m_mFields2 = new ArrayList(); - private ArrayList