diff --git a/migration/iD10/oracle/202203161513_IDEMPIERE-5225.sql b/migration/iD10/oracle/202203161513_IDEMPIERE-5225.sql
new file mode 100644
index 0000000000..62b0e070a6
--- /dev/null
+++ b/migration/iD10/oracle/202203161513_IDEMPIERE-5225.sql
@@ -0,0 +1,10 @@
+-- IDEMPIERE-5225
+SELECT register_migration_script('202203161513_IDEMPIERE-5225.sql') FROM dual;
+
+SET SQLBLANKLINES ON
+SET DEFINE OFF
+
+-- Mar 16, 2022, 3:13:31 PM CET
+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 (200197,0,0,TO_TIMESTAMP('2022-03-16 15:13:30','YYYY-MM-DD HH24:MI:SS'),TO_TIMESTAMP('2022-03-16 15:13:30','YYYY-MM-DD HH24:MI:SS'),100,100,'Y','HTML_REPORT_MINIFY','Y','Enable/disable minification on HTML Reports','D','C','9f3e162c-653e-4f45-9b1c-8151caf0945e')
+;
+
diff --git a/migration/iD10/postgresql/202203161513_IDEMPIERE-5225.sql b/migration/iD10/postgresql/202203161513_IDEMPIERE-5225.sql
new file mode 100644
index 0000000000..14ba0b7e72
--- /dev/null
+++ b/migration/iD10/postgresql/202203161513_IDEMPIERE-5225.sql
@@ -0,0 +1,7 @@
+-- IDEMPIERE-5225
+SELECT register_migration_script('202203161513_IDEMPIERE-5225.sql') FROM dual;
+
+-- Mar 16, 2022, 3:13:31 PM CET
+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 (200197,0,0,TO_TIMESTAMP('2022-03-16 15:13:30','YYYY-MM-DD HH24:MI:SS'),TO_TIMESTAMP('2022-03-16 15:13:30','YYYY-MM-DD HH24:MI:SS'),100,100,'Y','HTML_REPORT_MINIFY','Y','Enable/disable minification on HTML Reports','D','C','9f3e162c-653e-4f45-9b1c-8151caf0945e')
+;
+
diff --git a/org.adempiere.base/META-INF/MANIFEST.MF b/org.adempiere.base/META-INF/MANIFEST.MF
index 7ab830a2f6..eb4864a4a2 100644
--- a/org.adempiere.base/META-INF/MANIFEST.MF
+++ b/org.adempiere.base/META-INF/MANIFEST.MF
@@ -7,7 +7,9 @@ Bundle-ClassPath: .,
lib/bsh.jar,
lib/commons-validator.jar,
lib/cron4j.jar,
- lib/avalon-framework-api.jar
+ lib/avalon-framework-api.jar,
+ lib/htmlcompressor.jar,
+ lib/yuicompressor.jar
Export-Package: bsh,
bsh.classpath,
bsh.collection,
diff --git a/org.adempiere.base/build.properties b/org.adempiere.base/build.properties
index 3efca01f4c..64a18fa1a6 100644
--- a/org.adempiere.base/build.properties
+++ b/org.adempiere.base/build.properties
@@ -6,7 +6,9 @@ bin.includes = plugin.xml,\
lib/avalon-framework-api.jar,\
lib/bsh.jar,\
lib/commons-validator.jar,\
- lib/cron4j.jar
+ lib/cron4j.jar,\
+ lib/htmlcompressor.jar,\
+ lib/yuicompressor.jar
src.includes = schema/
source.. = src/
output.. = target/classes/
diff --git a/org.adempiere.base/pom.xml b/org.adempiere.base/pom.xml
index e22b69cd11..1c4c6c50e9 100644
--- a/org.adempiere.base/pom.xml
+++ b/org.adempiere.base/pom.xml
@@ -43,6 +43,16 @@
avalon-framework-api
4.3.1
+
+ com.googlecode.htmlcompressor
+ htmlcompressor
+ 1.5.2
+
+
+ com.yahoo.platform.yui
+ yuicompressor
+ 2.4.8
+
lib
true
diff --git a/org.adempiere.base/src/org/compiere/model/MSysConfig.java b/org.adempiere.base/src/org/compiere/model/MSysConfig.java
index eb6ac7ad73..5f4fc717c9 100644
--- a/org.adempiere.base/src/org/compiere/model/MSysConfig.java
+++ b/org.adempiere.base/src/org/compiere/model/MSysConfig.java
@@ -101,6 +101,7 @@ public class MSysConfig extends X_AD_SysConfig
public static final String FEEDBACK_EMAIL_CC = "FEEDBACK_EMAIL_CC";
public static final String FEEDBACK_EMAIL_TO = "FEEDBACK_EMAIL_TO";
public static final String GRIDTABLE_LOAD_TIMEOUT_IN_SECONDS = "GRIDTABLE_LOAD_TIMEOUT_IN_SECONDS";
+ public static final String HTML_REPORT_MINIFY = "HTML_REPORT_MINIFY";
public static final String HTML_REPORT_THEME = "HTML_REPORT_THEME";
public static final String IBAN_VALIDATION = "IBAN_VALIDATION";
public static final String IDENTIFIER_SEPARATOR = "IDENTIFIER_SEPARATOR";
diff --git a/org.adempiere.base/src/org/compiere/print/ReportEngine.java b/org.adempiere.base/src/org/compiere/print/ReportEngine.java
index e8d86dab3b..e71eb4a828 100644
--- a/org.adempiere.base/src/org/compiere/print/ReportEngine.java
+++ b/org.adempiere.base/src/org/compiere/print/ReportEngine.java
@@ -113,6 +113,8 @@ import org.compiere.util.Util;
import org.eevolution.model.MDDOrder;
import org.eevolution.model.X_PP_Order;
+import com.googlecode.htmlcompressor.compressor.HtmlCompressor;
+
/**
* Report Engine.
* For a given PrintFormat,
@@ -695,9 +697,10 @@ queued-job-count = 0 (class javax.print.attribute.standard.QueuedJobCount)
table.setNeedClosingTag(false);
PrintWriter w = new PrintWriter(writer);
XhtmlDocument doc = null;
-
+ boolean minify = MSysConfig.getBooleanValue(MSysConfig.HTML_REPORT_MINIFY, true, Env.getAD_Client_ID(getCtx()));
+
if (onlyTable)
- table.output(w);
+ w.print(compress(table.toString(), minify));
else
{
doc = new XhtmlDocument();
@@ -784,15 +787,15 @@ queued-job-count = 0 (class javax.print.attribute.standard.QueuedJobCount)
styleBuild = new StringBuilder(styleBuild.toString().replaceAll(";", "!important;"));
appendInlineCss (doc, styleBuild);
-
- doc.output(w);
- w.println("
");
+ w.print(compress(doc.toString(), minify));
+
+ w.print("
");
String paraWrapId = null;
if (parameterTable != null) {
paraWrapId = cssPrefix + "-para-table-wrap";
- w.println("
");
- parameterTable.output(w);
+ w.print("
");
+ w.print(compress(parameterTable.toString(), minify));
tr tr = new tr();
tr.setClass("tr-parameter");
@@ -825,12 +828,11 @@ queued-job-count = 0 (class javax.print.attribute.standard.QueuedJobCount)
tr.addElement(td);
td.addElement(query.getInfoDisplayAll(r));
- tr.output(w);
+ w.print(compress(tr.toString(), minify));
}
-
- w.println();
- w.println("");
- w.println("
");
+
+ w.print("");
+ w.print("
");
}
StringBuilder tableWrapDiv = new StringBuilder();
@@ -842,8 +844,8 @@ queued-job-count = 0 (class javax.print.attribute.standard.QueuedJobCount)
}
tableWrapDiv.append(" >");
- w.println(tableWrapDiv.toString());
- table.output(w);
+ w.print(compress(tableWrapDiv.toString(), minify));
+ w.print(compress(table.toString(), minify));
}
thead thead = new thead();
@@ -1089,19 +1091,18 @@ queued-job-count = 0 (class javax.print.attribute.standard.QueuedJobCount)
/* output table header */
if (row == -1){
- thead.output(w);
+ w.print(compress(thead.toString(), minify));
// output open of tbody
- tbody.output(w);
+ w.print(compress(tbody.toString(), minify));
}else{
// output row by row
- tr.output(w);
+ w.print(compress(tr.toString(), minify));
}
} // for all rows
- w.println();
- w.println("");
- w.println("");
+ w.print("");
+ w.print("");
if (suppressMap.size() > 0)
{
StringBuilder st = new StringBuilder();
@@ -1114,15 +1115,14 @@ queued-job-count = 0 (class javax.print.attribute.standard.QueuedJobCount)
st.append(" {\n\t\tdisplay:none;\n\t}");
style styleTag = new style();
styleTag.addElement(st.toString());
- styleTag.output(w);
- w.println();
+ w.print(compress(styleTag.toString(), minify));
}
if (!onlyTable)
{
- w.println("
");
- w.println("
");
- w.println("