package ro.nextreports.server.web.analysis; import java.util.List; import java.util.Map; import java.util.UUID; import org.apache.wicket.AttributeModifier; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.ajax.markup.html.AjaxLink; import org.apache.wicket.extensions.ajax.markup.html.modal.ModalWindow; import org.apache.wicket.extensions.ajax.markup.html.modal.ModalWindow.WindowClosedCallback; import org.apache.wicket.markup.html.WebMarkupContainer; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.image.ContextImage; import org.apache.wicket.markup.html.list.ListItem; import org.apache.wicket.markup.html.list.ListView; import org.apache.wicket.markup.html.panel.Fragment; import org.apache.wicket.markup.html.panel.Panel; import org.apache.wicket.model.IModel; import org.apache.wicket.model.LoadableDetachableModel; import org.apache.wicket.model.Model; import org.apache.wicket.spring.injection.annot.SpringBean; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import ro.nextreports.server.domain.Analysis; import ro.nextreports.server.domain.Link; import ro.nextreports.server.exception.NotFoundException; import ro.nextreports.server.service.AnalysisService; import ro.nextreports.server.service.StorageService; import ro.nextreports.server.web.NextServerSession; import ro.nextreports.server.web.analysis.model.AnalysisAndLinksModel; import ro.nextreports.server.web.analysis.model.SelectedAnalysisModel; import ro.nextreports.server.web.common.behavior.SimpleTooltipBehavior; import ro.nextreports.server.web.common.form.FormPanel; import ro.nextreports.server.web.core.BasePage; import ro.nextreports.server.web.core.section.SectionContext; import ro.nextreports.server.web.core.section.SectionContextConstants; import ro.nextreports.server.web.security.SecurityUtil; public class AnalysisNavigationPanel extends Panel { private static final Logger LOG = LoggerFactory.getLogger(AnalysisNavigationPanel.class); @SpringBean private AnalysisService analysisService; @SpringBean private StorageService storageService; private String addedId = null; public AnalysisNavigationPanel(String id) { super(id); setOutputMarkupPlaceholderTag(true); addToolbar(); WebMarkupContainer container = new WebMarkupContainer("navigation"); ListView<Object> listView = new ListView<Object>("analysisList", new AnalysisAndLinksModel()) { private static final long serialVersionUID = 1L; @Override protected void populateItem(ListItem<Object> item) { Tab tab = new Tab("analysis", item.getModel(), item.getIndex()); item.add(tab); item.add(new AnalysisActionPanel("actions", item.getModel())); Object analysis = item.getModelObject(); String analysisId = getAnalysisId(analysis); if (getSelectedAnalysisId().equals(analysisId)) { item.add(AttributeModifier.append("class", "selected")); } item.setOutputMarkupId(true); } }; listView.setOutputMarkupId(true); container.add(listView); add(container); // we select default analysis only at first login, then we may select other analysis // and we want that analysis to remain selected when we move between UI tabs SectionContext sectionContext = NextServerSession.get().getSectionContext(AnalysisSection.ID); if (sectionContext.getData().get(SectionContextConstants.SELECTED_ANALYSIS_ID) == null) { String analysisId = ""; List<Object> analysis = listView.getModelObject(); if (analysis.size() > 0) { analysisId = getAnalysisId(analysis.get(0)); sectionContext.getData().put(SectionContextConstants.SELECTED_ANALYSIS_ID, analysisId); } } } private void addToolbar() { add(new AjaxLink<Void>("addAnalysis") { private static final long serialVersionUID = 1L; @Override public void onClick(AjaxRequestTarget target) { final ModalWindow dialog = findParent(BasePage.class).getDialog(); dialog.setTitle(getString("AnalysisNavigationPanel.add")); dialog.setInitialWidth(350); dialog.setUseInitialHeight(false); final AddAnalysisPanel panel = new AddAnalysisPanel() { @Override public void onOk(AjaxRequestTarget target) { Analysis analysis = new Analysis(); analysis.setName("Analysis " + UUID.randomUUID()); analysis.setTableName(SecurityUtil.getLoggedUsername()+"-"+getSelectedTable()); String path = analysisService.getAnalysisPath(analysis, SecurityUtil.getLoggedUsername()); analysis.setPath(path); analysis.setRowsPerPage(20); addedId = analysisService.addAnalysis(analysis); dialog.close(target); } }; dialog.setContent(new FormPanel<Void>(dialog.getContentId(), panel, true) { private static final long serialVersionUID = 1L; @Override protected void onConfigure() { super.onConfigure(); setOkButtonValue(getString("add")); } }); dialog.setWindowClosedCallback(new WindowClosedCallback() { @Override public void onClose(AjaxRequestTarget target) { if (addedId != null) { AnalysisBrowserPanel browserPanel = findParent(AnalysisBrowserPanel.class); SectionContext sectionContext = NextServerSession.get().getSectionContext(AnalysisSection.ID); sectionContext.getData().put(SectionContextConstants.SELECTED_ANALYSIS_ID, addedId); browserPanel.getAnalysisPanel().changeDataProvider(new SelectedAnalysisModel(), target); target.add(browserPanel); addedId = null; } } }); dialog.show(target); } }); } class Tab extends Fragment { private static final long serialVersionUID = 1L; public Tab(String id, final IModel<Object> model, int index) { super(id, "tab", AnalysisNavigationPanel.this); setOutputMarkupId(true); final Object analysis = model.getObject(); add(createTitleLink(analysis, index)); } } private AjaxLink createTitleLink(final Object analysis, int index) { String title = getTitle(analysis); AjaxLink<Void> titleLink = new AjaxLink<Void>("titleLink") { private static final long serialVersionUID = 1L; @Override public void onClick(AjaxRequestTarget target) { SectionContext sectionContext = NextServerSession.get().getSectionContext(AnalysisSection.ID); sectionContext.getData().put(SectionContextConstants.SELECTED_ANALYSIS_ID, getAnalysisId(analysis)); AnalysisBrowserPanel browserPanel = findParent(AnalysisBrowserPanel.class); Analysis a = null; if (isLink(analysis)) { try { a = (Analysis)storageService.getEntityById(getAnalysisId(analysis)); } catch (NotFoundException e) { e.printStackTrace(); LOG.error(e.getMessage(),e); } } else { a = (Analysis)analysis; } browserPanel.getAnalysisPanel().changeDataProvider(new Model<Analysis>(a), target); target.add(browserPanel); } }; IModel<String> linkImageModel = new LoadableDetachableModel<String>() { private static final long serialVersionUID = 1L; @Override protected String load() { String imagePath = "images/analysis.png"; if (isLink(analysis)) { imagePath = "images/analysis_link.png"; } else if (((Analysis)analysis).isFreezed()) { imagePath = "images/analysis_freeze.png"; } return imagePath; } }; final ContextImage link = new ContextImage("titleImage", linkImageModel); titleLink.add(link); titleLink.add(new Label("title", title)); titleLink.add(new SimpleTooltipBehavior(getTitle(analysis))); return titleLink; } private String getSelectedAnalysisId() { SectionContext sectionContext = NextServerSession.get().getSectionContext(AnalysisSection.ID); String result = sectionContext.getData().getString(SectionContextConstants.SELECTED_ANALYSIS_ID); if (result == null) { result = ""; } return result; } @Override public boolean isVisible() { Map<String, String> preferences = NextServerSession.get().getPreferences(); if (!preferences.containsKey("analysis.navigationToggle")) { return true; } return Boolean.parseBoolean(preferences.get("analysis.navigationToggle")); } private String getAnalysisId(Object object) { if (isLink(object)) { return ((Link) object).getReference(); } return ((Analysis) object).getId(); } private String getTitle(Object object) { String title; if (isLink(object)) { title = ((Link) object).getName(); } else { title = ((Analysis) object).getName(); } // TODO i18n maybe for DashboardService.MY_DASHBOARD_NAME return title; } private boolean isLink(Object object) { return (object instanceof Link); } }