diff --git a/migration/iD11/oracle/202304141228_IDEMPIERE-5669.sql b/migration/iD11/oracle/202304141228_IDEMPIERE-5669.sql
new file mode 100644
index 0000000000..9ac826550e
--- /dev/null
+++ b/migration/iD11/oracle/202304141228_IDEMPIERE-5669.sql
@@ -0,0 +1,10 @@
+-- IDEMPIERE-5669
+SELECT register_migration_script('202304141228_IDEMPIERE-5669.sql') FROM dual;
+
+SET SQLBLANKLINES ON
+SET DEFINE OFF
+
+-- Apr 14, 2023, 12:28:05 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','Row count: {0}',0,0,'Y',TO_TIMESTAMP('2023-04-14 12:28:05','YYYY-MM-DD HH24:MI:SS'),100,TO_TIMESTAMP('2023-04-14 12:28:05','YYYY-MM-DD HH24:MI:SS'),100,200833,'RowCount','D','50409fb4-405e-4370-8256-c15a56204c45')
+;
+
diff --git a/migration/iD11/postgresql/202304141228_IDEMPIERE-5669.sql b/migration/iD11/postgresql/202304141228_IDEMPIERE-5669.sql
new file mode 100644
index 0000000000..339d57ceb1
--- /dev/null
+++ b/migration/iD11/postgresql/202304141228_IDEMPIERE-5669.sql
@@ -0,0 +1,7 @@
+-- IDEMPIERE-5669
+SELECT register_migration_script('202304141228_IDEMPIERE-5669.sql') FROM dual;
+
+-- Apr 14, 2023, 12:28:05 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','Row count: {0}',0,0,'Y',TO_TIMESTAMP('2023-04-14 12:28:05','YYYY-MM-DD HH24:MI:SS'),100,TO_TIMESTAMP('2023-04-14 12:28:05','YYYY-MM-DD HH24:MI:SS'),100,200833,'RowCount','D','50409fb4-405e-4370-8256-c15a56204c45')
+;
+
diff --git a/org.adempiere.ui.zk/WEB-INF/src/metainfo/zk/lang-addon.xml b/org.adempiere.ui.zk/WEB-INF/src/metainfo/zk/lang-addon.xml
index 35b034de1d..ff4a87316b 100644
--- a/org.adempiere.ui.zk/WEB-INF/src/metainfo/zk/lang-addon.xml
+++ b/org.adempiere.ui.zk/WEB-INF/src/metainfo/zk/lang-addon.xml
@@ -57,6 +57,6 @@ Copyright (C) 2007 Ashley G Ramdass (ADempiere WebUI).
-
+
diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/desktop/DashboardController.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/desktop/DashboardController.java
index 78c9ea09ef..624d7343cf 100644
--- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/desktop/DashboardController.java
+++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/desktop/DashboardController.java
@@ -46,6 +46,7 @@ import org.adempiere.webui.apps.graph.WPAWidget;
import org.adempiere.webui.apps.graph.WPerformanceDetail;
import org.adempiere.webui.apps.graph.WPerformanceIndicator;
import org.adempiere.webui.apps.graph.model.ChartModel;
+import org.adempiere.webui.component.Label;
import org.adempiere.webui.component.ToolBarButton;
import org.adempiere.webui.dashboard.DashboardPanel;
import org.adempiere.webui.dashboard.DashboardRunnable;
@@ -827,7 +828,8 @@ public class DashboardController implements EventListener {
{
addDrillAcrossEventListener(AD_Process_ID, parentComponent);
String processParameters = dashboardContent.getProcessParameters();
-
+ ReportData reportData = generateReport(AD_Process_ID, dashboardContent.getAD_PrintFormat_ID(), processParameters, parentComponent, contextPath);
+
Div layout = new Div();
layout.setHeight("100%");
layout.setStyle("display: flex;flex-direction: column;");
@@ -835,13 +837,14 @@ public class DashboardController implements EventListener {
Iframe iframe = new Iframe();
iframe.setSclass("dashboard-report-iframe");
iframe.setStyle("flex-grow: 1;");
- iframe.setContent(generateReport(AD_Process_ID, dashboardContent.getAD_PrintFormat_ID(), processParameters, parentComponent, contextPath));
+ iframe.setContent(reportData.getContent());
if(iframe.getContent() != null)
layout.appendChild(iframe);
else
layout.appendChild(createFillMandatoryLabel(dashboardContent));
Toolbar toolbar = new Toolbar();
+ LayoutUtils.addSclass("dashboard-report-toolbar", toolbar);
layout.appendChild(toolbar);
btn.setLabel(Msg.getMsg(Env.getCtx(), "OpenRunDialog"));
toolbar.appendChild(btn);
@@ -863,9 +866,18 @@ public class DashboardController implements EventListener {
}
else
btn.setImage(ThemeManager.getThemeResource("images/Refresh16.png"));
-
- btn.addEventListener(Events.ON_CLICK, e -> iframe.setContent(generateReport(AD_Process_ID, dashboardContent.getAD_PrintFormat_ID(), processParameters, parentComponent, contextPath)));
- toolbar.appendChild(btn);
+
+ toolbar.appendChild(btn);
+
+ Label rowCountLabel = new Label(Msg.getMsg(Env.getCtx(), "RowCount", new Object[] {reportData.getRowCount()}));
+ LayoutUtils.addSclass("rowcount-label", rowCountLabel);
+ toolbar.appendChild(rowCountLabel);
+
+ btn.addEventListener(Events.ON_CLICK, e -> {
+ ReportData refreshedData = generateReport(AD_Process_ID, dashboardContent.getAD_PrintFormat_ID(), processParameters, parentComponent, contextPath);
+ iframe.setContent(refreshedData.getContent());
+ rowCountLabel.setValue(Msg.getMsg(Env.getCtx(), "RowCount", new Object[] {refreshedData.getRowCount()}));
+ });
}
else
{
@@ -1635,14 +1647,14 @@ public class DashboardController implements EventListener {
* @return {@link AMedia}
* @throws Exception
*/
- private AMedia generateReport(int AD_Process_ID, int AD_PrintFormat_ID, String parameters, Component component, String contextPath) throws Exception {
+ private ReportData generateReport(int AD_Process_ID, int AD_PrintFormat_ID, String parameters, Component component, String contextPath) throws Exception {
ReportEngine re = runReport(AD_Process_ID, AD_PrintFormat_ID, parameters);
if(re == null)
return null;
File file = FileUtil.createTempFile(re.getName(), ".html");
re.createHTML(file, false, AEnv.getLanguage(Env.getCtx()), new HTMLExtension(contextPath, "rp",
component.getUuid(), String.valueOf(AD_Process_ID)));
- return new AMedia(re.getName(), "html", "text/html", file, false);
+ return new ReportData(new AMedia(re.getName(), "html", "text/html", file, false), re);
}
/**
@@ -1926,4 +1938,41 @@ public class DashboardController implements EventListener {
break;
}
}
+
+ /**
+ * Holds information about the report: Report Content, Row Count
+ */
+ public class ReportData {
+ /** Report content */
+ private AMedia content;
+ /** Report Row Count */
+ private int rowCount = 0;
+
+ /**
+ * Constructor
+ * @param content
+ * @param rowCount
+ */
+ public ReportData(AMedia content, ReportEngine reportEngine) {
+ this.content = content;
+ if(reportEngine.getPrintData() != null)
+ this.rowCount = reportEngine.getPrintData().getRowCount();
+ }
+
+ /**
+ * Get report content
+ * @return AMedia content
+ */
+ public AMedia getContent() {
+ return content;
+ }
+
+ /**
+ * Get report row count
+ * @return int row count
+ */
+ public int getRowCount() {
+ return rowCount;
+ }
+ }
}
diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/window/ZkReportViewer.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/window/ZkReportViewer.java
index 46a6980022..8b725ed09b 100644
--- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/window/ZkReportViewer.java
+++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/window/ZkReportViewer.java
@@ -47,6 +47,7 @@ import org.adempiere.webui.apps.ProcessModalDialog;
import org.adempiere.webui.apps.WReport;
import org.adempiere.webui.apps.form.WReportCustomization;
import org.adempiere.webui.component.Checkbox;
+import org.adempiere.webui.component.Label;
import org.adempiere.webui.component.ListItem;
import org.adempiere.webui.component.Listbox;
import org.adempiere.webui.component.Mask;
@@ -781,9 +782,15 @@ public class ZkReportViewer extends Window implements EventListener, IRep
reportLink = new A();
reportLink.setTarget("_blank");
Div linkDiv = new Div();
- linkDiv.setStyle("width:100%; height: 40px; padding-top: 4px; padding-bottom: 4px;");
+ linkDiv.setStyle("width:100%; height: 40px; padding: 4px;");
linkDiv.appendChild(reportLink);
- south.appendChild(linkDiv);
+
+ Label rowCount = new Label(Msg.getMsg(m_ctx, "RowCount", new Object[] {m_reportEngine.getPrintData().getRowCount()}));
+ rowCount.setStyle("float: right;");
+ linkDiv.appendChild(rowCount);
+
+ south.appendChild(linkDiv);
+
//m_WindowNo
int AD_Window_ID = Env.getContextAsInt(Env.getCtx(), m_reportEngine.getWindowNo(), "_WinInfo_AD_Window_ID", true);
if (AD_Window_ID == 0)
diff --git a/org.adempiere.ui.zk/WEB-INF/src/web/theme/default/css/fragment/gadget.css.dsp b/org.adempiere.ui.zk/WEB-INF/src/web/theme/default/css/fragment/gadget.css.dsp
index 193a6548eb..7ed7391113 100644
--- a/org.adempiere.ui.zk/WEB-INF/src/web/theme/default/css/fragment/gadget.css.dsp
+++ b/org.adempiere.ui.zk/WEB-INF/src/web/theme/default/css/fragment/gadget.css.dsp
@@ -133,6 +133,16 @@
display: inline-flex;
align-items: center;
}
+
+.dashboard-report-toolbar .z-toolbar-content {
+ display: block;
+}
+
+.dashboard-report-toolbar .rowcount-label {
+ float: right;
+ padding: 5px;
+}
+
.recentitems-box .trash-toolbarbutton .z-toolbarbutton-content {
font-size: 16px;
}