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 a1d93b6..6683549 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 @@ -5,9 +5,12 @@ import java.util.HashMap; import java.util.List; import org.gcube.portlets.d4sreporting.common.client.uicomponents.richtext.RichTextToolbar; +import org.gcube.portlets.d4sreporting.common.shared.BasicSection; 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.d4sreporting.common.shared.RepeatableSequence; +import org.gcube.portlets.d4sreporting.common.shared.Tuple; import org.gcube.portlets.user.reportgenerator.client.Headerbar; import org.gcube.portlets.user.reportgenerator.client.ReportConstants; import org.gcube.portlets.user.reportgenerator.client.ReportGenerator; @@ -39,6 +42,7 @@ import org.gcube.portlets.user.reportgenerator.client.targets.AttributeSingleSel import org.gcube.portlets.user.reportgenerator.client.targets.BasicTextArea; import org.gcube.portlets.user.reportgenerator.client.targets.ClientImage; import org.gcube.portlets.user.reportgenerator.client.targets.ClientRepeatableSequence; +import org.gcube.portlets.user.reportgenerator.client.targets.ClientSequence; import org.gcube.portlets.user.reportgenerator.client.targets.ClientTuple; import org.gcube.portlets.user.reportgenerator.client.targets.Coords; import org.gcube.portlets.user.reportgenerator.client.targets.D4sRichTextarea; @@ -114,6 +118,10 @@ public class Presenter { private String location; private int currFocus; + /** + * this is needed to know on which client sequence the user is operating + */ + private ClientSequence clientSeqSelected = null; RichTextToolbar currentSelectedToolbar; @@ -134,11 +142,11 @@ public class Presenter { return eventBus; } - + private UserSelectionDialog itemSelectionDialog; - + private void handleEvents() { - + eventBus.addHandler(SelectedUserEvent.TYPE, new SelectedUserEventHandler() { @Override public void onSelectedUser(SelectedUserEvent event) { @@ -146,7 +154,11 @@ public class Presenter { if (event.getSelectedUser().getType().equals(VMETypeIdentifier.Vme.toString())) importVMEReport(event.getSelectedUser()); else - associateVMRReportRef(event.getSelectedUser()); + try { + associateVMRReportRef(event.getSelectedUser()); + } catch (Exception e) { + e.printStackTrace(); + } } }); @@ -286,6 +298,10 @@ public class Presenter { //importDlg = new FimesFileUploadWindow(eventBus); } + public void setClientSequenceSelected(ClientSequence toSet) { + this.clientSeqSelected = toSet; + } + public void showOpenOptions() { wp.showOpenOptions(); } @@ -1290,7 +1306,7 @@ public class Presenter { } }); } - + /** * */ @@ -1313,13 +1329,13 @@ public class Presenter { } }); } - + private void importVMEReport(ItemSelectableBean selectedReport) { showLoading(); reportService.importVMEReport(selectedReport.getId(), selectedReport.getName(), new AsyncCallback() { @Override public void onFailure(Throwable caught) { - Window.alert("Could not Load template, please try again later: " + caught.getMessage()); + Window.alert("Could not Load Report Model, error on server.: " + caught.getMessage()); } @Override @@ -1327,13 +1343,55 @@ public class Presenter { if (toLoad != null) loadModel(toLoad); else - Window.alert("Could not Load template, error on server."); + Window.alert("Could not Load Report Model, error on server."); } }); - + } - - private void associateVMRReportRef (ItemSelectableBean selectedReport) { - Window.alert("You selected " + selectedReport.getName() + " of type " + selectedReport.getType()); + + private void associateVMRReportRef (ItemSelectableBean selectedReport) throws Exception { + reportService.importVMEReportRef(selectedReport.getId(), getTypeIdFromString(selectedReport.getType()), new AsyncCallback() { + + @Override + public void onFailure(Throwable caught) { + Window.alert("Could not Load Report Model, error on server.: " + caught.getMessage()); + } + + @Override + public void onSuccess(Model reportRef) { + if (reportRef != null && reportRef.getSections().size() > 0) { + //the Repeatable Seq must be in the 1st Section, second component. (because ReportsModeler put it that way) + BasicSection firstSection = reportRef.getSections().get(0); + if (firstSection.getComponents() != null && firstSection.getComponents().size()==2) { + @SuppressWarnings("unchecked") + ArrayList toPass = (ArrayList) firstSection.getComponents().get(1).getPossibleContent(); + clientSeqSelected.add(toPass.get(0).getKey(), toPass.get(0)); + } + else { + Window.alert("Sorry, we could not locate the ReportRef correctly in the model instance"); + } + } + else + Window.alert("Could not Load Report Model, error on server."); + } + }); + } + + /** + * this method translate the VME ReportRef String in an ENUM + * @param theType + * @return + * @throws Exception + */ + public VMETypeIdentifier getTypeIdFromString(String theType) throws Exception { + if (theType.equals("GeneralMeasure")) + return VMETypeIdentifier.GeneralMeasure; + else if (theType.equals("InformationSource")) + return VMETypeIdentifier.InformationSource; + else if (theType.equals("FisheryAreasHistory")) + return VMETypeIdentifier.FisheryAreasHistory; + else if (theType.equals("VmesHistory")) + return VMETypeIdentifier.VmesHistory; + throw new Exception("Could not find any valid Report Ref, got " + theType + " should be any of " + VMETypeIdentifier.values()); } } 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 ddc90f3..bbbff88 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 @@ -26,6 +26,8 @@ public interface ReportService extends RemoteService{ ArrayList listVMEReportRefByType(VMETypeIdentifier refType); Model importVMEReport(String id, String name); + + Model importVMEReportRef(String id, VMETypeIdentifier refType); String save(String filePath, String workspaceFolderId, String ItemName, TypeExporter type, boolean overwrite) 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 11c423c..7a7b54c 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 @@ -78,4 +78,6 @@ public interface ReportServiceAsync { void importVMEReport(String id, String name, AsyncCallback callback); void listVMEReportRefByType(VMETypeIdentifier refType, AsyncCallback> callback); + void importVMEReportRef(String id, VMETypeIdentifier refType, + AsyncCallback callback); } diff --git a/src/main/java/org/gcube/portlets/user/reportgenerator/client/targets/ClientRepeatableSequence.java b/src/main/java/org/gcube/portlets/user/reportgenerator/client/targets/ClientRepeatableSequence.java index 4f224bf..4c00a82 100644 --- a/src/main/java/org/gcube/portlets/user/reportgenerator/client/targets/ClientRepeatableSequence.java +++ b/src/main/java/org/gcube/portlets/user/reportgenerator/client/targets/ClientRepeatableSequence.java @@ -134,7 +134,7 @@ public class ClientRepeatableSequence extends Composite implements ClientSequenc } @Override - public boolean add(RepeatableSequence sequence) { + public boolean add(String id, RepeatableSequence sequence) { SequenceWidget seqW = new SequenceWidget(p, this, sequence, false, true); myPanel.add(seqW); return true; @@ -147,5 +147,10 @@ public class ClientRepeatableSequence extends Composite implements ClientSequenc groupedComponents.remove(tc); } return toRemove; + } + + @Override + public void AddButtonClicked(RepeatableSequence sequence) { + add("not needed", sequence); } } diff --git a/src/main/java/org/gcube/portlets/user/reportgenerator/client/targets/ClientSequence.java b/src/main/java/org/gcube/portlets/user/reportgenerator/client/targets/ClientSequence.java index b836315..96c8962 100644 --- a/src/main/java/org/gcube/portlets/user/reportgenerator/client/targets/ClientSequence.java +++ b/src/main/java/org/gcube/portlets/user/reportgenerator/client/targets/ClientSequence.java @@ -9,7 +9,9 @@ public interface ClientSequence { ArrayList getGroupedComponents(); - boolean add(RepeatableSequence sequence); + boolean add(String id, RepeatableSequence sequence); SequenceWidget remove(SequenceWidget toRemove); + + void AddButtonClicked(RepeatableSequence sequence); } diff --git a/src/main/java/org/gcube/portlets/user/reportgenerator/client/targets/ClientTuple.java b/src/main/java/org/gcube/portlets/user/reportgenerator/client/targets/ClientTuple.java index 9d8b8be..90b4ee3 100644 --- a/src/main/java/org/gcube/portlets/user/reportgenerator/client/targets/ClientTuple.java +++ b/src/main/java/org/gcube/portlets/user/reportgenerator/client/targets/ClientTuple.java @@ -8,6 +8,8 @@ import org.gcube.portlets.user.reportgenerator.client.Presenter.Presenter; import org.gcube.portlets.user.reportgenerator.client.model.TemplateComponent; import org.gcube.portlets.user.reportgenerator.shared.VMETypeIdentifier; +import com.google.gwt.core.shared.GWT; +import com.google.gwt.event.dom.client.HasClickHandlers; import com.google.gwt.user.client.Window; import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.VerticalPanel; @@ -35,22 +37,26 @@ public class ClientTuple extends Composite implements ClientSequence { this.tupleList = tupleList; for (Tuple seq : tupleList) { if (myPanel.getWidgetCount()==0) { // if is the first one - first = new SequenceWidget(p, this, seq, true, false); - if (tupleList.size() == 1) { - first.enableClear(); - } + first = getMasterSequence(seq); myPanel.add(first); } else { SequenceWidget seqW = new SequenceWidget(p, this, seq, false, false); myPanel.add(seqW); - } - - - + } } - initWidget(myPanel); } + + /** + * the first seq has to behave differently + */ + private SequenceWidget getMasterSequence(RepeatableSequence seq) { + SequenceWidget toReturn = new SequenceWidget(p, this, seq, true, false); + if (tupleList.size() == 1) { + toReturn.enableClear(); + } + return toReturn; + } public ArrayList getTupleList() { @@ -69,22 +75,20 @@ public class ClientTuple extends Composite implements ClientSequence { } @Override - public boolean add(RepeatableSequence sequence) { - Tuple tuple = (Tuple) sequence; - VMETypeIdentifier type2Pass = null; - if (tuple.getKey().equals("GENERAL_MEASURE")) - type2Pass = VMETypeIdentifier.GeneralMeasure; - else if (tuple.getKey().equals("INFORMATION_SOURCE")) - type2Pass = VMETypeIdentifier.InformationSource; - else if (tuple.getKey().equals("FISHERY_AREA_HISTORY")) - type2Pass = VMETypeIdentifier.FisheryAreasHistory; - else if (tuple.getKey().equals("VMES_HISTORY")) - type2Pass = VMETypeIdentifier.VmesHistory; - else { - Window.alert("Could not find any valid Report Ref, got " + tuple.getKey()); - return false; + public boolean add(String id, RepeatableSequence sequence) { + if (first.isSelectNewEnabled()) { + first = getMasterSequence(sequence); + myPanel.clear(); + myPanel.add(first); + tupleList.clear(); + } else { + SequenceWidget seqW = new SequenceWidget(p, this, sequence, false, true); + myPanel.add(seqW); + first.hideClearAssociationButton(); } - p.showVMERefAssociateDialog(type2Pass); + //needed for the model //TODO: preserve the id!! + Tuple toAdd = new Tuple(id, sequence.getGroupedComponents()); + tupleList.add(toAdd); return true; } @@ -98,7 +102,25 @@ public class ClientTuple extends Composite implements ClientSequence { tupleList.remove(toRemove.getSequence()); if (tupleList.size() == 1) first.enableClear(); + + GWT.log("List Tuple Size = "+tupleList.size()); return toRemove; } + + @Override + public void AddButtonClicked(RepeatableSequence sequence) { + Tuple tuple = (Tuple) sequence; + VMETypeIdentifier type2Pass = null; + try { + type2Pass = p.getTypeIdFromString(tuple.getKey()); + } catch (Exception e) { + e.printStackTrace(); + } + p.showVMERefAssociateDialog(type2Pass); + p.setClientSequenceSelected(this); //important! + } + + + } diff --git a/src/main/java/org/gcube/portlets/user/reportgenerator/client/targets/SequenceWidget.java b/src/main/java/org/gcube/portlets/user/reportgenerator/client/targets/SequenceWidget.java index 754d155..6dc5a90 100644 --- a/src/main/java/org/gcube/portlets/user/reportgenerator/client/targets/SequenceWidget.java +++ b/src/main/java/org/gcube/portlets/user/reportgenerator/client/targets/SequenceWidget.java @@ -13,7 +13,6 @@ import com.google.gwt.core.client.GWT; import com.google.gwt.dom.client.Style.Unit; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; -import com.google.gwt.user.client.Window; import com.google.gwt.user.client.ui.Button; import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.HTML; @@ -27,16 +26,18 @@ public class SequenceWidget extends Composite { private Button addAnotherB = new Button("Add another Entry"); private Button removeThisB = new Button("Remove Entry"); - private Button selectEntryB = new Button("Select New"); - private Presenter p; + private Button selectNewB = new Button("Select New"); + private Button clearB = new Button("Clear Association"); + private HorizontalPanel buttonPanel = new HorizontalPanel(); HorizontalPanel buttonsWrapperPanel = new HorizontalPanel(); private ClientSequence owner; private RepeatableSequence repSequence; private ArrayList seqGroupedComponents = new ArrayList(); + + private boolean isSelectingNew = false; public SequenceWidget(Presenter p, ClientSequence owner, RepeatableSequence repSequence, boolean notRemovable, boolean isNew) { - this.p = p; this.owner = owner; this.repSequence = repSequence; addAnotherB.getElement().getStyle().setMargin(10, Unit.PX); @@ -78,7 +79,7 @@ public class SequenceWidget extends Composite { }); } else { - + removeThisB.getElement().getStyle().setWidth(130, Unit.PX); removeThisB.getElement().getStyle().setMargin(10, Unit.PX); removeThisB.addStyleName("deleteEntryButton"); @@ -90,25 +91,33 @@ public class SequenceWidget extends Composite { removeMe(); } }); - + buttonsWrapperPanel.add(addAnotherB); addAnotherB.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { - addAnother(); + addAnother(); } }); - - + + } } - private void selectNew() { - owner.add(repSequence); + protected boolean hideClearAssociationButton() { + return buttonsWrapperPanel.remove(clearB); } + + private void addAnother() { + owner.AddButtonClicked(repSequence); + } + + private void selectNew() { + owner.AddButtonClicked(repSequence); + } + public void enableClear() { - Button clearB = new Button("Clear Association"); clearB.getElement().getStyle().setWidth(130, Unit.PX); clearB.getElement().getStyle().setMargin(10, Unit.PX); clearB.addStyleName("deleteAssociationButton"); @@ -119,13 +128,13 @@ public class SequenceWidget extends Composite { clearAssociation(); } }); - + buttonsWrapperPanel.insert(clearB, 0); - + } - + public void clearAssociation() { - + GWT.log("Clearing Association"); //in the MODEL for (BasicComponent bc : repSequence.getGroupedComponents()) { @@ -141,20 +150,25 @@ public class SequenceWidget extends Composite { } } buttonsWrapperPanel.clear(); - selectEntryB.getElement().getStyle().setWidth(130, Unit.PX); - selectEntryB.getElement().getStyle().setMargin(10, Unit.PX); - selectEntryB.addStyleName("deleteAssociationButton"); - - selectEntryB.addClickHandler(new ClickHandler() { + selectNewB.getElement().getStyle().setWidth(130, Unit.PX); + selectNewB.getElement().getStyle().setMargin(10, Unit.PX); + selectNewB.addStyleName("deleteAssociationButton"); + + selectNewB.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { selectNew(); } }); - - buttonsWrapperPanel.add(selectEntryB); + + buttonsWrapperPanel.add(selectNewB); + isSelectingNew = true; } + protected boolean isSelectNewEnabled() { + return isSelectingNew; + } + public void add(TemplateComponent toAdd) { if (toAdd.getType() != ComponentType.REPEAT_SEQUENCE_INNER) { owner.getGroupedComponents().add(toAdd); @@ -172,14 +186,12 @@ public class SequenceWidget extends Composite { buttonsWrapperPanel.remove(addAnotherB); } - private void addAnother() { - owner.add(repSequence); - } + private void removeMe() { owner.remove(this); } - + public RepeatableSequence getSequence() { return repSequence; } 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 f431de9..5c72e77 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 @@ -32,6 +32,8 @@ import org.gcube.application.framework.accesslogger.library.impl.AccessLogger; import org.gcube.application.framework.core.session.ASLSession; import org.gcube.application.framework.core.session.SessionManager; import org.gcube.application.reporting.ReportsModeler; +import org.gcube.application.reporting.reference.DBTableRow; +import org.gcube.application.reporting.reference.ReferenceReportType; import org.gcube.application.rsg.service.dto.ReportEntry; import org.gcube.application.rsg.service.dto.ReportType; import org.gcube.applicationsupportlayer.social.ApplicationNotificationsManager; @@ -63,6 +65,7 @@ import org.gcube.portlets.d4sreporting.common.server.ServiceUtil; import org.gcube.portlets.d4sreporting.common.shared.BasicComponent; import org.gcube.portlets.d4sreporting.common.shared.BasicSection; 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.d4sreporting.common.shared.RepTimeSeries; import org.gcube.portlets.d4sreporting.common.shared.RepeatableSequence; @@ -1539,4 +1542,44 @@ public class ReportServiceImpl extends RemoteServiceServlet implements ReportSe } + public Model importVMEReportRef(String id, VMETypeIdentifier refType) { + String reportName = "Sample VME Report imported with id: " + id; + ReportsModeler rm = new ReportsModeler( + UUID.randomUUID().toString(), + reportName, + getASLSession().getUsername(), + new Date(), + new Date(), + getASLSession().getUsername() + ); + //construct the options (the references) + ArrayList dBTableRows = new ArrayList(); + + ArrayList md = new ArrayList(); + + Random generator = new Random(); + int year = generator.nextInt(15) + 2000; + + md.add(new Metadata("Year", ""+year)); + year = generator.nextInt(15) + 2000; + md.add(new Metadata("Validity Period - Start", ""+year)); + year = generator.nextInt(15) + 2000; + md.add(new Metadata("Validity Period - End", ""+year)); + md.add(new Metadata("VME Specific Measure Summary", + "2011 Roll over of existing measures until 31 Dec 2014. " + UUID.randomUUID().toString() + + "Closed to demersal fishing with possibilities of an exploratory fishing not exceed-ing 20% " + + "of the fishable area of each seamount. (CEM 2011, Art. 15)")); + md.add(new Metadata("Link Bookmarked", "http://archive.nafo.int/open/fc/2012/fcdoc12-01.pdf")); + md.add(new Metadata("Link Source URL", "http://archive.nafo.int/open/fc/2012/fcdoc12-01.pdf")); + dBTableRows.add(new DBTableRow(md)); + rm.addReference(ReferenceReportType.GeneralMeasure, dBTableRows); + try { + return rm.getReportInstance(); + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + }