IDEMPIERE-5527 Implement asynchronous rendering of dashboard gadget p… (#1641)
* IDEMPIERE-5527 Implement asynchronous rendering of dashboard gadget panel - Auto refresh in background thread instead of UI thread * IDEMPIERE-5527 Implement asynchronous rendering of dashboard gadget panel - status line error reported by Peter Takacs * IDEMPIERE-5527 Implement asynchronous rendering of dashboard gadget panel - fix performance goal error reported by Peter Takacs
This commit is contained in:
parent
f2684bad08
commit
0aec0cf450
|
@ -20,9 +20,12 @@ import java.util.List;
|
|||
import java.util.Locale;
|
||||
import java.util.Properties;
|
||||
|
||||
import org.adempiere.util.ContextRunnable;
|
||||
import org.adempiere.util.ServerContext;
|
||||
import org.adempiere.webui.apps.BusyDialog;
|
||||
import org.adempiere.webui.session.SessionContextListener;
|
||||
import org.adempiere.webui.util.ServerPushTemplate;
|
||||
import org.compiere.Adempiere;
|
||||
import org.compiere.util.CLogger;
|
||||
import org.zkoss.util.Locales;
|
||||
import org.zkoss.zk.ui.Desktop;
|
||||
|
@ -132,7 +135,20 @@ public class DashboardRunnable implements Runnable, Serializable
|
|||
if (pooling && !dashboardPanels.get(i).isPooling())
|
||||
continue;
|
||||
|
||||
dashboardPanels.get(i).refresh(template);
|
||||
final DashboardPanel dpanel = dashboardPanels.get(i);
|
||||
BusyDialog busyDialog = new BusyDialog();
|
||||
busyDialog.setShadow(false);
|
||||
dpanel.getParent().insertBefore(busyDialog, dpanel.getParent().getFirstChild());
|
||||
ContextRunnable cr = new ContextRunnable() {
|
||||
@Override
|
||||
protected void doRun() {
|
||||
dpanel.refresh(template);
|
||||
template.execute(() -> {
|
||||
busyDialog.detach();
|
||||
});
|
||||
}
|
||||
};
|
||||
Adempiere.getThreadPoolExecutor().submit(cr);
|
||||
}
|
||||
}
|
||||
finally
|
||||
|
|
|
@ -434,7 +434,7 @@ public class DashboardController implements EventListener<Event> {
|
|||
private void asyncRenderGadgetPanel(ServerPushTemplate spt, MDashboardContent dashboardContent, Panel panel, IDesktop appDesktop, String contextPath,
|
||||
Panelchildren panelChildren, Component zulComponent) throws Exception {
|
||||
List<Component> components = new ArrayList<>();
|
||||
asyncRenderComponents(dashboardContent, dashboardRunnable, appDesktop, contextPath, panelChildren, components, zulComponent);
|
||||
asyncRenderComponents(dashboardContent, dashboardRunnable, appDesktop, contextPath, panelChildren, components, zulComponent, spt);
|
||||
if (components.size() > 0) {
|
||||
for(Component c : components) {
|
||||
if (c.getParent() != panelChildren) {
|
||||
|
@ -686,10 +686,11 @@ public class DashboardController implements EventListener<Event> {
|
|||
* @param parentComponent
|
||||
* @param components
|
||||
* @param zulComponent
|
||||
* @param spt
|
||||
* @throws Exception
|
||||
*/
|
||||
private void asyncRenderComponents(MDashboardContent dashboardContent, DashboardRunnable dashboardRunnable, IDesktop appDesktop, String contextPath,
|
||||
HtmlBasedComponent parentComponent, List<Component> components, Component zulComponent) throws Exception {
|
||||
HtmlBasedComponent parentComponent, List<Component> components, Component zulComponent, ServerPushTemplate spt) throws Exception {
|
||||
// HTML content
|
||||
String htmlContent = dashboardContent.get_ID() > 0 ? dashboardContent.get_Translation(MDashboardContent.COLUMNNAME_HTML) : null;
|
||||
if(htmlContent != null)
|
||||
|
@ -810,7 +811,7 @@ public class DashboardController implements EventListener<Event> {
|
|||
options.colorMap.put(WPerformanceIndicator.DIAL_BACKGROUND, new Color(224, 224, 224, 1));
|
||||
WPAWidget paWidget = new WPAWidget(goal, options, dashboardContent.isShowTitle());
|
||||
components.add(paWidget);
|
||||
LayoutUtils.addSclass("performance-gadget", parentComponent);
|
||||
spt.executeAsync(() -> LayoutUtils.addSclass("performance-gadget", parentComponent));
|
||||
} else {
|
||||
//link to open performance detail
|
||||
Div div = new Div();
|
||||
|
@ -896,7 +897,7 @@ public class DashboardController implements EventListener<Event> {
|
|||
div.appendChild(statusLineHtml);
|
||||
div.setSclass("statusline-gadget");
|
||||
components.add(div);
|
||||
LayoutUtils.addSclass("statusline-wrapper", ((HtmlBasedComponent) parentComponent.getParent()));
|
||||
spt.executeAsync(() -> LayoutUtils.addSclass("statusline-wrapper", ((HtmlBasedComponent) parentComponent.getParent())));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -918,10 +919,11 @@ public class DashboardController implements EventListener<Event> {
|
|||
throw new AdempiereException(e);
|
||||
}
|
||||
}
|
||||
HtmlBasedComponent parentComponent = (HtmlBasedComponent) content;
|
||||
asyncRenderComponents(dashboardContent, dashboardRunnable, SessionManager.getAppDesktop(), Executions.getCurrent().getContextPath(), parentComponent, components, zulComponent);
|
||||
boolean empty = components.isEmpty();
|
||||
ServerPushTemplate spt = new ServerPushTemplate(content.getDesktop());
|
||||
HtmlBasedComponent parentComponent = (HtmlBasedComponent) content;
|
||||
asyncRenderComponents(dashboardContent, dashboardRunnable, SessionManager.getAppDesktop(), Executions.getCurrent().getContextPath(), parentComponent, components,
|
||||
zulComponent, spt);
|
||||
boolean empty = components.isEmpty();
|
||||
for(Component c : components) {
|
||||
if (c.getParent() != parentComponent) {
|
||||
parentComponent.appendChild(c);
|
||||
|
|
Loading…
Reference in New Issue