From a3b5045ef76d1d21dce09039c2b119de3445c286 Mon Sep 17 00:00:00 2001 From: "francesco.mangiacrapa" Date: Thu, 3 Nov 2022 17:03:15 +0100 Subject: [PATCH] in progress on #24028 --- README.md | 2 + .../client/GeoportalDataViewer.java | 89 ++++++++++++++---- .../client/LayerManager.java | 4 +- .../client/events/ShowDetailsEvent.java | 39 +++++++- .../events/TimelineProjectRelationsEvent.java | 80 ++++++++++++++++ .../TimelineProjectRelationsEventHandler.java | 20 ++++ .../client/resources/GNAImages.java | 8 +- .../client/resources/map1.png | Bin 0 -> 705 bytes .../client/resources/spinner_clock.gif | Bin 0 -> 20009 bytes .../client/resources/spinner_clock2.gif | Bin 0 -> 3245 bytes .../client/resources/spinner_earth.gif | Bin 0 -> 21734 bytes .../client/ui/DetailsPanel.java | 2 +- .../client/ui/cms/project/ProjectViewer.java | 28 +++++- .../relation/TimelineRelationPanel.java | 81 ++++++++++++++-- .../relation/TimelineRelationPanel.ui.xml | 10 +- .../ui/cms/search/SearchFacilityUI.java | 6 +- .../client/util/LoaderIcon.java | 19 ++++ .../GeoportalDataViewerServiceImpl.java | 65 ++++++++++++- src/main/webapp/GeoportalDataViewer.css | 2 +- src/main/webapp/GeoportalDataViewer.html | 10 +- .../GeoPortalDataViewerAppPortlet_view.jsp | 4 +- 21 files changed, 417 insertions(+), 52 deletions(-) create mode 100644 src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/events/TimelineProjectRelationsEvent.java create mode 100644 src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/events/TimelineProjectRelationsEventHandler.java create mode 100644 src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/resources/map1.png create mode 100644 src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/resources/spinner_clock.gif create mode 100644 src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/resources/spinner_clock2.gif create mode 100644 src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/resources/spinner_earth.gif diff --git a/README.md b/README.md index 7ae475e..ba1be3a 100644 --- a/README.md +++ b/README.md @@ -13,6 +13,8 @@ The GeoPortal Data Viewer App is an application to access, discovery and navigat * GWT-Bootstrap v.2.3.2.0. [GWT-Bootstrap](https://github.com/gwtbootstrap) is licensed under [[Apache License 2.0](http://www.apache.org/licenses/LICENSE-2.0) * GWT-OpenLayers 3+ v.8.1.0-gwt2_9. [GWT-OL3](https://github.com/TDesjardins/gwt-ol) * OpenLayers v.6.X. [OpenLayers](https://openlayers.org/) is licensed under [BSD 2-Clause "Simplified"](https://github.com/openlayers/openlayers/blob/main/LICENSE.md) +* Vis-Timeline v7.x [VisTimeline](https://github.com/visjs/vis-timeline) is licensed under [Apache License 2.0](http://www.apache.org/licenses/LICENSE-2.0) and MIT +* Handlebarsjs v4.X [Handlebarsjs](https://handlebarsjs.com/) is licensed under MIT ## Documentation diff --git a/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/GeoportalDataViewer.java b/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/GeoportalDataViewer.java index 83a32f3..94831c1 100644 --- a/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/GeoportalDataViewer.java +++ b/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/GeoportalDataViewer.java @@ -9,6 +9,8 @@ import org.gcube.application.geoportalcommon.shared.GeoportalItemReferences; import org.gcube.application.geoportalcommon.shared.geoportal.DocumentDV; import org.gcube.application.geoportalcommon.shared.geoportal.geojson.GeoJSON; import org.gcube.application.geoportalcommon.shared.geoportal.materialization.IndexLayerDV; +import org.gcube.application.geoportalcommon.shared.geoportal.project.ProjectDV; +import org.gcube.application.geoportalcommon.shared.geoportal.project.RelationshipDV; import org.gcube.application.geoportalcommon.shared.geoportal.view.ProjectView; import org.gcube.portlets.user.geoportaldataviewer.client.GeoportalDataViewerConstants.MAP_PROJECTION; import org.gcube.portlets.user.geoportaldataviewer.client.GeoportalDataViewerConstants.MapEventType; @@ -32,6 +34,9 @@ import org.gcube.portlets.user.geoportaldataviewer.client.events.ShowDetailsEven import org.gcube.portlets.user.geoportaldataviewer.client.events.ShowDetailsEventHandler; import org.gcube.portlets.user.geoportaldataviewer.client.events.ShowPopupOnCentroiEvent; import org.gcube.portlets.user.geoportaldataviewer.client.events.ShowPopupOnCentroiEventHandler; +import org.gcube.portlets.user.geoportaldataviewer.client.events.TimelineProjectRelationsEvent; +import org.gcube.portlets.user.geoportaldataviewer.client.events.TimelineProjectRelationsEvent.EVENT_TYPE; +import org.gcube.portlets.user.geoportaldataviewer.client.events.TimelineProjectRelationsEventHandler; import org.gcube.portlets.user.geoportaldataviewer.client.events.ZoomOutOverMinimumEvent; import org.gcube.portlets.user.geoportaldataviewer.client.events.ZoomOutOverMinimumEventHandler; import org.gcube.portlets.user.geoportaldataviewer.client.events.collections.CloseCollectionEvent; @@ -41,6 +46,7 @@ import org.gcube.portlets.user.geoportaldataviewer.client.events.collections.Ope import org.gcube.portlets.user.geoportaldataviewer.client.gis.ExtentWrapped; import org.gcube.portlets.user.geoportaldataviewer.client.gis.MapUtils; import org.gcube.portlets.user.geoportaldataviewer.client.gis.OpenLayerMap; +import org.gcube.portlets.user.geoportaldataviewer.client.resources.GNAImages; import org.gcube.portlets.user.geoportaldataviewer.client.ui.GeonaDataViewMainPanel; import org.gcube.portlets.user.geoportaldataviewer.client.ui.cms.project.relation.TimelineRelationPanel; import org.gcube.portlets.user.geoportaldataviewer.client.util.ControlledCallBack; @@ -77,6 +83,8 @@ import ol.layer.Image; */ public class GeoportalDataViewer implements EntryPoint { + public static final String DIV_TIMELINE_DATA = "timeline-data"; + /** The Constant APP_DIV. */ public final static String APP_DIV = "geoportal-data-viewer"; @@ -110,7 +118,8 @@ public class GeoportalDataViewer implements EntryPoint { int attempt = 0; - private LoaderIcon loaderApp = new LoaderIcon("Loading application... please wait"); + private LoaderIcon loaderApp = new LoaderIcon("Loading application... please wait", + new com.google.gwt.user.client.ui.Image(GNAImages.ICONS.spinnerEarth())); private HTML attributionDiv = new HTML(); @@ -135,7 +144,9 @@ public class GeoportalDataViewer implements EntryPoint { GWT.log(GeoportalDataViewerConstants.GET_GEONA_ITEM_ID + " = " + paramGeonaItemID); GWT.log(GeoportalDataViewerConstants.GET_LAYER_TITLE + " = " + paramLayerTitle); - RootPanel.get(APP_DIV).add(loaderApp); + // RootPanel.get(APP_DIV).add(loaderApp); + + hideTimelineProjectRelations(); GeoportalDataViewerServiceAsync.Util.getInstance() .getConfigListOfFieldsForSearching(new AsyncCallback>() { @@ -203,7 +214,7 @@ public class GeoportalDataViewer implements EntryPoint { ScriptInjector.fromUrl( "//cdnjs.cloudflare.com/ajax/libs/nanogallery2/3.0.5/jquery.nanogallery2.min.js") .setWindow(ScriptInjector.TOP_WINDOW).inject(); - + GWT.log("Loading collections, count " + result.getAvailableCollections().size()); mainPanel.setAvailableCollections(result.getAvailableCollections().values()); @@ -218,13 +229,13 @@ public class GeoportalDataViewer implements EntryPoint { } GeoportalItemReferences gir = new GeoportalItemReferences(paramGeonaItemID, paramGeonaItemType); - applicationBus.fireEvent(new ShowDetailsEvent(gir, null, null)); + applicationBus.fireEvent(new ShowDetailsEvent(gir, null, null, true)); } // TODO LOAD INITIAL LAYERS GWT.log("DONE INIT LOAD"); - + } }); @@ -241,20 +252,20 @@ public class GeoportalDataViewer implements EntryPoint { bindEvents(); RootPanel.get(APP_DIV).add(attributionDiv); - + new Timer() { - + @Override public void run() { GWT.log("Instancing timeline"); - TimelineRelationPanel timeline = new TimelineRelationPanel("concessione", "projectid"); - RootPanel.get("timeline-data").add(timeline); - - } - }.schedule(5000); - + ProjectDV project = new ProjectDV(); + project.setId("fake"); + project.setProfileID("fake"); + applicationBus.fireEvent(new TimelineProjectRelationsEvent(project, EVENT_TYPE.SHOW)); + + } + }.schedule(1000); - // Modal modal = new Modal(true, true); // modal.setWidth(400); // @@ -323,7 +334,7 @@ public class GeoportalDataViewer implements EntryPoint { // Open Index Layer layerManager.addIndexLayer(layer, toOpen.getUcd().getProfileID()); - + } } }); @@ -350,7 +361,7 @@ public class GeoportalDataViewer implements EntryPoint { applicationBus.addHandler(ShowDetailsEvent.TYPE, new ShowDetailsEventHandler() { @Override - public void onShowDetails(ShowDetailsEvent showDetailsEvent) { + public void onShowDetails(final ShowDetailsEvent showDetailsEvent) { GWT.log("Fired event: " + showDetailsEvent); String projectID = showDetailsEvent.getProjectID(); @@ -378,6 +389,17 @@ public class GeoportalDataViewer implements EntryPoint { @Override public void onSuccess(ProjectView result) { mainPanel.showAsDetails(result, showDetailsEvent.getGeonaItemRef()); + + List relationships = result.getTheProjectDV().getRelationships(); + + if (showDetailsEvent.isLoadTimelineRelationships() + && relationships!= null && relationships.size() > 0) { + GWT.log("LoadTimelineRelationships is true and the project has Relationships"); + showTimelineProjectRelations(result.getTheProjectDV()); + } else { + hideTimelineProjectRelations(); + } + } }); @@ -489,6 +511,7 @@ public class GeoportalDataViewer implements EntryPoint { @Override public void onClosed(ClosedViewDetailsEvent closedViewDetailsEvent) { olMapMng.hidePopInfo(); + applicationBus.fireEvent(new TimelineProjectRelationsEvent(null, EVENT_TYPE.HIDE)); } }); @@ -501,6 +524,26 @@ public class GeoportalDataViewer implements EntryPoint { } }); + applicationBus.addHandler(TimelineProjectRelationsEvent.TYPE, new TimelineProjectRelationsEventHandler() { + + @Override + public void onTimelineRelationEvent(TimelineProjectRelationsEvent timelineProjectRelationsEvent) { + + switch (timelineProjectRelationsEvent.getEventType()) { + case SHOW: { + showTimelineProjectRelations(timelineProjectRelationsEvent.getTheProjectDV()); + break; + } + case HIDE: + default: { + hideTimelineProjectRelations(); + break; + } + } + + } + }); + applicationBus.addHandler(DoActionOnDetailLayersEvent.TYPE, new DoActionOnDetailLayersEventHandler() { @Override @@ -625,6 +668,20 @@ public class GeoportalDataViewer implements EntryPoint { // // }-*/; + private void showTimelineProjectRelations(ProjectDV theProject) { + GWT.log("Showing project relations for: " + theProject); + RootPanel.get(DIV_TIMELINE_DATA).clear(); + RootPanel.get(DIV_TIMELINE_DATA).setVisible(true); + TimelineRelationPanel timeline = new TimelineRelationPanel(applicationBus, theProject); + RootPanel.get(DIV_TIMELINE_DATA).add(timeline); + } + + private void hideTimelineProjectRelations() { + GWT.log("hideTimelineProjectRelations"); + RootPanel.get(DIV_TIMELINE_DATA).setVisible(false); + RootPanel.get(DIV_TIMELINE_DATA).clear(); + } + private void performWFSQueryOnCentroid(String projectID, Double centroidLong, Double centroidLat) { GWT.log("Perform performWFSQueryOnCentroid: " + projectID + " long: " + centroidLong + ", lat: " + centroidLat); if (projectID != null) { diff --git a/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/LayerManager.java b/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/LayerManager.java index 391fd5b..07ffb6b 100644 --- a/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/LayerManager.java +++ b/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/LayerManager.java @@ -417,7 +417,7 @@ public class LayerManager { LayerObjectType layerObjectType = layerObject.getType(); return new ShowDetailsEvent(layerObjectType != null ? layerObjectType.name() : null, - layerObject.getProfileID(), productId, itemName, fRow); + layerObject.getProfileID(), productId, itemName, fRow, true); } return null; @@ -807,7 +807,7 @@ public class LayerManager { public void onBrowserEvent(Event event) { if (Event.ONCLICK == event.getTypeInt()) { applicationBus.fireEvent(new ShowDetailsEvent(lo.getType().name(), - lo.getProfileID(), newProjectID, null, null)); + lo.getProfileID(), newProjectID, null, null, true)); } } diff --git a/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/events/ShowDetailsEvent.java b/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/events/ShowDetailsEvent.java index 7d81c50..0b6713d 100644 --- a/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/events/ShowDetailsEvent.java +++ b/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/events/ShowDetailsEvent.java @@ -19,6 +19,7 @@ public class ShowDetailsEvent extends GwtEvent { private String itemName; private String profileID; private String projectID; + private boolean loadTimelineRelationships; /** * Instantiates a new show details event. @@ -29,13 +30,13 @@ public class ShowDetailsEvent extends GwtEvent { * @param featureRow the feature row */ public ShowDetailsEvent(String layerObjectType, String profileID, String projectID, String itemName, - FeatureRow featureRow) { + FeatureRow featureRow, boolean loadTimelineRelationships) { this.layerObjectType = layerObjectType; this.profileID = profileID; this.projectID = projectID; this.itemName = itemName; this.featureRow = featureRow; - + this.loadTimelineRelationships = loadTimelineRelationships; } /** @@ -44,13 +45,15 @@ public class ShowDetailsEvent extends GwtEvent { * @param gir the gir * @param itemName the item name * @param featureRow the feature row + * @param loadTimelineRelationships the load timeline relationships */ - public ShowDetailsEvent(GeoportalItemReferences gir, String itemName, FeatureRow featureRow) { + public ShowDetailsEvent(GeoportalItemReferences gir, String itemName, FeatureRow featureRow, boolean loadTimelineRelationships) { this.layerObjectType = gir.getLayerObjectType(); this.profileID = gir.getProfileID(); this.projectID = gir.getProjectID(); this.itemName = itemName; this.featureRow = featureRow; + this.loadTimelineRelationships = loadTimelineRelationships; } public static Type getTYPE() { @@ -116,6 +119,15 @@ public class ShowDetailsEvent extends GwtEvent { public void setItemName(String itemName) { this.itemName = itemName; } + + /** + * Checks if is load timeline relationships. + * + * @return true, if is load timeline relationships + */ + public boolean isLoadTimelineRelationships() { + return loadTimelineRelationships; + } /** * Gets the geona item ref. @@ -126,4 +138,25 @@ public class ShowDetailsEvent extends GwtEvent { return new GeoportalItemReferences(projectID, profileID, layerObjectType); } + @Override + public String toString() { + StringBuilder builder = new StringBuilder(); + builder.append("ShowDetailsEvent [layerObjectType="); + builder.append(layerObjectType); + builder.append(", featureRow="); + builder.append(featureRow); + builder.append(", itemName="); + builder.append(itemName); + builder.append(", profileID="); + builder.append(profileID); + builder.append(", projectID="); + builder.append(projectID); + builder.append(", loadTimelineRelationships="); + builder.append(loadTimelineRelationships); + builder.append("]"); + return builder.toString(); + } + + + } \ No newline at end of file diff --git a/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/events/TimelineProjectRelationsEvent.java b/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/events/TimelineProjectRelationsEvent.java new file mode 100644 index 0000000..a576140 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/events/TimelineProjectRelationsEvent.java @@ -0,0 +1,80 @@ +package org.gcube.portlets.user.geoportaldataviewer.client.events; + +import org.gcube.application.geoportalcommon.shared.geoportal.project.ProjectDV; + +import com.google.gwt.event.shared.GwtEvent; + +/** + * The Class TimelineProjectRelationsEvent. + * + * @author Francesco Mangiacrapa at ISTI-CNR francesco.mangiacrapa@isti.cnr.it + * + * Nov 3, 2022 + */ +public class TimelineProjectRelationsEvent extends GwtEvent { + public static Type TYPE = new Type(); + private EVENT_TYPE eventType = EVENT_TYPE.HIDE; //default + private ProjectDV theProjectDV; + + /** + * The Enum EVENT_TYPE. + * + * @author Francesco Mangiacrapa at ISTI-CNR francesco.mangiacrapa@isti.cnr.it + * + * Nov 3, 2022 + */ + public enum EVENT_TYPE { + SHOW, HIDE + } + + /** + * Instantiates a new timeline project relations event. + * + * @param theProjectDV the the project DV + * @param eventType the event type + */ + public TimelineProjectRelationsEvent(ProjectDV theProjectDV, EVENT_TYPE eventType) { + this.theProjectDV = theProjectDV; + this.eventType = eventType; + } + + /** + * Gets the associated type. + * + * @return the associated type + */ + @Override + public Type getAssociatedType() { + return TYPE; + } + + /** + * Dispatch. + * + * @param handler the handler + */ + @Override + protected void dispatch(TimelineProjectRelationsEventHandler handler) { + handler.onTimelineRelationEvent(this); + + } + + /** + * Gets the event type. + * + * @return the event type + */ + public EVENT_TYPE getEventType() { + return eventType; + } + + /** + * Gets the the project DV. + * + * @return the the project DV + */ + public ProjectDV getTheProjectDV() { + return theProjectDV; + } + +} \ No newline at end of file diff --git a/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/events/TimelineProjectRelationsEventHandler.java b/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/events/TimelineProjectRelationsEventHandler.java new file mode 100644 index 0000000..96df34b --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/events/TimelineProjectRelationsEventHandler.java @@ -0,0 +1,20 @@ +package org.gcube.portlets.user.geoportaldataviewer.client.events; + +import com.google.gwt.event.shared.EventHandler; + +/** + * The Interface TimelineProjectRelationsEventHandler. + * + * @author Francesco Mangiacrapa at ISTI-CNR francesco.mangiacrapa@isti.cnr.it + * + * Nov 3, 2022 + */ +public interface TimelineProjectRelationsEventHandler extends EventHandler { + + /** + * On timeline relation event. + * + * @param timelineProjectRelationsEvent the timeline project relations event + */ + void onTimelineRelationEvent(TimelineProjectRelationsEvent timelineProjectRelationsEvent); +} diff --git a/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/resources/GNAImages.java b/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/resources/GNAImages.java index ae46827..ae1ee6e 100644 --- a/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/resources/GNAImages.java +++ b/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/resources/GNAImages.java @@ -17,7 +17,7 @@ public interface GNAImages extends ClientBundle { * Our sample image icon. Makes the image resource for the gwt-compiler's css * composer accessible */ - @Source("map.png") + @Source("map1.png") ImageResource map(); @Source("preset_location.png") @@ -46,5 +46,11 @@ public interface GNAImages extends ClientBundle { @Source("layer_invisible.png") ImageResource layerInvisible(); + + @Source("spinner_earth.gif") + ImageResource spinnerEarth(); + + @Source("spinner_clock2.gif") + ImageResource spinnerClock(); } diff --git a/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/resources/map1.png b/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/resources/map1.png new file mode 100644 index 0000000000000000000000000000000000000000..b85b944a9b5c54f978bef42de07fb3717fe9130f GIT binary patch literal 705 zcmV;y0zUnTP)5r00004b3#c}2nYxW zdQFt1$WMGdfRILX z9JR9GU$KFch#8<}bqMF4(%4l=#93#wH4VgpI8EJ0QL7r!S>hctAWCz0Eo!g<5O#7$z4@(Z2Jy;#@+QT z$R!*Xm37p7C=8j#$TTr0*kGFnfcQy9Zfz9h&@?$6&il-JY&F}}VnDoOhA78TQw81> zL$~M1WFL`m+~6z#$1zOWmEa>pd!B)Lj(8zd&Y*-bvK0J2j})Fg!Dwrm%a6;+t~P*1 zP{IhG3IG84gV7`#B?(4b)3o#)!lxdn1Ko?tJch%lWHFk=^4>9U=a&%ey^H7=E7{3l n)nX5X3w_7%+!{n?ch>y{NqO^dTrPw&00000NkvXXu0mjfG%G7; literal 0 HcmV?d00001 diff --git a/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/resources/spinner_clock.gif b/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/resources/spinner_clock.gif new file mode 100644 index 0000000000000000000000000000000000000000..a06cceaf3f0a0d9c13918104f0c25a0d8588ec52 GIT binary patch literal 20009 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 S%AhLu$_5Q?UArEq`Tq}95YXoU literal 0 HcmV?d00001 diff --git a/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/resources/spinner_clock2.gif b/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/resources/spinner_clock2.gif new file mode 100644 index 0000000000000000000000000000000000000000..22801e453cdaac1843a7d1d42c9df43dde63b83f GIT binary patch literal 3245 zcmcJRYfuws7=<^xD}=Dn1yK_Xc0t8J5JTz((dh(2A_2j0Q$&gh3Pte}JE%z2A%Orw zR7A9j7UB&N6oW>MXe%JMfK-IEwKlbpGF1U9rPNW&NH+wKN@yoDbZ2(*Z2FMGRw>*{;k*VWP0_olD6r?9QXHuh{iEV|Y)bgT@x8%N9U6G^KHL2UR zG6s-2+i@m~b9-k3X|WcBL)*=Kmf< z(&A(WEF5K+3}?mRMv}oH*=kx7O~ll@2~>XmyX3Xpo|{sWiKw2L9vl6 zLsIF#@G^9OtF!6KQ!FM`$gnqmw!5XG_{d&rjb%vn4y1bbzKpyNW}wz{%vdkNc@0M= z&JKkW1J8!+mFJy3Q?64aE*q39pF0*%N0$jg`5J`kY`WPmpzTqs4#%bye&0YdqhGWL zst@&oRS8ei*azG(%|U2(&P+T>F;Mpf`&_gZ+rRtyd5%bby^+Td_7ll9Jox=a6!>2%}FuP=Dq#^+wNv zX8yQjha(y^gI;_6apQ_hH+Ft470godrxmyZb;&br+1?&-8X^J2=i(?N68QK@>PysP zh2%|#L3`^lZE2DVIPVK@AW8Wg^S(QsAa{N42#BGz+2rm(2yCklx63SKOVGpsOC}_~ z(GwPPNpH(@j-z!S2(C#1VWUPhkxXVu@2oHnRQ^I_c&YrInxp(>ek3i+-GGr4=Y00{h*0iRmX@CZG?BYyeQ&!1AaLC4!RlsVHb$$je6E&?2BRDZu&YgB3^T?>UB7Jk5yz zOkX&BjM7}QI8}RxfYhExfs@2V!7?2kUYZ6zmNN>Y>!k7uNhy-yb9iuQ?lQJw3>U&!!VFqAm7z(^3HI9O3JaErkbz>$rK7Ylyk6Q#{_89K^PL&(OZ4~-uHNkD{uc z>z+9-t+0Ghf=`y~1hc6^wQK5)S%-p(rZ!TYPpH+Ou4R^WE#ZP*U{svv=@{UZ^Bhu5 z>tz5boRk9iFTzSAdG15&n||937#EZ1SKS{x=XVD9>vY$a`NRc7wYi@j_w~A;-{?X9 y<8|qcod_Z>t~*E(Rr3i45qsdYQ@Y~N287fZTcL@~51PxtCXU>|1MlGjbMfDTMmA^w literal 0 HcmV?d00001 diff --git a/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/resources/spinner_earth.gif b/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/resources/spinner_earth.gif new file mode 100644 index 0000000000000000000000000000000000000000..17b552c784aa62ca296c8082c5ad710d7c1af9d8 GIT binary patch literal 21734 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 C_4Jbf literal 0 HcmV?d00001 diff --git a/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/ui/DetailsPanel.java b/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/ui/DetailsPanel.java index 3699e00..1a7f14f 100644 --- a/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/ui/DetailsPanel.java +++ b/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/ui/DetailsPanel.java @@ -70,7 +70,7 @@ public class DetailsPanel extends Composite { detailsHTMLPanel.getParent().getElement().setScrollTop(0); } - datailsContainerPanel.add(new ProjectViewer(geonaItemRef, result)); + datailsContainerPanel.add(new ProjectViewer(applicationBus, geonaItemRef, result)); showPanelDetails(); } diff --git a/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/ui/cms/project/ProjectViewer.java b/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/ui/cms/project/ProjectViewer.java index f253062..b13b689 100644 --- a/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/ui/cms/project/ProjectViewer.java +++ b/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/ui/cms/project/ProjectViewer.java @@ -10,6 +10,8 @@ import org.gcube.application.geoportalcommon.shared.geoportal.view.SectionView; import org.gcube.portlets.user.geoportaldataviewer.client.GeoportalDataViewerConstants; import org.gcube.portlets.user.geoportaldataviewer.client.GeoportalDataViewerConstants.MAP_PROJECTION; import org.gcube.portlets.user.geoportaldataviewer.client.GeoportalDataViewerServiceAsync; +import org.gcube.portlets.user.geoportaldataviewer.client.events.TimelineProjectRelationsEvent; +import org.gcube.portlets.user.geoportaldataviewer.client.events.TimelineProjectRelationsEvent.EVENT_TYPE; import org.gcube.portlets.user.geoportaldataviewer.client.gis.MapUtils; import org.gcube.portlets.user.geoportaldataviewer.client.ui.ModalWindow; import org.gcube.portlets.user.geoportaldataviewer.client.ui.dialogs.DialogShareableLink; @@ -25,6 +27,7 @@ import com.github.gwtbootstrap.client.ui.constants.IconType; import com.google.gwt.core.client.GWT; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; +import com.google.gwt.event.shared.HandlerManager; import com.google.gwt.uibinder.client.UiBinder; import com.google.gwt.uibinder.client.UiField; import com.google.gwt.user.client.Window; @@ -73,16 +76,18 @@ public class ProjectViewer extends Composite { private boolean openImageButtonVisible = true; + private HandlerManager applicationBus; + private ProjectViewer() { initWidget(uiBinder.createAndBindUi(this)); pageViewDetails.getElement().setId("page-view-details"); } - public ProjectViewer(GeoportalItemReferences geoportalItemRefs, ProjectView projectView) { - this(geoportalItemRefs, projectView, true, true); + public ProjectViewer(HandlerManager applicationBus, GeoportalItemReferences geoportalItemRefs, ProjectView projectView) { + this(applicationBus, geoportalItemRefs, projectView, true, true); } - public ProjectViewer(GeoportalItemReferences geoportalItemRefs, final ProjectView projectView, + public ProjectViewer(HandlerManager applicationBus, GeoportalItemReferences geoportalItemRefs, final ProjectView projectView, boolean viewImageButtonVisible, boolean openImageButtonVisible) { this(); GWT.log("Rendering " + projectView.getTheProjectDV().getId()); @@ -90,6 +95,7 @@ public class ProjectViewer extends Composite { this.geoportalItemReferences = geoportalItemRefs; this.viewImageButtonVisible = viewImageButtonVisible; this.openImageButtonVisible = openImageButtonVisible; + this.applicationBus = applicationBus; final String theTitle = projectView.getTheProjectDV().getProfileName() != null ? projectView.getTheProjectDV().getProfileName() @@ -119,7 +125,7 @@ public class ProjectViewer extends Composite { @Override public void onClick(ClickEvent event) { - ProjectViewer cv = new ProjectViewer(geoportalItemReferences, theProjectView, false, + ProjectViewer cv = new ProjectViewer(applicationBus, geoportalItemReferences, theProjectView, false, openImageButtonVisible); cv.setExpandViewButtonVisible(false); int width = Window.getClientWidth() * 75 / 100; @@ -142,6 +148,16 @@ public class ProjectViewer extends Composite { relationshipsButton.setVisible(true); } else relationshipsButton.setVisible(false); + + + relationshipsButton.addClickHandler(new ClickHandler() { + + @Override + public void onClick(ClickEvent event) { + applicationBus.fireEvent(new TimelineProjectRelationsEvent(theProjectView.getTheProjectDV(), EVENT_TYPE.SHOW)); + + } + }); GeoportalDataViewerServiceAsync.Util.getInstance().getMyLogin(new AsyncCallback() { @@ -172,8 +188,9 @@ public class ProjectViewer extends Composite { GeoportalDataViewerConstants.LIGHT_MAP_ITALY_FIT_ZOOM_ON, "70%", "300px"); if (theProjectView != null && theProjectView.getTheProjectDV() != null) { - + GeoJSON spatialReference = theProjectView.getTheProjectDV().getSpatialReference(); + Coordinate transfCoord = MapUtils.geoJSONTToBBoxCenter(spatialReference, MAP_PROJECTION.EPSG_4326.getName(), MAP_PROJECTION.EPSG_3857.getName()); @@ -182,6 +199,7 @@ public class ProjectViewer extends Composite { mapView.addMarker(transfCoord, authenticatedUser); centroidPanel.add(mapView); } + } else if (theProjectView != null) { GeoportalDataViewerConstants .printJs("I cannot add centroid as maker one or both coordinates are null. Lat: " + theProjectView diff --git a/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/ui/cms/project/relation/TimelineRelationPanel.java b/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/ui/cms/project/relation/TimelineRelationPanel.java index 058935a..2c4ce9c 100644 --- a/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/ui/cms/project/relation/TimelineRelationPanel.java +++ b/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/ui/cms/project/relation/TimelineRelationPanel.java @@ -2,17 +2,30 @@ package org.gcube.portlets.user.geoportaldataviewer.client.ui.cms.project.relati import java.util.List; +import org.gcube.application.geoportalcommon.shared.GeoportalItemReferences; +import org.gcube.application.geoportalcommon.shared.geoportal.project.ProjectDV; import org.gcube.portlets.user.geoportaldataviewer.client.GeoportalDataViewerServiceAsync; +import org.gcube.portlets.user.geoportaldataviewer.client.events.ShowDetailsEvent; +import org.gcube.portlets.user.geoportaldataviewer.client.resources.GNAImages; +import org.gcube.portlets.user.geoportaldataviewer.client.ui.cms.project.ProjectUtil; +import org.gcube.portlets.user.geoportaldataviewer.client.util.LoaderIcon; +import com.github.gwtbootstrap.client.ui.Alert; +import com.github.gwtbootstrap.client.ui.constants.AlertType; import com.google.gwt.core.client.GWT; import com.google.gwt.core.client.Scheduler; import com.google.gwt.core.client.Scheduler.ScheduledCommand; +import com.google.gwt.dom.client.Style.TextAlign; +import com.google.gwt.event.shared.HandlerManager; import com.google.gwt.json.client.JSONArray; import com.google.gwt.json.client.JSONParser; import com.google.gwt.uibinder.client.UiBinder; import com.google.gwt.uibinder.client.UiField; import com.google.gwt.user.client.rpc.AsyncCallback; 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.Image; import com.google.gwt.user.client.ui.ScrollPanel; import com.google.gwt.user.client.ui.Widget; @@ -21,13 +34,35 @@ public class TimelineRelationPanel extends Composite { @UiField ScrollPanel timelineContainer; + @UiField + HTMLPanel timelineTitle; + + private LoaderIcon loaderData = new LoaderIcon("Loading data... please wait", new Image(GNAImages.ICONS.spinnerClock())); + + private TimelineRelationPanel instance = this; + + private String selectedProjectID; + + private ProjectDV theProjectDV; + + private HandlerManager applicationBus; + private static TimelineRelationPanelUiBinder uiBinder = GWT.create(TimelineRelationPanelUiBinder.class); interface TimelineRelationPanelUiBinder extends UiBinder { } - public TimelineRelationPanel(String profileID, String projectID) { + public TimelineRelationPanel(HandlerManager applicationBus, ProjectDV theProjectDV) { initWidget(uiBinder.createAndBindUi(this)); + this.theProjectDV = theProjectDV; + this.applicationBus = applicationBus; + + String html = ProjectUtil.toHMLCode(theProjectDV.getTheDocument(), theProjectDV.getId()); + HTML title = new HTML("Relationships of the Project: " + html); + timelineTitle.add(title); + + loaderData.getElement().getStyle().setTextAlign(TextAlign.CENTER); + timelineTitle.add(loaderData); timelineContainer.getElement().setId("visualization"); @@ -35,8 +70,8 @@ public class TimelineRelationPanel extends Composite { public void execute() { - GeoportalDataViewerServiceAsync.Util.getInstance().getRelationshipsForTimeline(profileID, projectID, - new AsyncCallback>() { + GeoportalDataViewerServiceAsync.Util.getInstance().getRelationshipsForTimeline( + theProjectDV.getProfileID(), theProjectDV.getId(), new AsyncCallback>() { @Override public void onSuccess(List result) { @@ -46,13 +81,17 @@ public class TimelineRelationPanel extends Composite { toJsonArr.set(i, JSONParser.parseStrict(result.get(i))); } - instanceTimeline(timelineContainer.getElement().getId(), toJsonArr); + instanceTimeline(timelineContainer.getElement().getId(), toJsonArr, instance); + timelineTitle.remove(loaderData); } @Override public void onFailure(Throwable caught) { - // TODO Auto-generated method stub - + timelineTitle.remove(loaderData); + Alert alert = new Alert(caught.getMessage()); + alert.setType(AlertType.ERROR); + alert.setClose(false); + timelineTitle.add(alert); } }); @@ -61,7 +100,28 @@ public class TimelineRelationPanel extends Composite { } - public static native String instanceTimeline(String idDivContainer, JSONArray jsonItems) /*-{ + private void setSelectedProject(String projectID) { + this.selectedProjectID = projectID; + GWT.log("selectedProjectID: " + selectedProjectID); + + String[] references = this.selectedProjectID.split(","); + + GeoportalItemReferences gir = new GeoportalItemReferences(references[1], + references[0]); + ShowDetailsEvent event = new ShowDetailsEvent(gir, null, null, false); + GWT.log("fireEvetn: "+event); + + //applicationBus.fireEvent(new ShowDetailsEvent(gir, null, null, false)); + + + } + + public String getSelectedProjectID() { + return selectedProjectID; + } + + public static native String instanceTimeline(String idDivContainer, JSONArray jsonItems, + TimelineRelationPanel instance) /*-{ console.log('showTimeline_instanceTimeline for json items: ' + jsonItems); @@ -81,10 +141,15 @@ public class TimelineRelationPanel extends Composite { // Create a DataSet (allows two way data-binding) var items = new $wnd.vis.DataSet(myArray); - // Create a Timeline var timeline = new $wnd.vis.Timeline(container, items, $wnd.optionsTimeline); + timeline.on('select',function(properties, items) { + //console.log('selected: ' + $wnd.JSON.stringify(properties)); + console.log('selected items: ' + properties.items); + instance.@org.gcube.portlets.user.geoportaldataviewer.client.ui.cms.project.relation.TimelineRelationPanel::setSelectedProject(Ljava/lang/String;)(properties.items+'') + }); + }-*/; } diff --git a/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/ui/cms/project/relation/TimelineRelationPanel.ui.xml b/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/ui/cms/project/relation/TimelineRelationPanel.ui.xml index 44e43b6..da7fa19 100644 --- a/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/ui/cms/project/relation/TimelineRelationPanel.ui.xml +++ b/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/ui/cms/project/relation/TimelineRelationPanel.ui.xml @@ -6,12 +6,20 @@ font-weight: bold; } + .timeline_title { + padding: 5px; + background-color: rgba(0, 60, 136, 0.7); + color: white; + } + .timeline { - border: 1px solid lightgray; + /*border: 1px solid lightgray;*/ max-height: 400px; } + diff --git a/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/ui/cms/search/SearchFacilityUI.java b/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/ui/cms/search/SearchFacilityUI.java index c5a3dcc..91d122e 100644 --- a/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/ui/cms/search/SearchFacilityUI.java +++ b/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/ui/cms/search/SearchFacilityUI.java @@ -131,8 +131,8 @@ public class SearchFacilityUI extends Composite { * @param searchForFields the search for fields * @param initialSortFilter the initial sort filter */ - public SearchFacilityUI(String profileID, HandlerManager appManagerBus,List displayByFields, List sortByFields, - List searchForFields, SearchingFilter initialSortFilter) { + public SearchFacilityUI(String profileID, HandlerManager appManagerBus, List displayByFields, + List sortByFields, List searchForFields, SearchingFilter initialSortFilter) { initWidget(uiBinder.createAndBindUi(this)); this.profileID = profileID; this.displayByFields = displayByFields; @@ -331,7 +331,7 @@ public class SearchFacilityUI extends Composite { public void onClick(ClickEvent event) { GeoportalItemReferences gir = new GeoportalItemReferences(resultDoc.getProjectID(), profileID); - appManagerBus.fireEvent(new ShowDetailsEvent(gir, null, null)); + appManagerBus.fireEvent(new ShowDetailsEvent(gir, null, null, true)); GeoJSON spatialReference = resultDoc.getSpatialReference(); Coordinate transfCoord = MapUtils.geoJSONTToBBoxCenter(spatialReference, null, diff --git a/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/util/LoaderIcon.java b/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/util/LoaderIcon.java index 39359b9..4866699 100644 --- a/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/util/LoaderIcon.java +++ b/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/util/LoaderIcon.java @@ -31,10 +31,29 @@ public class LoaderIcon extends HorizontalPanel{ setText(txtHTML); } + + /** + * Instantiates a new loader icon. + * + * @param txtHTML the txt html + */ + public LoaderIcon(String txtHTML, Image spinner) { + setText(txtHTML); + this.imgLoading = spinner!=null?spinner:imgLoading; + setStyleName("marginTop20"); + add(imgLoading); + add(txtLoading); + } + + /** * Instantiates a new loader icon. */ public LoaderIcon() { + init(); + } + + private void init() { setStyleName("marginTop20"); add(imgLoading); add(txtLoading); diff --git a/src/main/java/org/gcube/portlets/user/geoportaldataviewer/server/GeoportalDataViewerServiceImpl.java b/src/main/java/org/gcube/portlets/user/geoportaldataviewer/server/GeoportalDataViewerServiceImpl.java index 59516ef..558267d 100644 --- a/src/main/java/org/gcube/portlets/user/geoportaldataviewer/server/GeoportalDataViewerServiceImpl.java +++ b/src/main/java/org/gcube/portlets/user/geoportaldataviewer/server/GeoportalDataViewerServiceImpl.java @@ -20,6 +20,7 @@ import org.gcube.application.geoportal.common.model.configuration.Configuration; import org.gcube.application.geoportal.common.model.configuration.Index; import org.gcube.application.geoportal.common.model.document.Project; import org.gcube.application.geoportal.common.model.document.identification.IdentificationReference; +import org.gcube.application.geoportal.common.model.document.relationships.Relationship; import org.gcube.application.geoportal.common.model.rest.QueryRequest; import org.gcube.application.geoportal.common.model.useCaseDescriptor.UseCaseDescriptor; import org.gcube.application.geoportal.common.rest.Projects; @@ -81,6 +82,9 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.google.gwt.user.server.rpc.RemoteServiceServlet; +import com.jayway.jsonpath.DocumentContext; +import com.jayway.jsonpath.JsonPath; +import com.jayway.jsonpath.Option; /** * The server side implementation of the RPC service. @@ -1256,15 +1260,68 @@ public class GeoportalDataViewerServiceImpl extends RemoteServiceServlet impleme throw new Exception("Invalid parameter. Either profileID or projectID is null"); try { - - LOG.info("Trying to getRelationshipChain for id " + profileID); + LOG.info("Trying to getRelationshipsForTimeline for id " + profileID); List listJSON = new ArrayList(); + + try { + String template = "{\"content\": \"$._theDocument.nome\"," + + "\"start\" : \"$._theDocument.dataInizioProgetto\"," + + "\"end\" : \"$._theDocument.dataFineProgetto\"}"; + + JSONObject sourceJsonTemplate = new JSONObject(template); + JSONObject targetJsonObject = new JSONObject(); + com.jayway.jsonpath.Configuration conf = com.jayway.jsonpath.Configuration.defaultConfiguration(); + com.jayway.jsonpath.Configuration conf2 = conf.addOptions(Option.ALWAYS_RETURN_LIST); + + Project theProject = GeoportalClientCaller.projects().getProjectByID(profileID, projectID); + List relationships = theProject.getRelationships(); + + for (Relationship relationship : relationships) { + targetJsonObject.put("id", relationship.getTargetUCD()+","+relationship.getTargetID()); + Project targetProject = GeoportalClientCaller.projects().getProjectByID(relationship.getTargetUCD(), + relationship.getTargetID()); + + DocumentContext targetDoc = JsonPath.using(conf2).parse(targetProject.getTheDocument().toJson()); + + for (Object key : sourceJsonTemplate.keySet()) { + String theKey = key + ""; + String jsonPath = sourceJsonTemplate.getString(theKey); + // Works fine + + List listValue = targetDoc.read(jsonPath); + String result = ""; + for (int i = 0; i < listValue.size() - 1; i++) { + result += listValue.get(i) + ", "; + } + result += listValue.get(listValue.size() - 1); + targetJsonObject.put(theKey, result); + } + + List images = getImagesForId(relationship.getTargetUCD(), relationship.getTargetID(), + true); + if (images.size() > 0) { + images.get(0).getLink(); + targetJsonObject.put("image_url", images.get(0).getLink()); + } + String theJSONResult = targetJsonObject.toString(); + LOG.debug("Built jsonObject " + theJSONResult); + listJSON.add(theJSONResult); + + } + } catch (Exception e) { + String erroMsg = "Error occurred on reading relatioships for id: " + projectID; + LOG.error(erroMsg, e); + } + + // TODO LOAD AND APPLT TEMPLATING OF KIND + for (int i = 0; i < 5; i++) { JSONObject jsonObject = new JSONObject(); - jsonObject.put("id", i); - jsonObject.put("title", "title " + i); + jsonObject.put("id", "UCD"+i+",ID"+i); + jsonObject.put("content", + "title moooooooooooooolto lungoooooooooooooooooooooooooooooooooooooooooooooooooo" + i); jsonObject.put("start", "201" + i + "-04-1"); jsonObject.put("end", "201" + i + "-09-1"); if (i < 3) diff --git a/src/main/webapp/GeoportalDataViewer.css b/src/main/webapp/GeoportalDataViewer.css index 6a1a53e..8384359 100644 --- a/src/main/webapp/GeoportalDataViewer.css +++ b/src/main/webapp/GeoportalDataViewer.css @@ -552,7 +552,7 @@ body { } .vis-item-content table code { - color: gray; + color: red; } .vis-item-content table span { diff --git a/src/main/webapp/GeoportalDataViewer.html b/src/main/webapp/GeoportalDataViewer.html index 6d703f5..0b8edc6 100644 --- a/src/main/webapp/GeoportalDataViewer.html +++ b/src/main/webapp/GeoportalDataViewer.html @@ -50,7 +50,7 @@ {{/if}} - {{truncate title}} + {{truncate_msg content}} {{dateformat start}} / {{dateformat end}} @@ -81,10 +81,9 @@ } }); - Handlebars.registerHelper("truncate", function(input, max_lenght) { + Handlebars.registerHelper("truncate_msg", function(input) { - if (!max_lenght) - max_lenght = 10; + max_lenght = 20; if (input.length > max_lenght) { return input.substring(0, max_lenght) + '...'; @@ -99,7 +98,8 @@ var optionsTimeline = { // specify a template for the items template : templateHandlebars, - type : 'box' + type : 'box', + dataAttributes : 'all' }; diff --git a/src/main/webapp/WEB-INF/jsp/GeoPortalDataViewerAppPortlet_view.jsp b/src/main/webapp/WEB-INF/jsp/GeoPortalDataViewerAppPortlet_view.jsp index ecb22ea..062647d 100644 --- a/src/main/webapp/WEB-INF/jsp/GeoPortalDataViewerAppPortlet_view.jsp +++ b/src/main/webapp/WEB-INF/jsp/GeoPortalDataViewerAppPortlet_view.jsp @@ -58,13 +58,13 @@ {{/if}} - {{truncate title}} + {{truncate_msg content}} {{dateformat start}} / {{dateformat end}} - +