From 0de8f727770b688801a7e82675f38a8093662c4d Mon Sep 17 00:00:00 2001 From: Massimiliano Assante Date: Tue, 30 Apr 2013 14:16:20 +0000 Subject: [PATCH] added openReport panel git-svn-id: http://svn.research-infrastructures.eu/public/d4science/gcube/trunk/portlets/user/reports@74269 82a268e6-3cf1-43bd-a215-b396298e98cf --- .../reportgenerator/client/Headerbar.java | 90 ++------------- .../client/Presenter/CommonCommands.java | 18 ++- .../client/Presenter/Presenter.java | 105 ++++++++---------- .../client/ReportGenerator.java | 4 +- .../reportgenerator/client/ReportService.java | 2 + .../client/ReportServiceAsync.java | 1 + .../client/WorkspacePanel.java | 12 +- .../client/model/TemplateModel.java | 17 ++- .../client/uibinder/OpenOptions.java | 77 +++++++++++++ .../client/uibinder/OpenOptions.ui.xml | 19 ++++ .../server/servlet/ReportServiceImpl.java | 8 +- src/main/webapp/ReportGenerator.css | 37 ++++++ src/main/webapp/images/openReport.png | Bin 0 -> 6796 bytes src/main/webapp/images/openTemplate.png | Bin 0 -> 9118 bytes src/main/webapp/images/uploadReport.png | Bin 0 -> 8634 bytes 15 files changed, 237 insertions(+), 153 deletions(-) create mode 100644 src/main/java/org/gcube/portlets/user/reportgenerator/client/uibinder/OpenOptions.java create mode 100644 src/main/java/org/gcube/portlets/user/reportgenerator/client/uibinder/OpenOptions.ui.xml create mode 100644 src/main/webapp/images/openReport.png create mode 100644 src/main/webapp/images/openTemplate.png create mode 100644 src/main/webapp/images/uploadReport.png diff --git a/src/main/java/org/gcube/portlets/user/reportgenerator/client/Headerbar.java b/src/main/java/org/gcube/portlets/user/reportgenerator/client/Headerbar.java index 8e04fd3..5f18579 100644 --- a/src/main/java/org/gcube/portlets/user/reportgenerator/client/Headerbar.java +++ b/src/main/java/org/gcube/portlets/user/reportgenerator/client/Headerbar.java @@ -185,13 +185,7 @@ public class Headerbar extends Composite{ presenter.updateWorkflowDocument(false); } }; - - Command showChanges = new Command() { - public void execute() { - presenter.showLastChangesPopup(); - } - }; - + if (canUpdate) workflowMenu.addItem("Update this document", updateWfDocument); //workflowMenu.addItem("Show previous changes", showChanges); @@ -454,47 +448,8 @@ public class Headerbar extends Composite{ */ private MenuItem getFileMenu() { - Command newTemplate = new Command() { - public void execute() { - presenter.changeTemplateName(TemplateModel.DEFAULT_NAME); - presenter.cleanAll(); - } - }; - Command openTemplate = new Command() { - public void execute() { - GWT.runAsync(WorkspaceLightTreeLoadPopup.class, new RunAsyncCallback() { - public void onSuccess() { - - int left = mainLayout.getAbsoluteLeft() + 50; - int top = mainLayout.getAbsoluteTop() + 25; - - WorkspaceLightTreeLoadPopup wpTreepopup = new WorkspaceLightTreeLoadPopup("Open Template", true, true); - wpTreepopup.setShowableTypes(ItemType.REPORT_TEMPLATE); - wpTreepopup.setSelectableTypes(ItemType.REPORT_TEMPLATE); - - wpTreepopup.addPopupHandler(new PopupHandler() { - public void onPopup(PopupEvent event) { - if (! event.isCanceled()) { - if (event.getSelectedItem() != null) { - presenter.openTemplate(event.getSelectedItem().getName(), event.getSelectedItem().getId(), true); - } - presenter.getHeader().enableExports(); - } - } - }); - wpTreepopup.setPopupPosition(left, top); - wpTreepopup.show(); - } - - public void onFailure(Throwable reason) { - Window.alert("There are networks problem, please check your connection."); - } - }); - - - - } - }; + CommonCommands cmd = new CommonCommands(presenter); + Command openHelp = new Command() { @@ -518,38 +473,7 @@ public class Headerbar extends Composite{ }; - Command openReport = new Command() { - public void execute() { - - GWT.runAsync(WorkspaceLightTreeLoadPopup.class, new RunAsyncCallback() { - public void onSuccess() { - int left = mainLayout.getAbsoluteLeft() + 50; - int top = mainLayout.getAbsoluteTop() + 25; - - WorkspaceLightTreeLoadPopup wpTreepopup = new WorkspaceLightTreeLoadPopup("Open Report", true, true); - wpTreepopup.setShowableTypes(ItemType.REPORT); - wpTreepopup.setSelectableTypes(ItemType.REPORT); - wpTreepopup.addPopupHandler(new PopupHandler() { - public void onPopup(PopupEvent event) { - if (! event.isCanceled()) { - if (event.getSelectedItem() != null) { - presenter.openTemplate(event.getSelectedItem().getName(), event.getSelectedItem().getId(), false); - } - presenter.getHeader().enableExports(); - } - - } - }); - wpTreepopup.setPopupPosition(left, top); - wpTreepopup.show(); - } - - public void onFailure(Throwable reason) { - Window.alert("There are networks problem, please check your connection."); - } - }); - } - }; + Command saveReportAs = new Command() { public void execute() { @@ -579,14 +503,14 @@ public class Headerbar extends Composite{ fileMenu.setAnimationEnabled(true); MenuItem toReturn = new MenuItem("File", fileMenu); - fileMenu.addItem("Open Report", openReport); - fileMenu.addItem("Open template...", openTemplate); + fileMenu.addItem("Open Report", cmd.openReport); + fileMenu.addItem("Open template...", cmd.openTemplate); fileMenu.addSeparator(); fileMenu.addItem("Save", saveReport); fileMenu.addItem("Save As ..", saveReportAs); fileMenu.addSeparator(); // fileMenu.addItem("Import from FiMES XML", importFimes); - fileMenu.addItem("Close Report", newTemplate); + fileMenu.addItem("Close Report", cmd.newTemplate); fileMenu.addSeparator(); fileMenu.addItem("? Open User's Guide", openHelp); return toReturn; diff --git a/src/main/java/org/gcube/portlets/user/reportgenerator/client/Presenter/CommonCommands.java b/src/main/java/org/gcube/portlets/user/reportgenerator/client/Presenter/CommonCommands.java index 807fa34..5f4e423 100644 --- a/src/main/java/org/gcube/portlets/user/reportgenerator/client/Presenter/CommonCommands.java +++ b/src/main/java/org/gcube/portlets/user/reportgenerator/client/Presenter/CommonCommands.java @@ -2,6 +2,7 @@ package org.gcube.portlets.user.reportgenerator.client.Presenter; import org.gcube.portlets.user.reportgenerator.client.ReportConstants; import org.gcube.portlets.user.reportgenerator.client.dialog.ImporterDialog; +import org.gcube.portlets.user.reportgenerator.client.model.TemplateModel; import org.gcube.portlets.user.workspace.lighttree.client.ItemType; import org.gcube.portlets.user.workspace.lighttree.client.event.PopupEvent; import org.gcube.portlets.user.workspace.lighttree.client.event.PopupHandler; @@ -36,6 +37,8 @@ public class CommonCommands { * */ public Command openReport; + + public Command newTemplate; /** * */ @@ -61,6 +64,16 @@ public class CommonCommands { */ public CommonCommands(final Presenter presenter) { this.presenter = presenter; + + newTemplate = new Command() { + public void execute() { + presenter.changeTemplateName(TemplateModel.DEFAULT_NAME); + presenter.cleanAll(); + presenter.showOpenOptions(); + } + }; + + openTemplate = new Command() { public void execute() { final int left = presenter.getHeader().getMainLayout().getAbsoluteLeft() + 50; @@ -69,6 +82,7 @@ public class CommonCommands { GWT.runAsync(WorkspaceLightTreeLoadPopup.class, new RunAsyncCallback() { public void onSuccess() { WorkspaceLightTreeLoadPopup wpTreepopup = new WorkspaceLightTreeLoadPopup("Select a Template to open", true, true); + wpTreepopup.setWidth("450px"); wpTreepopup.setShowableTypes(ItemType.REPORT_TEMPLATE); wpTreepopup.setSelectableTypes(ItemType.REPORT_TEMPLATE); @@ -104,6 +118,7 @@ public class CommonCommands { int top = presenter.getHeader().getMainLayout().getAbsoluteTop() + 25; WorkspaceLightTreeLoadPopup wpTreepopup = new WorkspaceLightTreeLoadPopup("Select a Report to open", true, true); + wpTreepopup.setWidth("450px"); wpTreepopup.setShowableTypes(ItemType.REPORT); wpTreepopup.setSelectableTypes(ItemType.REPORT); wpTreepopup.addPopupHandler(new PopupHandler() { @@ -166,7 +181,7 @@ public class CommonCommands { public void onSuccess() { WorkspaceLightTreeLoadPopup wpTreepopup = new WorkspaceLightTreeLoadPopup("Pick the item you want to import from", true, true); wpTreepopup.setShowableTypes(ItemType.REPORT_TEMPLATE); - + wpTreepopup.setWidth("450px"); wpTreepopup.addPopupHandler(new PopupHandler() { public void onPopup(PopupEvent event) { @@ -216,6 +231,7 @@ public class CommonCommands { GWT.runAsync(WorkspaceLightTreeSavePopup.class, new RunAsyncCallback() { public void onSuccess() { WorkspaceLightTreeSavePopup wpTreepopup = new WorkspaceLightTreeSavePopup("Save Template, choose folder please:", true); + wpTreepopup.setWidth("450px"); wpTreepopup.setSelectableTypes( ItemType.FOLDER, ItemType.ROOT); wpTreepopup.setShowEmptyFolders(true); diff --git a/src/main/java/org/gcube/portlets/user/reportgenerator/client/Presenter/Presenter.java b/src/main/java/org/gcube/portlets/user/reportgenerator/client/Presenter/Presenter.java index 098a675..41e792f 100644 --- a/src/main/java/org/gcube/portlets/user/reportgenerator/client/Presenter/Presenter.java +++ b/src/main/java/org/gcube/portlets/user/reportgenerator/client/Presenter/Presenter.java @@ -8,7 +8,6 @@ import org.gcube.portlets.d4sreporting.common.shared.ComponentType; import org.gcube.portlets.d4sreporting.common.shared.Metadata; import org.gcube.portlets.d4sreporting.common.shared.Model; import org.gcube.portlets.user.exporter.client.ReportExporterPopup; -import org.gcube.portlets.user.exporter.client.ReportExporterServiceAsync; import org.gcube.portlets.user.exporter.client.event.ExportingCompletedEvent; import org.gcube.portlets.user.exporter.client.event.ExportingCompletedEventHandler; import org.gcube.portlets.user.exporter.client.event.ReportExporterEvent; @@ -257,9 +256,9 @@ public class Presenter { commonCommands = new CommonCommands(this); //importDlg = new FimesFileUploadWindow(eventBus); } - - public void showLastChangesPopup() { - + + public void showOpenOptions() { + wp.showOpenOptions(); } public void showSectionUserCommentsTooltips() { @@ -351,15 +350,8 @@ public class Presenter { */ HashMap toReturn = new HashMap(); - Command newTemplate= new Command() { - public void execute() { - changeTemplateName(TemplateModel.DEFAULT_NAME); - cleanAll(); - } - }; - toReturn.put("save", commonCommands.saveTemplate); - toReturn.put("newdoc", newTemplate); + toReturn.put("newdoc", commonCommands.newTemplate); toReturn.put("open_report", commonCommands.openReport); toReturn.put("open_template", commonCommands.openTemplate); toReturn.put("importing", commonCommands.importTemplateCommand); @@ -441,27 +433,15 @@ public class Presenter { //persists the change in the session model.storeInSession(); } - /** - * just clean the page + * remove the user-added components from the workspace (in the current page) but not from the model + * */ - public void cleanAllNotSession() { - // reset the model - model = new TemplateModel(this); - - //reset the UI - - //give the new model instance - header.setModel(model); - wp.setModel(model); - - cleanWorkspace(); - titleBar.hideNextButton(); - titleBar.hidePrevButton(); - titleBar.setTemplateName(model.getTemplateName()); - titleBar.setPageDisplayer(model.getCurrentPage(), model.getTotalPages()); - resizeWorkingArea(model.getPageWidth(), model.getPageHeight()); + public void cleanWorkspace() { + wp.getMainLayout().clear(); + ReportGenerator.get().getScrollerPanel().setScrollPosition(0); } + /** * Save the current report @@ -501,14 +481,7 @@ public class Presenter { titleBar.setTemplateName(templateName); } - /** - * remove the user-added components from the workspace (in the current page) but not from the model - * - */ - public void cleanWorkspace() { - wp.getMainLayout().clear(); - ReportGenerator.get().getScrollerPanel().setScrollPosition(0); - } + /** * @@ -746,27 +719,21 @@ public class Presenter { * @param isTemplate true if you are opening a template false if you are opening a report */ public void openTemplate(String templateToOpen, String templateObjectID, final boolean isTemplate) { - AsyncCallback callback = new AsyncCallback() { - + //will asyncrously return a Serializable Model instance read from disk + model.getModelService().readModel(templateToOpen, templateObjectID, isTemplate, false, new AsyncCallback() { + @Override + public void onSuccess(Model toLoad) { + if (toLoad != null) + loadModel(toLoad); + else + Window.alert("Could not Load template, error on server: "); + } + @Override public void onFailure(Throwable caught) { Window.alert("Could not Load template, please try again later: " + caught.getMessage()); } - - public void onSuccess(Model toLoad) { - if (toLoad.getPageWidth() == TemplateModel.OLD_TEMPLATE_WIDTH) { - if (isTemplate) - Window.alert("OPS! we think you are trying to open a previuos version template, only gCube Templates 1.5+ are supported"); - else - Window.alert("OPS! we think you are trying to open a previuos version Report, only gCube Reports 1.5+ are supported"); - } - else - loadModel(toLoad); - } - }; - - //will asyncrously return a SerializableModel instance read from disk - model.getModelService().readModel(templateToOpen, templateObjectID, isTemplate, false, callback); + }); } /** * load the template to edit in the MODEL and in the VIEW @@ -774,12 +741,14 @@ public class Presenter { */ public void openImportedFimesXML(String serializedpath) { model.getModelService().readImportedModel(serializedpath, new AsyncCallback() { - public void onFailure(Throwable caught) { - Window.alert("Could not Load report, please try again later: " + caught.getMessage()); - } + @Override public void onSuccess(Model toLoad) { loadModel(toLoad); } + @Override + public void onFailure(Throwable caught) { + Window.alert("Could not Load report, please try again later: " + caught.getMessage()); + } }); } @@ -812,7 +781,27 @@ public class Presenter { } if (currPage > 1) titleBar.showPrevButton(); + } + + /** + * just clean the page + */ + public void cleanAllNotSession() { + // reset the model + model = new TemplateModel(this); + //reset the UI + + //give the new model instance + header.setModel(model); + wp.setModel(model); + + cleanWorkspace(); + titleBar.hideNextButton(); + titleBar.hidePrevButton(); + titleBar.setTemplateName(model.getTemplateName()); + titleBar.setPageDisplayer(model.getCurrentPage(), model.getTotalPages()); + resizeWorkingArea(model.getPageWidth(), model.getPageHeight()); } private void loadFirstSection() { diff --git a/src/main/java/org/gcube/portlets/user/reportgenerator/client/ReportGenerator.java b/src/main/java/org/gcube/portlets/user/reportgenerator/client/ReportGenerator.java index 83cf59e..ac87873 100644 --- a/src/main/java/org/gcube/portlets/user/reportgenerator/client/ReportGenerator.java +++ b/src/main/java/org/gcube/portlets/user/reportgenerator/client/ReportGenerator.java @@ -16,6 +16,7 @@ import com.google.gwt.core.client.GWT; import com.google.gwt.core.client.RunAsyncCallback; import com.google.gwt.event.logical.shared.ResizeEvent; import com.google.gwt.event.logical.shared.ResizeHandler; +import com.google.gwt.user.client.Timer; import com.google.gwt.user.client.Window; import com.google.gwt.user.client.ui.CellPanel; import com.google.gwt.user.client.ui.HTML; @@ -169,8 +170,7 @@ public class ReportGenerator implements EntryPoint { } } - }); - + }); //presenter.showExportPanel("", "", null, ""); //showGuidedTour() ; diff --git a/src/main/java/org/gcube/portlets/user/reportgenerator/client/ReportService.java b/src/main/java/org/gcube/portlets/user/reportgenerator/client/ReportService.java index 4cb8f2f..af67937 100644 --- a/src/main/java/org/gcube/portlets/user/reportgenerator/client/ReportService.java +++ b/src/main/java/org/gcube/portlets/user/reportgenerator/client/ReportService.java @@ -81,4 +81,6 @@ public interface ReportService extends RemoteService{ * @return */ Model readImportedModel(String tempPath); + + void renewHTTPSession(); } diff --git a/src/main/java/org/gcube/portlets/user/reportgenerator/client/ReportServiceAsync.java b/src/main/java/org/gcube/portlets/user/reportgenerator/client/ReportServiceAsync.java index b51b6fc..45fa4ab 100644 --- a/src/main/java/org/gcube/portlets/user/reportgenerator/client/ReportServiceAsync.java +++ b/src/main/java/org/gcube/portlets/user/reportgenerator/client/ReportServiceAsync.java @@ -75,4 +75,5 @@ public interface ReportServiceAsync { AsyncCallback callback); void save(String filePath, String workspaceFolderId, String ItemName, TypeExporter type, boolean overwrite, AsyncCallback callback); + void renewHTTPSession(AsyncCallback callback); } diff --git a/src/main/java/org/gcube/portlets/user/reportgenerator/client/WorkspacePanel.java b/src/main/java/org/gcube/portlets/user/reportgenerator/client/WorkspacePanel.java index 036d4aa..0092ca2 100644 --- a/src/main/java/org/gcube/portlets/user/reportgenerator/client/WorkspacePanel.java +++ b/src/main/java/org/gcube/portlets/user/reportgenerator/client/WorkspacePanel.java @@ -5,6 +5,7 @@ package org.gcube.portlets.user.reportgenerator.client; import org.gcube.portlets.user.reportgenerator.client.Presenter.Presenter; import org.gcube.portlets.user.reportgenerator.client.model.TemplateModel; import org.gcube.portlets.user.reportgenerator.client.targets.DoubleColumnPanel; +import org.gcube.portlets.user.reportgenerator.client.uibinder.OpenOptions; import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.FlowPanel; @@ -66,13 +67,14 @@ public class WorkspacePanel extends Composite { templateModel = presenter.getModel(); mainLayout.setWidth(""+(templateModel.getPageWidth())); - mainLayout.setStyleName("wpFlow"); - - + mainLayout.setStyleName("wpFlow"); - initWidget(mainLayout); - + initWidget(mainLayout); + showOpenOptions(); + } + public void showOpenOptions() { + mainLayout.add(new OpenOptions(presenter)); } /** diff --git a/src/main/java/org/gcube/portlets/user/reportgenerator/client/model/TemplateModel.java b/src/main/java/org/gcube/portlets/user/reportgenerator/client/model/TemplateModel.java index b81ada4..b46776d 100644 --- a/src/main/java/org/gcube/portlets/user/reportgenerator/client/model/TemplateModel.java +++ b/src/main/java/org/gcube/portlets/user/reportgenerator/client/model/TemplateModel.java @@ -19,6 +19,7 @@ import org.gcube.portlets.user.reportgenerator.client.Presenter.Presenter; import com.extjs.gxt.ui.client.widget.MessageBox; import com.google.gwt.core.client.GWT; +import com.google.gwt.user.client.Timer; import com.google.gwt.user.client.Window; import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwt.user.client.rpc.ServiceDefTarget; @@ -157,6 +158,20 @@ public class TemplateModel { this.presenter = presenter; String moduleRelativeURL = GWT.getModuleBaseURL() + "ReportServiceImpl"; endpoint.setServiceEntryPoint(moduleRelativeURL); + + Timer renewSessionTimer = new Timer() { + + @Override + public void run() { + modelService.renewHTTPSession(new AsyncCallback() { + @Override + public void onFailure(Throwable caught) {} + @Override + public void onSuccess(Void result) {} + }); + } + }; + renewSessionTimer.scheduleRepeating(1000*60*30); // renew session every 30 minutes } /** @@ -307,7 +322,7 @@ public class TemplateModel { /** - * generally used when reaing a model form disk + * generally used when reading a model form disk * @param toLoad the SerializableModel instance where toget the section * @param sectionNoToimport section to import 0 -> n-1 * @param beforeSection say where to import this section (before) diff --git a/src/main/java/org/gcube/portlets/user/reportgenerator/client/uibinder/OpenOptions.java b/src/main/java/org/gcube/portlets/user/reportgenerator/client/uibinder/OpenOptions.java new file mode 100644 index 0000000..e23d2ff --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/reportgenerator/client/uibinder/OpenOptions.java @@ -0,0 +1,77 @@ +package org.gcube.portlets.user.reportgenerator.client.uibinder; + +import org.gcube.portlets.user.reportgenerator.client.Presenter.CommonCommands; +import org.gcube.portlets.user.reportgenerator.client.Presenter.Presenter; +import org.gcube.portlets.user.reportgenerator.client.uibinder.ExportOptions.ExportMode; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.event.dom.client.ClickEvent; +import com.google.gwt.uibinder.client.UiBinder; +import com.google.gwt.uibinder.client.UiField; +import com.google.gwt.uibinder.client.UiHandler; +import com.google.gwt.user.client.Command; +import com.google.gwt.user.client.ui.Composite; +import com.google.gwt.user.client.ui.HTML; +import com.google.gwt.user.client.ui.HTMLPanel; +import com.google.gwt.user.client.ui.Widget; + +public class OpenOptions extends Composite { + + private static OpenOptionsUiBinder uiBinder = GWT + .create(OpenOptionsUiBinder.class); + + interface OpenOptionsUiBinder extends UiBinder { + } + enum OpenMode {OPEN_REPORT, OPEN_TEMPLATE, UPLOAD } + + @UiField HTML openReport; + @UiField HTML openTemplate; + @UiField HTML uploadReport; + + @UiField HTMLPanel myPanel; + + private Presenter p; + + public OpenOptions(Presenter p) { + initWidget(uiBinder.createAndBindUi(this)); + this.p = p; + } + + public HTMLPanel getMainPanel() { + return myPanel; + } + @UiHandler("openReport") + void onOpenReportClick(ClickEvent e) { + GWT.log("openReport"); + doAction(OpenMode.OPEN_REPORT); + } + + @UiHandler("openTemplate") + void onOpenTemplateClick(ClickEvent e) { + GWT.log("openTemplate"); + doAction(OpenMode.OPEN_TEMPLATE); + } + + @UiHandler("uploadReport") + void unUploadClick(ClickEvent e) { + doAction(OpenMode.UPLOAD); + } + + private void doAction(OpenMode mode) { + CommonCommands cmd = new CommonCommands(p); + switch (mode) { + case OPEN_REPORT: + cmd.openReport.execute(); + break; + case OPEN_TEMPLATE: + cmd.openTemplate.execute(); + break; + case UPLOAD: + + break; + default: + break; + } + + } +} diff --git a/src/main/java/org/gcube/portlets/user/reportgenerator/client/uibinder/OpenOptions.ui.xml b/src/main/java/org/gcube/portlets/user/reportgenerator/client/uibinder/OpenOptions.ui.xml new file mode 100644 index 0000000..b066d9a --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/reportgenerator/client/uibinder/OpenOptions.ui.xml @@ -0,0 +1,19 @@ + + + + + + + + + +
+ Load Template + + Open/Edit Report + + Upload from Desktop +
+
+
\ No newline at end of file diff --git a/src/main/java/org/gcube/portlets/user/reportgenerator/server/servlet/ReportServiceImpl.java b/src/main/java/org/gcube/portlets/user/reportgenerator/server/servlet/ReportServiceImpl.java index aa0d000..22da619 100644 --- a/src/main/java/org/gcube/portlets/user/reportgenerator/server/servlet/ReportServiceImpl.java +++ b/src/main/java/org/gcube/portlets/user/reportgenerator/server/servlet/ReportServiceImpl.java @@ -1646,7 +1646,9 @@ public class ReportServiceImpl extends RemoteServiceServlet implements ReportSe } } - - - + @Override + public void renewHTTPSession() { + HttpSession session = this.getThreadLocalRequest().getSession(); + _log.info("HTTP Session renewed" + new Date(session.getLastAccessedTime())); + } } diff --git a/src/main/webapp/ReportGenerator.css b/src/main/webapp/ReportGenerator.css index 2bea911..88e2ae3 100644 --- a/src/main/webapp/ReportGenerator.css +++ b/src/main/webapp/ReportGenerator.css @@ -1,5 +1,42 @@ @import url('reports/old-dialog.css'); + +.openOptionsPanel { + margin: 25px 5px 0px -45px; + border: 1px solid #e3e8f3; + padding: 5px; +} + +.openOption { + display: block; + height: 160px; + width: 250px; + opacity: 0.8; + text-align: center; + font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; + font-size: 18px; + color: #444; +} + +.openOption:hover { + cursor: pointer; + cursor: hand; + opacity: 1.0; +} + +.optionOpenReport { + background: url('images/openReport.png') 50% 25px no-repeat; +} + +.optionOpenTemplate { + background: url('images/openTemplate.png') 50% 25px no-repeat; +} + +.optionUpload { + background: url('images/uploadReport.png') 55% 25px no-repeat; +} + + .exportPanel { margin: 5px 5px 5px 20px; border: 1px solid #e3e8f3; diff --git a/src/main/webapp/images/openReport.png b/src/main/webapp/images/openReport.png new file mode 100644 index 0000000000000000000000000000000000000000..fe3aebec8c0b84157a7262c9f6ad2477f5b0cafb GIT binary patch literal 6796 zcmaJ`XH*kwyPZHnZ_-5|AxM+n6p&s8i69_FLJ0xsHK7V5AWcC)q)7|t5m2NF3P=kg zQl%fi063ILRFcMEH* zHNsd0?dvUt`h$@Q@%B4o1AwYVh#v~=>4JqhxwyLfsKGZITj4NwXEnH$B0>h?r{m)0 zel0A(#XRhW1v<OZEY?p&S~@s5SSnav$~VAOT2@(E`HzO2oa7lo5)-KZ+`Ji14b=BZ!3R3Rw&MJDc z`np$?6=k)QwY6ns_2iTkE^904Dagy}DQWA<$msmd)%8UOdb{{w|K>XX4_EFVxqqzS z?ROSg*CoI`$i-Pdz}Fl0uaZ^V|1lQ@{eRT^H`n=}bCLN+uJl8a3ExdHULbi;8;{7w;cBOj^ z%dh}O7=z6IMDUkL-$1M2KojUKI|JwlG;_o%@YdL-TIA+Y^NcNfyG$xnFxYJ?3nmR5 z%0|aaO;C$IxCFz|fy1*VTVlEi=I>{PHu5ti0B5&u%RF5gw+x(8`JC(PpLwdHz-w!u zpC#4X5`p++>~v1FTEsZ0=+0y_g(|CLSGpS z#4o-mDG0l>wb1Q!gUVQ#jh%xdYQigSbkwrzb1AwWdHuK7JN4!LquHI6kt$Ss+)zu@yg5JZ=c=MV`O>zZdh1An#J?&VY*5IwWzsBIv~dXn3Zh76{5j3DS8c&ghmtxSo(12qA0r$k*F!;4 zjc#-7G8~cQqBW*c_faQEU$xV8cNc4P@ocKtIqfEPsxnB?aja5o=@lu{MUFNAdAE$Y zsJooUqAE?YWl-ZsyhJnNfGEgMCEwi;;wpFW6Q53hoWu$|8|vy8Pf{4pVmSV8T$o2n zMg(;6Gh;nj2zVic~mg;aFP#oXvy+MK-DYb{(xm;PX5#2i-|vnD0E%-W1=gK5QRv} zsjk_~l}OuuOahho=v^9hxkv%P^$q>Cpy3znS4E3X%=)8RaT4Ui$4bXd>LT3QifZC^ znzptVu7eGtXH2MAvZfdJ%F4?TZpwe@f}EBpj*aYLEl+xd$Q`We>IY7rn$n~+{ihP` zuAvdsu9&we@~iiam1ZPi-n%@i6g{3@N3qIOq?mjj&a-_9b<@ySY_jy`t?&Q8Nlj`m60pge-Bf ziJll3%b6&IM%3lq9(ay@j5wwdN;3lspuvC@$9(4XNDUtLmP!*y7dA6iT)nD2;d3`k zjD+I3-T&M@9L6epjEyGTq`;fEt*@`UvjKSl9WO6d%SOVbzl$)WU;UqC@nDoGeTt9fj&~%Xu0gak)P1K_ zZy7ayHr^w@QOoC%bQR0C1|=Ll92a3>QyTxo`rE0J;JkbCB<)3FV3E_Ie}h)hd2P<~ zP&cuN$!}2$KC?=(y}PupUcO9g`d}-yzN}!mmU&Hdfnw2Z)n}aCnK8JtD@-0~sda1d zy689jm!aS6dx#~AOw#p_3-eL&b=e&V+Hy{Dq_&jDr7ucfSGg+lV)qI#s>+%70AKqi0qf{48`n}Uf+pya3B;KJHFa9eQ9kWdf+qwxeNcX z8*6$?_FT?DIECFw7AbQwUaOb;j86dz7Rz2k6oIpv_7%S_)b(L#>MFRC|>x@N|H56TmbN>I%1l+ znQ3#L&bZ2Lui4Z~GG6lTDHu1i&#H=DrK&FuYwsA)3$eEBJ6zzlreh0$`)n6lc zV~3iVlg=E_MQ84dYXn zcnfzNuM8@wBhYApEHaH_8hs<#*GA<^eWz(QH&$Y%N;LZEG+$k~4H(1Wl#iB_!(XiQ@RLX@(yAkQ*DV?fvF!7aeQTiJ9MU(RFXtDaE;t zFZ7i+P(GD*@7D#nQx2V(-dhQlS9^rRHxCPNI!_&by@fSRGdBJ3TpP`>RJ#~4xVIy9E= z;bvQAgfH<$BK2%k$H2YnL8%|Ax7hF&I_eU19hUw^!grk_vh=UFElxis?KaM>2`cD1 zvGQd%sz?l$TQO;oT=n<%I`+pmwX!t%nZv@yw*#!jXOkhGL?5x(Zw`^*O7CA*2k}#p zR6+Bi-D5^cz(EEDl$uo&$y~|)GqFUBE6kRZuQm{E?+fc3#c!=TiVddDk4rEG^ilAW zPs!*wCL2geCA6uQULscL%tb~)t$d7|?Y`>ayq1z-JRX;p!C>*J#+cb8r=4>2;%&Kt zF5@7AIz+_|^fhdLzwlMP(HmiQJt{Wk>1-J2uL(aHaHJ^!JNP=kuU$97xI{tSmlHs5 z-Pb{OKWQX?T*Ad)t-Q<5`MF%X+N=*k^Gjdob%c=!wthJ~mtd{NQBjd|F0WwGERaq( z$J%_L>OL&zOC;{EJq!g1>*p~=t=4~8hJ#(_Q}%gBdnX~(+}*0`pI2l^Kca<3#_;x@ z*G$-9)CcuS=`#YlK8U3Ki1mBxEW~IK6h(^YPi7G?7kV$Cd34@^n_SvT#84mHCLGCy zxQSROeSE*w;Ysv3WeI{tF!$H;MQwg-N+w6s1wI2BUfw+@b6o&5zJ!KD=Ut?0Zwmsi zG~OSN5Ggf!SPN~rFQT4~T>`&7 zA_2fg@nbWHrg4CC)k%124unzu%Ft8&FFeRks_CYAtMc40on1(}i3ARkG`#kdqsT)(excOF^$S22 z4iAAkv_H|AD-9WqilUD&Ag-*(Ub2<^8a5JP+KLnBRXY_^D(0&ER=fWx?$CTw#i=gc z)$)?kZM>9yQ+7bEl2}bBUw`toa)zbFjLRTo-@sUiF=ZnSiAFdl82rsd0g6z6N3D{a zsQKI-s;alQ9`7-wU>$xEpv|;SUM#Z1Odou2s7uLvf&2A{qtdG`x0l-n3^N}il^B6T zl^Yx_3vMbw*>_H~=_o4WBdXbCOi=9<5qqvS{HBW(6nZ-Mbw zOfMs6Mkg2zuCy4cljkNI?N6^)KmRIZ2&7X$r#{@bD-<*Ek69h==t`1o$ImgrxF=^P zfzNxOV6OW6PnZ|L;j;l~;pW;FgFT*wCAcJw1>E~KRfU7Epoq4M=W^dTlQ z>dV}qf`V`BV);YqrU>%F@_Bdk4#ww*1go#lOh)z2vpMxJTMK z9N>PVLXugM@Q&@^_r1FnRZWhsBB=UG^E>Y_X-pm6T<@pE9pwu%M_Rajq}KcRNhe&r ze-mvM&lRMrcH>kHMNcHZjt6;aVsQ6T+QDh4SY|;+c9!^N28la+RD42dS@C6$YOKnW zrLzlZ-5!Uxo_l;n2YfuJJy?%7Akbg*V{0!5)R{u0yt_CC)1eHv1ubk#v>FaQ>O)>| z1Sv*P%+%(ulwH8h`*M_1r#{<#;B2b*4mjk@H(kSVPcnvu*$5DO&)tsXrz9tMIj7Sw zaGh^)BoB8l++yTVQm5pRSxrPCe;=0Ucd&{5eUKSTTqRFvEJX0Et!ZW zM|07J$P2K`ZI65A7*5frvQZ_j!-kHIOt^$>JBIBvKb@$75IFHe*nOrU4aP%Tqyp7P zHgaGRZ4Of;)e-ZUyb7YNr9<9It!^oqOQWOD@nd@IyvO+po7x2X*wW-a*_Reme3a<2smD_GIX>Ix_3V8>DMrw;IY79t{l%*WX1Zt5jQMK?Gzb%!Vl2iEzrP@64$etWrWluVwBtDaU(TRmUJ z>g;9-CbwTkqd`%<1pS9R&w1Mtx2K0N`R&n~sVr2#XwGA5d9W z-(QtbOpd=aW#Pw$Yb^_<=M_AiwsxDUJ@~b${+r}Iz%NYdJb|P&#t7Wi@FM|@lh2Eb z zKK1q1n@1BgP&x(uxm6Jz$oz_ZsHYwf))Vi4PMQL@^Nj>C{o%^FHVxj&ky zbPt1D-eL+VJ8=9oWWS|>Yjbz=w%%}9zJGy{lsL$@%aTr!$|v`r_m6+=PWq2A(<#4o zX2Sa`>_I+UjlAetS5Qg~-AKuuL=rKlW-;_5?sV-gv&QvCqNz^Lb!d6Z^_g!EmgERH zmQxq|4@HL@-@D0U5^o4?7raZOArLPy-f0NWSVIv{|x-Fj6>SU z*^|}yh3JXtV&%`7jj>VMpQVN`60GejG%JLDe(|CPd9WrM}u;cMd zTr006hH7|vW_J!b#}7LU27?xncM-d54#(f8tsE}c$_gzq<-W{{?PLQZ&-b;urhZ;4 zFx9I1{*qJ#X@v`q=V~5`X`Akv-n5tXf{Qpog|+wzS7>WD7xdkZf1wLcP7{*&V>IJQ zlVBbR$n%($F&3Nym^yhQ>eq=aae0@|R_SDVSDfp2?+opMx>!%H8Na4mlXP+Z`Bsh8 zJj8{VHMGd@G=FfC+1lksi3$&F_m`$Ig{b-h#S>%GZFe}8%G00EXhfbQfSJ{OPg(Y$ z6Na9m-;(1q)%Mrc$12^2-D=ay>t2nt9p9Z5&ar$LSe>dnmuYwfX_^;q*0jdIC+tW; zLSLK{xg+bBg9Tr1^)*_gt?A_P1Z(_D_CnI&Zy_v<1FUn{a^Kf{?yWmC(MyW(L=?lPu6|f(t#_RK=9=DT_}%Qw zUY`lsxnEs&3twaq`wl+3Kxi1GuwDJlz$Kj@m|L*0H$ zuRV-~Rf8iZnWMn16-+qN*%wJ~7a!-#%P^^$D=o@%7$C%!FbWuTM$n$E%e0{6(Y5f6U&-?D3{^HEx}8Q`>65rSxt8 zcYg1Jw>z_6Og64uST9@}6r+tSUZSvgVwWWE*ALd%+-)doEa59oms(NAeGY6Nz#Ywv zrN$MRQye3&jb3Bkp0maOd{(TzJ|1d1Umr@!(g^k5o4qGlB7o2-xp*LW<)eug=+YXS z zO(`;@U$}e>Gm_}(u(@sn!P8o(4TJj%*hFrGYrajtH)0`GkcSW)smATN`S_gbn46E3 wqzc?KE4vyL>AWfO+-&~}XeFT-(D$N&HU literal 0 HcmV?d00001 diff --git a/src/main/webapp/images/openTemplate.png b/src/main/webapp/images/openTemplate.png new file mode 100644 index 0000000000000000000000000000000000000000..726c4bca3de817333ed98f4db18ad93212fb922e GIT binary patch literal 9118 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 j8$*|-5P9-|0s`>;W$BcrEigcZnN!b4ZWyQa7 literal 0 HcmV?d00001 diff --git a/src/main/webapp/images/uploadReport.png b/src/main/webapp/images/uploadReport.png new file mode 100644 index 0000000000000000000000000000000000000000..c43e53e08d294396f6e2c736b9fbdf1cc653b4d8 GIT binary patch literal 8634 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 z