package org.activityinfo.ui.client.page.dashboard.portlets; /* * #%L * ActivityInfo Server * %% * Copyright (C) 2009 - 2013 UNICEF * %% * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * <http://www.gnu.org/licenses/gpl-3.0.html>. * #L% */ import com.extjs.gxt.ui.client.event.IconButtonEvent; import com.extjs.gxt.ui.client.event.Listener; import com.extjs.gxt.ui.client.event.MenuEvent; import com.extjs.gxt.ui.client.event.MessageBoxEvent; import com.extjs.gxt.ui.client.event.SelectionListener; import com.extjs.gxt.ui.client.widget.Dialog; import com.extjs.gxt.ui.client.widget.Label; import com.extjs.gxt.ui.client.widget.MessageBox; import com.extjs.gxt.ui.client.widget.button.ToolButton; import com.extjs.gxt.ui.client.widget.custom.Portlet; import com.extjs.gxt.ui.client.widget.layout.FitLayout; import com.extjs.gxt.ui.client.widget.menu.Menu; import com.extjs.gxt.ui.client.widget.menu.MenuItem; import com.google.gwt.user.client.rpc.AsyncCallback; import org.activityinfo.i18n.shared.I18N; import org.activityinfo.legacy.client.Dispatcher; import org.activityinfo.legacy.shared.Log; import org.activityinfo.legacy.shared.command.GenerateElement; import org.activityinfo.legacy.shared.command.UpdateReportSubscription; import org.activityinfo.legacy.shared.command.result.VoidResult; import org.activityinfo.legacy.shared.model.ReportDTO; import org.activityinfo.legacy.shared.model.ReportMetadataDTO; import org.activityinfo.legacy.shared.reports.content.Content; import org.activityinfo.legacy.shared.reports.model.MapReportElement; import org.activityinfo.legacy.shared.reports.model.PivotChartReportElement; import org.activityinfo.legacy.shared.reports.model.PivotTableReportElement; import org.activityinfo.legacy.shared.reports.model.Report; import org.activityinfo.legacy.shared.reports.model.ReportElement; import org.activityinfo.ui.client.EventBus; import org.activityinfo.ui.client.component.report.view.ChartOFCView; import org.activityinfo.ui.client.component.report.view.MapReportView; import org.activityinfo.ui.client.component.report.view.PivotGridPanel; import org.activityinfo.ui.client.component.report.view.ReportView; import org.activityinfo.ui.client.page.NavigationEvent; import org.activityinfo.ui.client.page.NavigationHandler; import org.activityinfo.ui.client.page.report.ReportDesignPageState; import org.activityinfo.ui.client.style.legacy.icon.IconImageBundle; public class ReportPortlet extends Portlet { private final Dispatcher dispatcher; private final EventBus eventBus; private final ReportDTO report; private final ReportMetadataDTO metadata; public ReportPortlet(Dispatcher dispatcher, EventBus eventBus, ReportDTO report) { this.dispatcher = dispatcher; this.eventBus = eventBus; this.report = report; this.metadata = report.getReportMetadataDTO(); setHeadingText(metadata.getTitle()); setHeight(275); setLayout(new FitLayout()); addOptionsMenu(); addCloseButton(); add(new Label(I18N.CONSTANTS.loading())); addContent(); } private void addOptionsMenu() { final Menu optionsMenu = new Menu(); optionsMenu.add(new MenuItem(I18N.CONSTANTS.edit(), IconImageBundle.ICONS.edit(), new SelectionListener<MenuEvent>() { @Override public void componentSelected(MenuEvent ce) { edit(); } })); optionsMenu.add(new MenuItem(I18N.CONSTANTS.removeFromDashboard(), IconImageBundle.ICONS.remove(), new SelectionListener<MenuEvent>() { @Override public void componentSelected(MenuEvent ce) { removeFromDashboard(); } })); final ToolButton gear = new ToolButton("x-tool-gear", new SelectionListener<IconButtonEvent>() { @Override public void componentSelected(IconButtonEvent ce) { optionsMenu.show(ce.getComponent()); } }); getHeader().addTool(gear); } private void addCloseButton() { getHeader().addTool(new ToolButton("x-tool-close", new SelectionListener<IconButtonEvent>() { @Override public void componentSelected(IconButtonEvent ce) { removeFromDashboard(); } })); getHeader().addTool(new ToolButton("x-tool-maximize", new SelectionListener<IconButtonEvent>() { @Override public void componentSelected(IconButtonEvent ce) { edit(); } })); } private void addContent() { Report report = this.report.getReport(); if (report.getElements().isEmpty()) { removeAll(); add(new Label("The report is empty")); return; } final ReportElement element = report.getElement(0); final ReportView view = createView(element); if (view == null) { removeAll(); add(new Label("Unsupported report type")); layout(); return; } dispatcher.execute(new GenerateElement<Content>(element), new AsyncCallback<Content>() { @Override public void onFailure(Throwable caught) { Log.error(caught.getMessage(), caught); } @Override public void onSuccess(Content content) { removeAll(); element.setContent(content); view.show(element); add(view.asComponent()); layout(); } }); } private ReportView createView(ReportElement element) { if (element instanceof PivotChartReportElement) { return new ChartOFCView(); } else if (element instanceof PivotTableReportElement) { PivotGridPanel gridPanel = new PivotGridPanel(dispatcher); gridPanel.setHeaderVisible(false); return gridPanel; } else if (element instanceof MapReportElement) { return new MapReportView(); } else { return null; } } private void edit() { eventBus.fireEvent(new NavigationEvent(NavigationHandler.NAVIGATION_REQUESTED, new ReportDesignPageState(metadata.getId()))); } private void removeFromDashboard() { MessageBox.confirm(metadata.getTitle(), I18N.CONSTANTS.confirmRemoveFromDashboard(), new Listener<MessageBoxEvent>() { @Override public void handleEvent(MessageBoxEvent be) { if (be.getButtonClicked().getItemId().equals(Dialog.YES)) { UpdateReportSubscription update = new UpdateReportSubscription(); update.setReportId(metadata.getId()); update.setPinnedToDashboard(false); dispatcher.execute(update, new AsyncCallback<VoidResult>() { @Override public void onFailure(Throwable caught) { // TODO Auto-generated method stub } @Override public void onSuccess(VoidResult result) { removeFromParent(); } }); } } }); } }