/** * $URL:$ * $Id:$ * * Copyright (c) 2006-2009 The Sakai Foundation * * Licensed under the Educational Community License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.opensource.org/licenses/ECL-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.sakaiproject.sitestats.tool.wicket.pages; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.wicket.AttributeModifier; import org.apache.wicket.PageParameters; import org.apache.wicket.markup.html.IHeaderResponse; import org.apache.wicket.markup.html.WebMarkupContainer; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.form.Form; import org.apache.wicket.markup.html.link.Link; import org.apache.wicket.markup.html.panel.Fragment; import org.apache.wicket.markup.repeater.Item; import org.apache.wicket.markup.repeater.data.DataView; import org.apache.wicket.model.CompoundPropertyModel; import org.apache.wicket.model.Model; import org.apache.wicket.model.ResourceModel; import org.apache.wicket.model.StringResourceModel; import org.sakaiproject.sitestats.api.StatsManager; import org.sakaiproject.sitestats.api.report.ReportDef; import org.sakaiproject.sitestats.tool.facade.Locator; import org.sakaiproject.sitestats.tool.wicket.components.CSSFeedbackPanel; import org.sakaiproject.sitestats.tool.wicket.components.LastJobRun; import org.sakaiproject.sitestats.tool.wicket.components.Menus; import org.sakaiproject.sitestats.tool.wicket.models.ReportDefModel; import org.sakaiproject.sitestats.tool.wicket.providers.ReportDefsProvider; public class ReportsPage extends BasePage { private static final long serialVersionUID = 1L; private static Log LOG = LogFactory.getLog(ReportsPage.class); private String realSiteId; private String siteId; public ReportsPage() { } public ReportsPage(PageParameters pageParameters) { realSiteId = Locator.getFacade().getToolManager().getCurrentPlacement().getContext(); if(pageParameters != null) { siteId = pageParameters.getString("siteId"); } if(siteId == null){ siteId = realSiteId; } boolean allowed = Locator.getFacade().getStatsAuthz().isUserAbleToViewSiteStats(siteId); if(allowed) { renderBody(); }else{ setResponsePage(NotAuthorizedPage.class); } } @Override public void renderHead(IHeaderResponse response) { super.renderHead(response); response.renderJavascriptReference(JQUERYSCRIPT); } private void renderBody() { boolean isSiteStatsAdminPage = Locator.getFacade().getStatsAuthz().isSiteStatsAdminPage(); boolean isAdministering = isSiteStatsAdminPage && realSiteId.equals(siteId); boolean isFilteringReportsWithToolsInSite = !isAdministering; // menu add(new Menus("menu", siteId)); // model setDefaultModel(new CompoundPropertyModel(this)); add(new Label("pageTitle")); // last job run add(new LastJobRun("lastJobRun", siteId)); // form Form form = new Form("reportsForm"); add(form); // feedback panel (messages) form.add(new CSSFeedbackPanel("messages")); // my reports WebMarkupContainer myReportsContainer = new WebMarkupContainer("myReportsContainer"); // new report link Link lnkNewReport = new Link("lnkNewReport") { private static final long serialVersionUID = 1L; @Override public void onClick() { PageParameters pageParameters = new PageParameters("siteId="+siteId+",predefined=false"); setResponsePage(new ReportsEditPage(null, pageParameters, ReportsPage.this)); } }; myReportsContainer.add(lnkNewReport); // table final WebMarkupContainer noReports = new WebMarkupContainer("noReports"); myReportsContainer.add(noReports); final ReportDefsProvider myReportsProvider = new ReportDefsProvider(siteId, ReportDefsProvider.MODE_MYREPORTS, true, false); DataView myReports = new DataView("myReports", myReportsProvider) { private static final long serialVersionUID = 1L; @Override protected void populateItem(Item item) { final ReportDefModel model = (ReportDefModel) item.getModel(); item.add(new ReportRowFragment("reportRow", model, ReportDefsProvider.MODE_MYREPORTS)); if(((ReportDef) model.getObject()).isHidden()) { item.add(new AttributeModifier("class", true, new Model("hiddenReport"))); } } @Override protected void onBeforeRender() { noReports.setVisible(getRowCount() == 0); super.onBeforeRender(); } }; myReportsContainer.add(myReports); form.add(myReportsContainer); // predefined reports WebMarkupContainer predefinedReportsContainer = new WebMarkupContainer("predefinedReportsContainer"); final WebMarkupContainer noPredefReports = new WebMarkupContainer("noReports"); predefinedReportsContainer.add(noPredefReports); WebMarkupContainer adminAddContainer = new WebMarkupContainer("adminAddContainer"); adminAddContainer.setVisible(isAdministering); predefinedReportsContainer.add(adminAddContainer); // new predefined report link Link lnkPDNewReport = new Link("lnkNewReport") { private static final long serialVersionUID = 1L; @Override public void onClick() { PageParameters pageParameters = new PageParameters("siteId="+siteId+",predefined=true"); setResponsePage(new ReportsEditPage(null, pageParameters, ReportsPage.this)); } }; adminAddContainer.add(lnkPDNewReport); final ReportDefsProvider predefinedReportsProvider = new ReportDefsProvider(siteId, ReportDefsProvider.MODE_PREDEFINED_REPORTS, isFilteringReportsWithToolsInSite, isAdministering); DataView predefinedReports = new DataView("predefinedReports", predefinedReportsProvider) { private static final long serialVersionUID = 1L; @Override protected void populateItem(Item item) { final ReportDefModel model = (ReportDefModel) item.getModel(); item.add(new ReportRowFragment("reportRow", model, ReportDefsProvider.MODE_PREDEFINED_REPORTS)); if(((ReportDef) model.getObject()).isHidden()) { item.add(new AttributeModifier("class", true, new Model("hiddenReport"))); } } @Override protected void onBeforeRender() { noPredefReports.setVisible(getRowCount() == 0); super.onBeforeRender(); } }; predefinedReportsContainer.add(predefinedReports); predefinedReportsContainer.setVisible(isSiteStatsAdminPage || predefinedReportsProvider.size() != 0); form.add(predefinedReportsContainer); } public String getPageTitle() { return (String) new ResourceModel("menu_reports").getObject(); } /** Fragment representing a row from report list table. */ public class ReportRowFragment extends Fragment { private static final long serialVersionUID = 1L; public ReportRowFragment(String id, final ReportDefModel model, int mode) { super(id, "reportRowFragment", ReportsPage.this); final ReportDef reportDef = (ReportDef) model.getObject(); final boolean isSiteStatsAdminPage = Locator.getFacade().getStatsAuthz().isSiteStatsAdminPage(); final boolean isPredefinedReport = reportDef.getSiteId() == null; // icon WebMarkupContainer icon = new WebMarkupContainer("icon"); if(mode == ReportDefsProvider.MODE_PREDEFINED_REPORTS) { icon.add(new AttributeModifier("src", true, new Model(StatsManager.SILK_ICONS_DIR + "report.png"))); } add(icon); // link Link link = new Link("link") { private static final long serialVersionUID = 1L; @Override public void onClick() { setResponsePage(new ReportDataPage(model, new PageParameters("siteId="+siteId), ReportsPage.this)); } }; // title String titleStr = null; if(reportDef.isTitleLocalized()) { titleStr = (String) new ResourceModel(reportDef.getTitleBundleKey()).getObject(); }else{ titleStr = reportDef.getTitle(); } link.add(new Label("title", titleStr)); add(link); // description String descriptionStr = null; if(reportDef.isDescriptionLocalized()) { descriptionStr = (String) new ResourceModel(reportDef.getDescriptionBundleKey()).getObject(); }else{ descriptionStr = reportDef.getDescription(); } add(new Label("description", descriptionStr)); // edit Link edit = new Link("edit") { private static final long serialVersionUID = 1L; @Override public void onClick() { if(isPredefinedReport) { setResponsePage(new ReportsEditPage(model, new PageParameters("siteId="+siteId+",predefined=true"), ReportsPage.this)); }else{ setResponsePage(new ReportsEditPage(model, new PageParameters("siteId="+siteId+",predefined=false"), ReportsPage.this)); } } }; add(edit); // hide WebMarkupContainer hideContainer = new WebMarkupContainer("hideContainer"); hideContainer.setVisible(isPredefinedReport && isSiteStatsAdminPage && realSiteId.equals(siteId)); add(hideContainer); Link hide = new Link("hide") { private static final long serialVersionUID = 1L; @Override public void onClick() { reportDef.setHidden(!reportDef.isHidden()); Locator.getFacade().getReportManager().saveReportDefinition(reportDef); } }; hideContainer.add(hide); Label hideLabel = new Label("hideLabel"); if(reportDef.isHidden()) { hideLabel.setDefaultModel(new ResourceModel("report_unhide")); }else{ hideLabel.setDefaultModel(new ResourceModel("report_hide")); } hide.add(hideLabel); // duplicate WebMarkupContainer duplicateContainer = new WebMarkupContainer("duplicateContainer"); add(duplicateContainer); Link duplicate = new Link("duplicate") { private static final long serialVersionUID = 1L; @Override public void onClick() { String originalTitle = ""; if(reportDef.isTitleLocalized()) { originalTitle = (String) new ResourceModel(reportDef.getTitleBundleKey()).getObject(); }else{ originalTitle = reportDef.getTitle(); } reportDef.setId(0); String copyTitle = (String) new ResourceModel("report_duplicate_name").getObject(); copyTitle = copyTitle.replaceAll("\\$\\{title\\}", originalTitle); reportDef.setTitle(copyTitle); if(isPredefinedReport && !isSiteStatsAdminPage) { reportDef.setSiteId(siteId); reportDef.getReportParams().setSiteId(siteId); } Locator.getFacade().getReportManager().saveReportDefinition(reportDef); } }; duplicateContainer.add(duplicate); // delete WebMarkupContainer deleteContainer = new WebMarkupContainer("deleteContainer"); deleteContainer.setVisible(!isPredefinedReport || (isPredefinedReport && isSiteStatsAdminPage && realSiteId.equals(siteId))); add(deleteContainer); Link delete = new Link("delete") { private static final long serialVersionUID = 1L; @Override public void onClick() { Locator.getFacade().getReportManager().removeReportDefinition(reportDef); } @Override protected CharSequence getOnClickScript(CharSequence url) { String msg = new StringResourceModel("report_confirm_delete", getPage(), model, new String[] {(String) new ResourceModel(reportDef.getTitleBundleKey()).getObject()}).getString(); return "return confirm('"+msg+"');"; } }; deleteContainer.add(delete); } } }