From 5daa568c44c6d66784bf2cac4f470a0c645cdc54 Mon Sep 17 00:00:00 2001 From: "francesco.mangiacrapa" Date: Tue, 7 Dec 2021 17:13:20 +0100 Subject: [PATCH] In progress #22518 --- .classpath | 6 +- .../com.gwtplugins.gdt.eclipse.core.prefs | 2 +- .settings/org.eclipse.wst.common.component | 35 +- CHANGELOG.md | 7 + pom.xml | 2 +- .../client/GeoportalDataViewer.java | 57 ++- .../client/GeoportalDataViewerConstants.java | 4 + .../client/GeoportalDataViewerService.java | 23 ++ .../GeoportalDataViewerServiceAsync.java | 8 + .../client/OLMapManager.java | 13 +- .../client/OverlayLayerManager.java | 1 - .../client/events/GetListOfRecordsEvent.java | 83 ++++ .../events/GetListOfRecordsEventHandler.java | 22 ++ .../client/ui/GeonaDataViewMainPanel.java | 27 +- .../client/ui/GeonaDataViewMainPanel.ui.xml | 10 +- .../client/ui/SearchFacilityUI.java | 369 ++++++++++++++++++ .../client/ui/SearchFacilityUI.ui.xml | 60 +++ .../GeoportalDataViewerServiceImpl.java | 70 ++++ .../server/util/SessionUtil.java | 50 +++ src/main/webapp/GeoportalDataViewer.css | 48 +++ 20 files changed, 866 insertions(+), 31 deletions(-) create mode 100644 src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/events/GetListOfRecordsEvent.java create mode 100644 src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/events/GetListOfRecordsEventHandler.java create mode 100644 src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/ui/SearchFacilityUI.java create mode 100644 src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/ui/SearchFacilityUI.ui.xml diff --git a/.classpath b/.classpath index 3f84059..2d08333 100644 --- a/.classpath +++ b/.classpath @@ -1,12 +1,12 @@ - + - + @@ -35,5 +35,5 @@ - + diff --git a/.settings/com.gwtplugins.gdt.eclipse.core.prefs b/.settings/com.gwtplugins.gdt.eclipse.core.prefs index 4c65c64..5367c1d 100644 --- a/.settings/com.gwtplugins.gdt.eclipse.core.prefs +++ b/.settings/com.gwtplugins.gdt.eclipse.core.prefs @@ -1,4 +1,4 @@ eclipse.preferences.version=1 -lastWarOutDir=/home/francescomangiacrapa/git/geoportal-data-viewer-app/target/geoportal-data-viewer-app-2.1.0-SNAPSHOT +lastWarOutDir=/home/francescomangiacrapa/git/geoportal-data-viewer-app/target/geoportal-data-viewer-app-2.2.0-SNAPSHOT warSrcDir=src/main/webapp warSrcDirIsOutput=false diff --git a/.settings/org.eclipse.wst.common.component b/.settings/org.eclipse.wst.common.component index af45588..db1d6e9 100644 --- a/.settings/org.eclipse.wst.common.component +++ b/.settings/org.eclipse.wst.common.component @@ -1,41 +1,54 @@ - + - - + + + + - + + - + + - + + - + + - + + uses + + + - + + - + + - + + diff --git a/CHANGELOG.md b/CHANGELOG.md index 95a8e22..87fc667 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,10 +5,17 @@ All notable changes to this project will be documented in this file. This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [v2.2.0-SNAPSHOT] - 2021-12-07 + +#### Enhancements + +- [#22518] Added the search for fields facility + ## [v2.1.0-SNAPSHOT] - 2021-11-10 #### Enhancements +- [#22518] Added the search for name facility - [#22027] Integrated with MapBox Satellite - Added link "Open Project" in the pop-up of WFS details - Moved to gwt-ol3 v8.1.0-gwt2_9 diff --git a/pom.xml b/pom.xml index eccb30a..a7fea41 100644 --- a/pom.xml +++ b/pom.xml @@ -14,7 +14,7 @@ org.gcube.portlets.user geoportal-data-viewer-app war - 2.1.0-SNAPSHOT + 2.2.0-SNAPSHOT GeoPortal Data Viewer App The GeoPortal Data Viewer App is an application to access, discovery and navigate the GeoNa products by a Web-Map Interface 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 9dd16d9..2e1af10 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 @@ -1,11 +1,16 @@ package org.gcube.portlets.user.geoportaldataviewer.client; +import java.util.ArrayList; +import java.util.Arrays; import java.util.Iterator; import java.util.List; import org.gcube.application.geoportalcommon.shared.GeoNaDataViewerProfile; import org.gcube.application.geoportalcommon.shared.GeoNaItemRef; +import org.gcube.application.geoportalcommon.shared.ItemField; import org.gcube.application.geoportalcommon.shared.LayerItem; +import org.gcube.application.geoportalcommon.shared.SearchingFilter; +import org.gcube.application.geoportalcommon.shared.SearchingFilter.ORDER; import org.gcube.application.geoportalcommon.shared.products.ConcessioneDV; import org.gcube.application.geoportalcommon.shared.products.model.RecordDV; import org.gcube.portlets.user.geoportaldataviewer.client.GeoportalDataViewerConstants.MAP_PROJECTION; @@ -100,6 +105,10 @@ public class GeoportalDataViewer implements EntryPoint { private HTML attributionDiv = new HTML(); private static List listBaseMapLayers = null; + + private List displayFields = new ArrayList(); + private List sortByFields = new ArrayList(); + private List searchByFields = new ArrayList(); /** * This is the entry point method. @@ -120,8 +129,49 @@ public class GeoportalDataViewer implements EntryPoint { RootPanel.get(APP_DIV).add(loaderApp); - mainPanel = new GeonaDataViewMainPanel(applicationBus, getClientHeight()); - RootPanel.get(APP_DIV).add(mainPanel); + GeoportalDataViewerServiceAsync.Util.getInstance().listOfFieldsForSearching(new AsyncCallback>() { + + @Override + public void onFailure(Throwable caught) { + Window.alert(caught.getMessage()); + + } + + @Override + public void onSuccess(List result) { + + for (ItemField itemField : result) { + if(itemField.isDisplayIntoTable()) { + displayFields.add(itemField); + } + + if(itemField.isSearchable()) { + searchByFields.add(itemField); + } + + if(itemField.isSortable()) { + sortByFields.add(itemField); + } + } + + + GWT.log("List display fields: "+result); + SearchingFilter initialSortFilter = new SearchingFilter(); + initialSortFilter.setOrder(ORDER.ASC); + initialSortFilter.setOrderByFields(Arrays.asList(new ItemField("Name", Arrays.asList("name"), true, true, true))); + + mainPanel = new GeonaDataViewMainPanel(applicationBus, getClientHeight(),searchByFields,sortByFields,initialSortFilter); + RootPanel.get(APP_DIV).add(mainPanel); + + initApplication(); + } + + + }); + + } + + private void initApplication() { Scheduler.get().scheduleDeferred(new ScheduledCommand() { @@ -176,11 +226,10 @@ public class GeoportalDataViewer implements EntryPoint { } }); - - bindEvents(); RootPanel.get(APP_DIV).add(attributionDiv); + } public static List getListBaseMapLayers() { diff --git a/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/GeoportalDataViewerConstants.java b/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/GeoportalDataViewerConstants.java index e1117c0..5f7b211 100644 --- a/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/GeoportalDataViewerConstants.java +++ b/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/GeoportalDataViewerConstants.java @@ -67,6 +67,10 @@ public class GeoportalDataViewerConstants { } } + + public enum RECORD_TYPE { + CONCESSIONE + } public static final double ITALY_CENTER_LONG = 12.45; diff --git a/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/GeoportalDataViewerService.java b/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/GeoportalDataViewerService.java index b48828a..c1479a1 100644 --- a/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/GeoportalDataViewerService.java +++ b/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/GeoportalDataViewerService.java @@ -4,6 +4,9 @@ import java.util.List; import org.gcube.application.geoportalcommon.shared.GeoNaDataViewerProfile; import org.gcube.application.geoportalcommon.shared.GeoNaItemRef; +import org.gcube.application.geoportalcommon.shared.ItemField; +import org.gcube.application.geoportalcommon.shared.ResultSetPaginatedData; +import org.gcube.application.geoportalcommon.shared.SearchingFilter; import org.gcube.application.geoportalcommon.shared.gis.BoundsMap; import org.gcube.application.geoportalcommon.shared.products.ConcessioneDV; import org.gcube.application.geoportalcommon.shared.products.model.LayerConcessioneDV; @@ -127,5 +130,25 @@ public interface GeoportalDataViewerService extends RemoteService { List getListBaseLayers(); + /** + * List of fields for searching. + * + * @return the list + */ + List listOfFieldsForSearching(); + + /** + * Gets the list concessioni. + * + * @param start the start + * @param limit the limit + * @param filter the filter + * @param reloadFromService the reload from service + * @return the list concessioni + * @throws Exception the exception + */ + ResultSetPaginatedData getListConcessioni(Integer start, Integer limit, SearchingFilter filter, + boolean reloadFromService) throws Exception; + } diff --git a/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/GeoportalDataViewerServiceAsync.java b/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/GeoportalDataViewerServiceAsync.java index 462a52e..ec88a44 100644 --- a/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/GeoportalDataViewerServiceAsync.java +++ b/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/GeoportalDataViewerServiceAsync.java @@ -4,6 +4,9 @@ import java.util.List; import org.gcube.application.geoportalcommon.shared.GeoNaDataViewerProfile; import org.gcube.application.geoportalcommon.shared.GeoNaItemRef; +import org.gcube.application.geoportalcommon.shared.ItemField; +import org.gcube.application.geoportalcommon.shared.ResultSetPaginatedData; +import org.gcube.application.geoportalcommon.shared.SearchingFilter; import org.gcube.application.geoportalcommon.shared.gis.BoundsMap; import org.gcube.application.geoportalcommon.shared.products.ConcessioneDV; import org.gcube.application.geoportalcommon.shared.products.model.LayerConcessioneDV; @@ -61,4 +64,9 @@ public interface GeoportalDataViewerServiceAsync { void getListBaseLayers(AsyncCallback> callback); + void listOfFieldsForSearching(AsyncCallback> callback); + + void getListConcessioni(Integer start, Integer limit, SearchingFilter filter, boolean reloadFromService, + AsyncCallback callback); + } diff --git a/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/OLMapManager.java b/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/OLMapManager.java index 294aab6..24fa9b6 100644 --- a/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/OLMapManager.java +++ b/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/OLMapManager.java @@ -46,7 +46,7 @@ public class OLMapManager { * * @param targetId the target id * @param layerManagerBus the layer manager bus - * @param baseMapLayer the base map layer + * @param baseMapLayer the base map layer */ public OLMapManager(String targetId, HandlerManager layerManagerBus, BaseMapLayer baseMapLayer) { this.targetId = targetId; @@ -75,7 +75,8 @@ public class OLMapManager { // // } - ExtentWrapped toExt = new ExtentWrapped(coordinate.getX(), coordinate.getY(), coordinate.getX(), coordinate.getY()); + ExtentWrapped toExt = new ExtentWrapped(coordinate.getX(), coordinate.getY(), coordinate.getX(), + coordinate.getY()); GeoQuery select = toDataPointQuery(coordinate, true); layerManagerBus.fireEvent(new QueryDataEvent(select, toExt, null, true, MapEventType.MOUSE_CLICK)); @@ -140,7 +141,7 @@ public class OLMapManager { /** * To data point query. * - * @param coordinate the coordinate + * @param coordinate the coordinate * @param manualClick the manual click * @return the geo query */ @@ -157,12 +158,12 @@ public class OLMapManager { // ratio - mapPixelWeight : bboxWeight = 20px : geoRectangleWidth // where 10px is the pixel diameter dimension of the clicked point double bboxWidth = Math.abs(olMap.getExtent().getLowerLeftX() - olMap.getExtent().getUpperRightX()); - + double geoWidth = 0; // adding a tolerance in case of manual click if (manualClick) { // adding a tolerance for clicking - //geoWidth = (bboxWidth / w) * (14 / 2); + // geoWidth = (bboxWidth / w) * (14 / 2); geoWidth = (bboxWidth / w) * (16 / 2); } else { // data point selection for coordinate loaded from concessione @@ -211,7 +212,7 @@ public class OLMapManager { GWT.log("the distance is: " + dist); if (dist > 5000 || startExt.containsExtent(endExt)) { GeoQuery select = toDataBoxQuery(dragEndExtent); - //TODO THE AUTOMATICALLY SHOWING POP-UP ACCORDING TO ZOOM IS BUGGY + // TODO THE AUTOMATICALLY SHOWING POP-UP ACCORDING TO ZOOM IS BUGGY layerManagerBus.fireEvent(new QueryDataEvent(select, endExt, null, false, mapEventType)); } } else if (zoomStart != null && zoomEnd != null) { diff --git a/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/OverlayLayerManager.java b/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/OverlayLayerManager.java index 05affaa..436423b 100644 --- a/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/OverlayLayerManager.java +++ b/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/OverlayLayerManager.java @@ -16,7 +16,6 @@ public class OverlayLayerManager { public OverlayLayerManager(HandlerManager applicationBus) { this.applicationBus = applicationBus; - //fp.addStyleName("layers-panel"); } void addLayerItem(LayerObject lo) { diff --git a/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/events/GetListOfRecordsEvent.java b/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/events/GetListOfRecordsEvent.java new file mode 100644 index 0000000..a4f2cc7 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/events/GetListOfRecordsEvent.java @@ -0,0 +1,83 @@ +package org.gcube.portlets.user.geoportaldataviewer.client.events; + +import org.gcube.application.geoportalcommon.shared.SearchingFilter; +import org.gcube.portlets.user.geoportaldataviewer.client.GeoportalDataViewerConstants.RECORD_TYPE; + +import com.google.gwt.event.shared.GwtEvent; + +/** + * The Class GetListOfRecordsEvent. + * + * @author Francesco Mangiacrapa at ISTI-CNR francesco.mangiacrapa@isti.cnr.it + * + * Dec 7, 2021 + */ +public class GetListOfRecordsEvent extends GwtEvent { + + /** The type. */ + public static Type TYPE = new Type(); + private RECORD_TYPE recordType; + private SearchingFilter sortFilter; + + /** + * Instantiates a new cancel upload event. + * + * @param recordType the record type + * @param sortFilter the sort filter + */ + public GetListOfRecordsEvent(RECORD_TYPE recordType, SearchingFilter sortFilter) { + this.recordType = recordType; + this.sortFilter = sortFilter; + } + + /** + * Gets the associated type. + * + * @return the associated type + */ + /* + * (non-Javadoc) + * + * @see com.google.gwt.event.shared.GwtEvent#getAssociatedType() + */ + @Override + public Type getAssociatedType() { + return TYPE; + } + + /** + * Dispatch. + * + * @param handler the handler + */ + /* + * (non-Javadoc) + * + * @see + * com.google.gwt.event.shared.GwtEvent#dispatch(com.google.gwt.event.shared. + * EventHandler) + */ + @Override + protected void dispatch(GetListOfRecordsEventHandler handler) { + handler.onGetList(this); + } + + /** + * Gets the record type. + * + * @return the record type + */ + public RECORD_TYPE getRecordType() { + return recordType; + } + + /** + * Gets the sort filter. + * + * @return the sort filter + */ + public SearchingFilter getSortFilter() { + return sortFilter; + } + +} diff --git a/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/events/GetListOfRecordsEventHandler.java b/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/events/GetListOfRecordsEventHandler.java new file mode 100644 index 0000000..4d00089 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/events/GetListOfRecordsEventHandler.java @@ -0,0 +1,22 @@ +package org.gcube.portlets.user.geoportaldataviewer.client.events; + +import com.google.gwt.event.shared.EventHandler; + + +/** + * The Interface GetListOfRecordsEventHandler. + * + * @author Francesco Mangiacrapa at ISTI-CNR francesco.mangiacrapa@isti.cnr.it + * + * Aug 4, 2021 + */ +public interface GetListOfRecordsEventHandler extends EventHandler { + + + /** + * On get list. + * + * @param getListOfRecordsEvent the get list of records event + */ + void onGetList(GetListOfRecordsEvent getListOfRecordsEvent); +} \ No newline at end of file diff --git a/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/ui/GeonaDataViewMainPanel.java b/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/ui/GeonaDataViewMainPanel.java index 3a7e45f..6fb57e8 100644 --- a/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/ui/GeonaDataViewMainPanel.java +++ b/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/ui/GeonaDataViewMainPanel.java @@ -3,6 +3,8 @@ package org.gcube.portlets.user.geoportaldataviewer.client.ui; import java.util.List; import org.gcube.application.geoportalcommon.shared.GeoNaItemRef; +import org.gcube.application.geoportalcommon.shared.ItemField; +import org.gcube.application.geoportalcommon.shared.SearchingFilter; import org.gcube.application.geoportalcommon.shared.products.ConcessioneDV; import org.gcube.application.geoportalcommon.shared.products.model.RecordDV; import org.gcube.portlets.user.geoportaldataviewer.client.GeoportalDataViewerConstants.MAP_PROJECTION; @@ -87,9 +89,15 @@ public class GeonaDataViewMainPanel extends Composite { @UiField Button linkLayers; + + @UiField + DropdownButton searchFacilityButton; @UiField ScrollPanel overlayLayersPanel; + + @UiField + ScrollPanel searchFacilityPanel; @UiField HTMLPanel panelAttribution; @@ -109,6 +117,8 @@ public class GeonaDataViewMainPanel extends Composite { private HandlerManager applicationBus; + private SearchFacilityUI searchFacility; + /** * Instantiates a new geona data view main panel. @@ -116,7 +126,8 @@ public class GeonaDataViewMainPanel extends Composite { * @param applicationBus the application bus * @param mapHeight the map height */ - public GeonaDataViewMainPanel(HandlerManager applicationBus, int mapHeight) { + public GeonaDataViewMainPanel(HandlerManager applicationBus, int mapHeight, List sortByFields, + List searchForFields, SearchingFilter initialSortFilter) { initWidget(uiBinder.createAndBindUi(this)); this.applicationBus = applicationBus; mapPanel = new MapPanel(mapHeight + "px"); @@ -142,6 +153,8 @@ public class GeonaDataViewMainPanel extends Composite { linkPresetLocation.setCustomIconStyle(GNAIcons.CustomIconType.PRESET_LOCATION.get()); linkLayers.setCustomIconStyle(GNAIcons.CustomIconType.LAYERS.get()); + searchFacility = new SearchFacilityUI(applicationBus, sortByFields, searchForFields, initialSortFilter); + searchFacilityPanel.add(searchFacility); // layersDDB.setToggle(true); bindEvents(); @@ -163,7 +176,17 @@ public class GeonaDataViewMainPanel extends Composite { } } }); - + + searchFacilityButton.addDomHandler(new ClickHandler() { + + @Override + public void onClick(ClickEvent event) { + //event.preventDefault(); + event.stopPropagation(); + + } + }, ClickEvent.getType()); + } /** diff --git a/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/ui/GeonaDataViewMainPanel.ui.xml b/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/ui/GeonaDataViewMainPanel.ui.xml index c996e06..d0397c4 100644 --- a/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/ui/GeonaDataViewMainPanel.ui.xml +++ b/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/ui/GeonaDataViewMainPanel.ui.xml @@ -35,12 +35,14 @@ - + + title="Center Map to Location" text="Preset Location" + ui:field="linkPresetLocation"> @@ -50,6 +52,10 @@ text="World" title="Center to World"> + + + diff --git a/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/ui/SearchFacilityUI.java b/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/ui/SearchFacilityUI.java new file mode 100644 index 0000000..811853f --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/ui/SearchFacilityUI.java @@ -0,0 +1,369 @@ +package org.gcube.portlets.user.geoportaldataviewer.client.ui; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.gcube.application.geoportalcommon.shared.ItemField; +import org.gcube.application.geoportalcommon.shared.ResultSetPaginatedData; +import org.gcube.application.geoportalcommon.shared.SearchingFilter; +import org.gcube.application.geoportalcommon.shared.SearchingFilter.ORDER; +import org.gcube.application.geoportalcommon.shared.products.ConcessioneDV; +import org.gcube.portlets.user.geoportaldataviewer.client.GeoportalDataViewerConstants.RECORD_TYPE; +import org.gcube.portlets.user.geoportaldataviewer.client.GeoportalDataViewerServiceAsync; +import org.gcube.portlets.user.geoportaldataviewer.client.events.GetListOfRecordsEvent; +import org.gcube.portlets.user.geoportaldataviewer.client.util.StringUtil; + +import com.github.gwtbootstrap.client.ui.Button; +import com.github.gwtbootstrap.client.ui.ListBox; +import com.github.gwtbootstrap.client.ui.NavLink; +import com.github.gwtbootstrap.client.ui.TextBox; +import com.github.gwtbootstrap.client.ui.constants.ButtonType; +import com.google.gwt.core.client.GWT; +import com.google.gwt.event.dom.client.ChangeEvent; +import com.google.gwt.event.dom.client.ChangeHandler; +import com.google.gwt.event.dom.client.ClickEvent; +import com.google.gwt.event.dom.client.ClickHandler; +import com.google.gwt.event.dom.client.KeyPressEvent; +import com.google.gwt.event.dom.client.KeyPressHandler; +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; +import com.google.gwt.user.client.rpc.AsyncCallback; +import com.google.gwt.user.client.ui.Composite; +import com.google.gwt.user.client.ui.FlexTable; +import com.google.gwt.user.client.ui.HTML; +import com.google.gwt.user.client.ui.HTMLPanel; +import com.google.gwt.user.client.ui.HorizontalPanel; +import com.google.gwt.user.client.ui.Widget; + +public class SearchFacilityUI extends Composite { + + private static SearchFacilityPanelUiBinder uiBinder = GWT.create(SearchFacilityPanelUiBinder.class); + + protected static final int MIN_LENGHT_SERCHING_STRING = 3; + + @UiField + ListBox listBoxSortBy; + + @UiField + ListBox listBoxSearchFor; + + @UiField + TextBox searchField; + + @UiField + NavLink sortByToogle; + + @UiField + Button resetSearch; + + @UiField + HTMLPanel panelResults; + + @UiField + HorizontalPanel toogleSortBy; + + private List searchForFields; + + private List sortByFields; + + private SearchingFilter currentSortFilter; + + private HandlerManager appManagerBus; + + private static final String LABEL_FILTER_SEPARATOR = " - "; + + interface SearchFacilityPanelUiBinder extends UiBinder { + } + + public SearchFacilityUI(HandlerManager appManagerBus, List sortByFields, List searchForFields, + SearchingFilter initialSortFilter) { + initWidget(uiBinder.createAndBindUi(this)); + this.searchForFields = searchForFields; + this.currentSortFilter = initialSortFilter; + this.sortByFields = sortByFields; + this.appManagerBus = appManagerBus; + + resetSearch.setType(ButtonType.LINK); + + listBoxSortBy.setWidth("130px"); + listBoxSearchFor.setWidth("130px"); + + bindEvents(); + } + + private String toLabelFilter(ItemField itemField, ORDER direction) { + String labelFilter = itemField.getDisplayName() + LABEL_FILTER_SEPARATOR + direction.name(); + return labelFilter; + } + + /** + * Bind events. + */ + private void bindEvents() { + + for (ItemField record_FIELD : sortByFields) { + String labelASC = toLabelFilter(record_FIELD, ORDER.ASC); + String labelDESC = toLabelFilter(record_FIELD, ORDER.DESC); + listBoxSortBy.addItem(labelASC); + listBoxSortBy.addItem(labelDESC); + } + + listBoxSortBy.addChangeHandler(new ChangeHandler() { + + @Override + public void onChange(ChangeEvent event) { + appManagerBus.fireEvent(new GetListOfRecordsEvent(RECORD_TYPE.CONCESSIONE, getCurrentSortFilter())); + + } + }); + + for (ItemField record_FIELD : searchForFields) { + listBoxSearchFor.addItem(record_FIELD.getDisplayName()); + } + + listBoxSearchFor.addChangeHandler(new ChangeHandler() { + + @Override + public void onChange(ChangeEvent event) { + + // alertSearchFor.setText(listBoxSearchFor.getSelectedValue()); + + if (searchField.getText().length() >= MIN_LENGHT_SERCHING_STRING) { + doSearchEvent(); + } + + } + }); + + sortByToogle.addClickHandler(new ClickHandler() { + + @Override + public void onClick(ClickEvent event) { + if (toogleSortBy.isVisible()) + toogleSortBy.setVisible(false); + else + toogleSortBy.setVisible(true); + + } + }); + +// navShowOnMap.addClickHandler(new ClickHandler() { +// +// @Override +// public void onClick(ClickEvent event) { +// List listConcessioni = null; +// if (grpw != null && grpw.getSelectItems() != null) { +// listConcessioni = grpw.getSelectItems(); +// } +// appManagerBus +// .fireEvent(new ActionOnItemEvent(listConcessioni, ACTION_ON_ITEM.VIEW_ON_MAP)); +// +// } +// }); + + searchField.addKeyPressHandler(new KeyPressHandler() { + + @Override + public void onKeyPress(KeyPressEvent event) { + if (com.google.gwt.event.dom.client.KeyCodes.KEY_ENTER == event.getCharCode()) { + GWT.log(searchField.getText()); + doSearchEvent(); + } + + } + }); + + resetSearch.addClickHandler(new ClickHandler() { + + @Override + public void onClick(ClickEvent event) { + searchField.setText(""); + appManagerBus.fireEvent(new GetListOfRecordsEvent(RECORD_TYPE.CONCESSIONE, getCurrentSortFilter())); + resetSearch.setVisible(false); + } + }); + + } + + private void searchConcessioni() { + + SearchingFilter filter = getCurrentSortFilter(); + + GeoportalDataViewerServiceAsync.Util.getInstance().getListConcessioni(0, 30, filter, false, + new AsyncCallback() { + + @Override + public void onFailure(Throwable caught) { +// showLoading(false); +// Window.alert(caught.getMessage()); + + } + + @Override + public void onSuccess(ResultSetPaginatedData result) { + + panelResults.clear(); + panelResults.add(new HTML("
")); + + if (result.getData().size() == 0) { + panelResults.add(new HTML("No result found")); + return; + } + + FlexTable ft = new FlexTable(); + ft.getElement().setClassName("table-results"); + int i = 0; + ft.setWidget(0, i, new HTML("Name")); + + String selValue = listBoxSearchFor.getSelectedValue().toLowerCase(); + + boolean addIntroduction = false; + if(selValue.startsWith("name")) { + ft.setWidget(0, ++i, new HTML("Introduction")); + addIntroduction = true; + } + + boolean addStaff = false; + if(selValue.startsWith("staff")) { + ft.setWidget(0, ++i, new HTML("Staff")); + addStaff = true; + } + boolean addParole = false; + if(selValue.startsWith("parola")) { + ft.setWidget(0, ++i, new HTML("Parole Libere")); + ft.setWidget(0, ++i, new HTML("Parole Cronologia")); + addParole = true; + } + + i = 1; + for (ConcessioneDV concessione : result.getData()) { + int j = -1; + ft.setWidget(i, ++j, new HTML(concessione.getNome())); + if(addIntroduction) + ft.setWidget(i, ++j, new HTML(StringUtil.ellipsize(concessione.getIntroduzione(), 100))); + + if(addStaff) { + ft.setWidget(i, ++j, new HTML(toDisplayList(concessione.getAuthors()))); + } + + if(addParole) { + ft.setWidget(i, ++j, new HTML(toDisplayList(concessione.getParoleChiaveLibere()))); + ft.setWidget(i, ++j, new HTML(toDisplayList(concessione.getParoleChiaveICCD()))); + } + + +// List listImg = concessione.getImmaginiRappresentative(); +// GWT.log(listImg.toString()); +// boolean imagePreviewFound = false; +// if (listImg != null && listImg.size() > 0) { +// +// UploadedImageDV uImg = listImg.get(0); +// +// if (uImg != null && uImg.getListWsContent() != null +// && uImg.getListWsContent().size() > 0) { +// WorkspaceContentDV wsc = uImg.getListWsContent().get(0); +// String image = "" + wsc.getName() + ""; +// ft.setWidget(i, 2, new HTML(image)); +// imagePreviewFound = true; +// } +// } +// +// if (!imagePreviewFound) { +// ft.setWidget(i, 2, new Image(GNAImages.ICONS.italyIcon())); +// } + + i++; + } + + panelResults.add(ft); + + } + }); + } + + /** + * To display authors. + * + * @param authors the authors + * @return the string + */ + private String toDisplayList(List listValues) { + String toDisplay = ""; + if (listValues == null) + return toDisplay; + + for (String author : listValues) { + toDisplay += author + "; "; + } + return toDisplay; + } + + private void doSearchEvent() { + String searchText = searchField.getText(); + if (searchText.length() < MIN_LENGHT_SERCHING_STRING) { + Window.alert("Please enter at least " + MIN_LENGHT_SERCHING_STRING + " characters"); + return; + } + + resetSearch.setVisible(true); + // appManagerBus.fireEvent(new GetListOfRecordsEvent(RECORD_TYPE.CONCESSIONE, + // getCurrentSortFilter())); + + searchConcessioni(); + } + + public SearchingFilter toSortFilter(String labelFilter) { + GWT.log("toSortFilter for label " + labelFilter); + String[] array = labelFilter.split(LABEL_FILTER_SEPARATOR); + + SearchingFilter sortFilter = null; + try { + ItemField recordField = null; + for (ItemField value : sortByFields) { + if (array[0].equalsIgnoreCase(value.getDisplayName())) { + recordField = value; + break; + } + } + ORDER orderField = ORDER.valueOf(array[1]); + sortFilter = new SearchingFilter(Arrays.asList(recordField), orderField); + } catch (Exception e) { + + } + GWT.log("toSortFilter Got " + sortFilter); + return sortFilter; + + } + + private SearchingFilter builtSearchingFilter() { + SearchingFilter searchingFilter = toSortFilter(listBoxSortBy.getSelectedValue()); + String searchText = searchField.getText(); + if (searchText != null && !searchText.isEmpty()) { + Map searchInto = new HashMap(); + + String searchForField = ""; + + for (ItemField recordField : searchForFields) { + if (recordField.getDisplayName().equals(listBoxSearchFor.getSelectedValue())) { + searchForField = recordField.getJsonFields().get(0); + continue; + } + } + searchInto.put(searchForField, searchText); + searchingFilter.setSearchInto(searchInto); + } + return searchingFilter; + } + + public SearchingFilter getCurrentSortFilter() { + currentSortFilter = builtSearchingFilter(); + GWT.log("currentSortFilter: " + currentSortFilter); + return currentSortFilter; + } + +} diff --git a/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/ui/SearchFacilityUI.ui.xml b/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/ui/SearchFacilityUI.ui.xml new file mode 100644 index 0000000..c69f3ab --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/ui/SearchFacilityUI.ui.xml @@ -0,0 +1,60 @@ + + + + .important { + font-weight: bold; + } + + .container-panel { + padding: 10px; + } + + .add-margin-right { + margin-right: 5px; + } + + .add-margin-right-23 { + margin-right: 23px; + } + + .margin-top-5 { + margin-top: 5px; + } + .font-size-12 { + font-size: 12px; + } + + + + + + + Search for: + + + + Reset + + + + Sort Results + + Sort by: + + + + + + + + + + \ No newline at end of file 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 fcad66e..0065e9f 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 @@ -16,9 +16,13 @@ import org.gcube.application.geoportal.common.model.legacy.UploadedImage; import org.gcube.application.geoportalcommon.ConvertToDataViewModel; import org.gcube.application.geoportalcommon.GeoNaDataViewerProfileReader; import org.gcube.application.geoportalcommon.GeoportalCommon; +import org.gcube.application.geoportalcommon.MongoServiceCommon; import org.gcube.application.geoportalcommon.shared.GeoNaDataViewerProfile; import org.gcube.application.geoportalcommon.shared.GeoNaItemRef; +import org.gcube.application.geoportalcommon.shared.ItemField; import org.gcube.application.geoportalcommon.shared.LayerItem; +import org.gcube.application.geoportalcommon.shared.ResultSetPaginatedData; +import org.gcube.application.geoportalcommon.shared.SearchingFilter; import org.gcube.application.geoportalcommon.shared.gis.BoundsMap; import org.gcube.application.geoportalcommon.shared.products.BaseConcessioneDV; import org.gcube.application.geoportalcommon.shared.products.ConcessioneDV; @@ -667,6 +671,11 @@ public class GeoportalDataViewerServiceImpl extends RemoteServiceServlet impleme } + /** + * Gets the list base layers. + * + * @return the list base layers + */ @Override public List getListBaseLayers() { LOG.info("getListBaseLayers called"); @@ -678,5 +687,66 @@ public class GeoportalDataViewerServiceImpl extends RemoteServiceServlet impleme return listBL; } + + // TODO THIS PART REQUIRES THE JSON MAPPING based on keys read from gCube Meta + + /** + * List of fields for searching. + * + * @return the list + */ + @Override + public List listOfFieldsForSearching() { + //GeoportalCommon gc = new GeoportalCommon(); + //return gc.getGNADataConfig().getListItemFields(); + + List listItemFields = new ArrayList(); + listItemFields.add(new ItemField("Name", Arrays.asList("nome"), true, true, true)); + listItemFields.add(new ItemField("Staff", Arrays.asList("authors"), true, true, true)); + listItemFields.add(new ItemField("Parola chiave", Arrays.asList("paroleChiaveLibere","paroleChiaveICCD"), true, true, true)); + return listItemFields; + } + + + /** + * Gets the list concessioni. + * + * @param start the start + * @param limit the limit + * @param filter the filter + * @param reloadFromService the reload from service + * @return the list concessioni + * @throws Exception the exception + */ + @Override + public ResultSetPaginatedData getListConcessioni(Integer start, Integer limit, SearchingFilter filter, + boolean reloadFromService) throws Exception { + LOG.info("getListConcessioni called wit start: " + start + ", limit: " + limit + ", filter: " + filter); + + try { + + SessionUtil.getCurrentContext(getThreadLocalRequest(), true); + + MongoServiceCommon serviceCommon = new MongoServiceCommon(); +// MongoServiceUtil serviceUtil = new MongoServiceUtil(); +// MongoConcessioni clientMongo = serviceUtil.getInstanceMongoConcessioni(); + + // TODO MUST BE REPLACED BY COUNT + + List listOfConcessioni = SessionUtil.getListOfConcessioni(getThreadLocalRequest(), + reloadFromService); + int listConcessioniSize = listOfConcessioni.size(); + + ResultSetPaginatedData searchedData = serviceCommon.queryOnMongo(listConcessioniSize, start, limit, filter, + "concessione"); + return searchedData; + + } catch (Exception e) { + LOG.error("Error on loading paginated and filtered list of concessioni: ", e); + throw new Exception("Error occurred on loading list of Concessioni. Error: " + e.getMessage()); + } + + } + } diff --git a/src/main/java/org/gcube/portlets/user/geoportaldataviewer/server/util/SessionUtil.java b/src/main/java/org/gcube/portlets/user/geoportaldataviewer/server/util/SessionUtil.java index 301178d..424fc66 100644 --- a/src/main/java/org/gcube/portlets/user/geoportaldataviewer/server/util/SessionUtil.java +++ b/src/main/java/org/gcube/portlets/user/geoportaldataviewer/server/util/SessionUtil.java @@ -3,11 +3,16 @@ */ package org.gcube.portlets.user.geoportaldataviewer.server.util; +import java.util.ArrayList; +import java.util.Iterator; import java.util.List; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; +import org.gcube.application.geoportal.common.model.legacy.Concessione; +import org.gcube.application.geoportal.common.rest.MongoConcessioni; +import org.gcube.application.geoportalcommon.MongoServiceCommon; import org.gcube.common.authorization.library.provider.SecurityTokenProvider; import org.gcube.common.portal.PortalContext; import org.gcube.common.scope.api.ScopeProvider; @@ -40,6 +45,8 @@ public class SessionUtil { private static final String URL_SHORTENER_SERVICE = "URL_SHORTENER_SERVICE"; private static final String LIST_BASE_MAPS_LAYERS = "LIST_BASE_MAPS_LAYERS"; + private static final String LIST_OF_CONCESSIONI = "LIST_OF_CONCESSIONI_DATA_VIEWER"; + /** * Checks if is into portal. * @@ -197,4 +204,47 @@ public class SessionUtil { } return lstBML; } + + + /** + * Gets the list of concessioni. + * + * @param httpServletRequest the http servlet request + * @param reloadFromService the reload from service + * @return the list of concessioni + * @throws Exception the exception + */ + public static List getListOfConcessioni(HttpServletRequest httpServletRequest, + boolean reloadFromService) throws Exception { + HttpSession session = httpServletRequest.getSession(); + List listOfConcessioni = (List) session.getAttribute(LIST_OF_CONCESSIONI); + + // setting null to force reloading from service + if (reloadFromService) + listOfConcessioni = null; + + if (listOfConcessioni == null) { + listOfConcessioni = new ArrayList(); + LOG.info("Loading list of concessione from client mongo"); + SessionUtil.getCurrentContext(httpServletRequest, true); + MongoServiceCommon serviceUtil = new MongoServiceCommon(); + MongoConcessioni clientMongo = serviceUtil.getInstanceMongoConcessioni(); + + Iterator concessioni = clientMongo.getList(); + if (concessioni != null) { + while (concessioni.hasNext()) { + Concessione concessione = (Concessione) concessioni.next(); + listOfConcessioni.add(concessione); + + } + } + // LOG.debug("Got list of concessioni from client mongo: " + listOfConcessioni); + session.setAttribute(LIST_OF_CONCESSIONI, listOfConcessioni); + LOG.info("Saved in session list of concessioni from client mongo with size: " + listOfConcessioni.size()); + } else + LOG.info("list of concessioni presents in session, using it"); + + LOG.info("read list of concessioni with size: " + listOfConcessioni.size()); + return listOfConcessioni; + } } diff --git a/src/main/webapp/GeoportalDataViewer.css b/src/main/webapp/GeoportalDataViewer.css index ae17cf6..26624c2 100644 --- a/src/main/webapp/GeoportalDataViewer.css +++ b/src/main/webapp/GeoportalDataViewer.css @@ -450,4 +450,52 @@ body { top: 50%; left: 50%; } + + +/*******************************************/ + +.search-facility { + width: 600px; + max-height: 700px; +} + +.search-textbox { + padding: 4px 14px !important; + margin-bottom: 0 !important; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif !important; + font-size: 13px !important; + font-weight: normal !important; + -webkit-border-radius: 15px; + -moz-border-radius: 15px; + border-radius: 15px !important; + width: 250px !important; +} + +.table-results { + table-layout: fixed; + width: 600px; +} + +.table-results td { + padding: 5px; + /* For Firefox */ + white-space: pre-wrap; + word-break: break-all; + /* For Chrome and IE */ + word-wrap: break-word; +} + +.table-results tr:nth-child(1) { + font-weight: bolder; + color: #333; + font-style: italic +} + +.table-results tr { + border-bottom: 1px solid #ccc; +} + +.table-results td:nth-child(1) { + width: 200px; +} \ No newline at end of file