From 9d48e78fac5f0f69054b518397dd6a6903b797d3 Mon Sep 17 00:00:00 2001 From: "francesco.mangiacrapa" Date: Fri, 26 May 2023 17:49:59 +0200 Subject: [PATCH] in progress cross filtering --- .../client/GeoportalDataViewer.java | 9 +- .../client/ui/GeonaDataViewMainPanel.java | 10 + .../CrossFilteringLayerPanel.java | 181 ++++++++++++------ .../OverlayCustomLayerPanel.java | 6 - .../client/ui/util/OLGeoJSONUtil.java | 4 +- .../GeoportalDataViewerServiceImpl.java | 13 -- 6 files changed, 140 insertions(+), 83 deletions(-) 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 98547e5..7f9d4d9 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 @@ -285,11 +285,6 @@ public class GeoportalDataViewer implements EntryPoint { } mainPanel.openCollectionMenu(); -// -// GWT.log("LIST CUSTOM LAYERS: " + result.getListCustomLayers()); -// if (result.getListCustomLayers() != null && result.getListCustomLayers().size() > 0) { -// mainPanel.setCustomLayers(result.getListCustomLayers()); -// } loadConfigureduGroupedLayersForUCD(); @@ -333,7 +328,7 @@ public class GeoportalDataViewer implements EntryPoint { @Override public void onSuccess(Map>> result) { - GWT.log(GEOPORTAL_DATA_HANDLER.geoportal_grouped_overlay_layers +" returned: "+result); + GWT.log(GEOPORTAL_DATA_HANDLER.geoportal_grouped_overlay_layers + " returned: " + result); if (result != null && result.size() > 0) { Map collections = viewerConfiguration.getAvailableCollections(); @@ -365,7 +360,7 @@ public class GeoportalDataViewer implements EntryPoint { @Override public void onSuccess(Map>> result) { - GWT.log(GEOPORTAL_DATA_HANDLER.geoportal_grouped_cross_filtering+" returned: "+result); + GWT.log(GEOPORTAL_DATA_HANDLER.geoportal_grouped_cross_filtering + " returned: " + result); if (result != null && result.size() > 0) { Map collections = viewerConfiguration.getAvailableCollections(); 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 23301f5..4eecdae 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 @@ -342,6 +342,16 @@ public class GeonaDataViewMainPanel extends Composite { } }, ClickEvent.getType()); + + linkCrossFilteringLayers.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/crossfiltering/CrossFilteringLayerPanel.java b/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/ui/crossfiltering/CrossFilteringLayerPanel.java index e1e4307..4bb44bc 100644 --- a/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/ui/crossfiltering/CrossFilteringLayerPanel.java +++ b/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/ui/crossfiltering/CrossFilteringLayerPanel.java @@ -28,14 +28,13 @@ import com.google.gwt.http.client.RequestBuilder; import com.google.gwt.http.client.RequestCallback; import com.google.gwt.http.client.RequestException; import com.google.gwt.http.client.Response; -import com.google.gwt.json.client.JSONParser; -import com.google.gwt.json.client.JSONString; -import com.google.gwt.json.client.JSONValue; +import com.google.gwt.http.client.URL; import com.google.gwt.uibinder.client.UiBinder; import com.google.gwt.uibinder.client.UiField; import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.Widget; +import jsinterop.base.JsPropertyMap; import ol.Feature; /** @@ -49,8 +48,8 @@ public class CrossFilteringLayerPanel extends Composite { public static String COLORSCALERANGE = "COLORSCALERANGE"; - //@UiField - //WellForm panelContainer; + // @UiField + // WellForm panelContainer; @UiField Fieldset fieldSet; @@ -65,10 +64,10 @@ public class CrossFilteringLayerPanel extends Composite { private LayerItem layerItem; - private LinkedHashMap> mapInnestedFeatures = new LinkedHashMap>(); - private LinkedHashMap> mapInnestedFiltering = new LinkedHashMap>(); + private LinkedHashMap> mapInnestedFeatures = new LinkedHashMap>(); + private LinkedHashMap> mapInnestedListBoxes = new LinkedHashMap>(); private GroupedLayersDV groupedLayersDV; @@ -192,70 +191,101 @@ public class CrossFilteringLayerPanel extends Composite { addListBoxesLevelToPanel(theLevel, mapInnestedFiltering.get(theLevel)); } - // filleSelectableLevel(level, mapInnestedFiltering.get(level), - // mapInnestedListBoxes.get(level)); + filleSelectableLevel(level, null); } - private void filleSelectableLevel(int level, List layersIDV, List listBoxes) { + private void filleSelectableLevel(int level, SelectableItem selectedItem) { + + //HashMap mapOfFeatureAtLevel = mapInnestedFeatures.get(level); + List layersIDV = mapInnestedFiltering.get(level); + List listBoxes = mapInnestedListBoxes.get(level); if (layersIDV == null) return; - HashMap mapSelectableFeatures = mapInnestedFeatures.get(level); +// final HashMap mapSelectableFeatures = mapOfFeatureAtLevel == null +// ? new HashMap() +// : mapOfFeatureAtLevel; + + final HashMap mapSelectableFeatures = new HashMap(); - if (mapSelectableFeatures == null) { - mapSelectableFeatures = new HashMap(); - HashMap mapFeatures = new HashMap(); + // if (mapSelectableFeatures.isEmpty()) { - for (LayerIDV layerIDV : layersIDV) { - if (layerIDV instanceof CrossFilteringLayerDV) { - CrossFilteringLayerDV crossFilteringLayer = (CrossFilteringLayerDV) layerIDV; - String wfsURL = crossFilteringLayer.getWFS_URL(); - RequestBuilder builder = new RequestBuilder(RequestBuilder.GET, wfsURL); + LayerIDV layerIDV = layersIDV.get(0); // Expected one - try { + if (layerIDV instanceof CrossFilteringLayerDV) { + CrossFilteringLayerDV crossFilteringLayer = (CrossFilteringLayerDV) layerIDV; + String wfsURL = crossFilteringLayer.getWFS_URL(); - Request response = builder.sendRequest(null, new RequestCallback() { - public void onError(Request request, Throwable exception) { - // Code omitted for clarity - } + if (selectedItem != null) { - public void onResponseReceived(Request request, Response response) { - JSONString json = new JSONString(response.getText()); - JSONValue parser = JSONParser.parse(response.getText()); - Feature[] features = OLGeoJSONUtil.readGeoJsonFeatures(MAP_PROJECTION.EPSG_4326, - response.getText()); - for (Feature feature : features) { - String key = feature.get(crossFilteringLayer.getTable_key_field()); - String parentKey = feature.get(crossFilteringLayer.getTable_parent_key_field()); - String itemField = feature.get(crossFilteringLayer.getTable_show_field()); + String cqlFilterValue = crossFilteringLayer.getTable_parent_key_field() + "=" + selectedItem.getKey(); + wfsURL += "&CQL_FILTER=" + URL.encode(cqlFilterValue); - parentKey = parentKey == null ? "" : parentKey; + } + GWT.log("wfsURL request: " + wfsURL); + RequestBuilder builder = new RequestBuilder(RequestBuilder.GET, wfsURL); - SelectableItem selectableItem = new SelectableItem(key, parentKey, itemField, - crossFilteringLayer.getName()); + try { - String mapKey = "root_" + parentKey + key; - mapFeatures.put(mapKey, selectableItem); - - } - } - }); - - } catch (RequestException e) { + Request response = builder.sendRequest(null, new RequestCallback() { + public void onError(Request request, Throwable exception) { // Code omitted for clarity } - } + + public void onResponseReceived(Request request, Response response) { + GWT.log("wfsURL response: " + response.getText()); + Feature[] features = OLGeoJSONUtil.readGeoJsonFeatures(MAP_PROJECTION.EPSG_4326, + response.getText()); + + for (Feature feature : features) { + JsPropertyMap properties = feature.getProperties(); + Object key = properties.get(crossFilteringLayer.getTable_key_field()); + Object itemField = properties.get(crossFilteringLayer.getTable_show_field()); + + Object parentKey = null; + if (crossFilteringLayer.getTable_parent_key_field() != null + && !crossFilteringLayer.getTable_parent_key_field().isEmpty()) + parentKey = properties.get(crossFilteringLayer.getTable_parent_key_field()); + + parentKey = parentKey == null ? "" : parentKey; + + SelectableItem selectableItem = new SelectableItem(key + "", parentKey + "", itemField + "", + crossFilteringLayer.getName()); + GWT.log("select item: " + selectableItem); + + String pathFeatureKey = pathFeatureKey(selectableItem); + mapSelectableFeatures.put(pathFeatureKey, selectableItem); + + } + mapInnestedFeatures.put(level, mapSelectableFeatures); + String placholder = placeholderLayer(layersIDV.get(0)); // Expected one + fillListBoxLevel(level, mapSelectableFeatures, listBoxes, placholder); + } + }); + + } catch (RequestException e) { + // Code omitted for clarity } - mapSelectableFeatures.putAll(mapFeatures); } - fillListBoxLevel(level, mapSelectableFeatures, listBoxes); - // mapInnestedFeatures.put(level, mapSelectableFeatures); +// } else { +// +// String placholder = placeholderLayer(layersIDV.get(0)); // Expected one +// fillListBoxLevel(level, mapInnestedFeatures.get(level), listBoxes, placholder); +// } } + private String pathFeatureKey(SelectableItem selectableItem) { + return "root_" + selectableItem.getParentKey() + "_"+selectableItem.getKey(); + } + + private String placeholderLayer(LayerIDV layersIDV) { + return "Select " + layersIDV.getTitle() + "..."; + } + private void addListBoxesLevelToPanel(int level, List layersIDV) { if (layersIDV == null) @@ -268,26 +298,50 @@ public class CrossFilteringLayerPanel extends Composite { ControlLabel cl = new ControlLabel(layerIDV.getTitle()); Controls controls = new Controls(); ListBox listBox = new ListBox(); - listBox.addItem("Select " + layerIDV.getTitle() + " ..."); + String placeholder = placeholderLayer(layerIDV); + listBox.addItem(placeholder); + setEnabledBox(listBox, false); listBoxes.add(listBox); - controls.add(listBox); cg.add(cl); cg.add(controls); - + fieldSet.add(cg); } mapInnestedListBoxes.put(level, listBoxes); } + public void setEnabledBox(ListBox listBox, boolean bool) { + listBox.setEnabled(bool); + } + + public void clearListBox(ListBox listBox, boolean bool) { + listBox.setEnabled(bool); + } + + private void resetListBoxLevel(int level) { + + List listBoxes = mapInnestedListBoxes.get(level); + if(listBoxes!=null) { + for (ListBox listBox : listBoxes) { + listBox.clear(); + setEnabledBox(listBox, false); + } + } + } + private void fillListBoxLevel(int level, HashMap mapSelectableFeatures, - List listBoxes) { + List listBoxes, String placeholder) { + GWT.log("fillBox level: " + level + " map: " + mapSelectableFeatures); if (mapSelectableFeatures == null) return; ListBox listBox = listBoxes.get(0); // Expected one + listBox.clear(); + listBox.addItem(placeholder); + listBox.getElement().getFirstChildElement().setAttribute("disabled", "disabled"); for (String key : mapSelectableFeatures.keySet()) { SelectableItem selItem = mapSelectableFeatures.get(key); @@ -298,13 +352,30 @@ public class CrossFilteringLayerPanel extends Composite { @Override public void onChange(ChangeEvent event) { - loadInnerLevel(level); + loadInnerLevel(level, listBox.getSelectedValue()); } }); + + setEnabledBox(listBox, true); } - private void loadInnerLevel(int level) { - // TODO Auto-generated method stub + private void loadInnerLevel(int level, String selectableItemValue) { + GWT.log("selected level " + level + " selectableItemValue " + selectableItemValue); + HashMap mapSelectableItem = mapInnestedFeatures.get(level); + SelectableItem selectedItem = mapSelectableItem.get(selectableItemValue); + + GWT.log("selected selectableItem " + selectedItem); + int innerLevel = level + 1; + List selectedLayers = mapInnestedFiltering.get(innerLevel); + + //if layer filtering exists at this level + if (selectedLayers != null) { + + List selectedListBoxes = mapInnestedListBoxes.get(innerLevel); + GWT.log("loading inner layers " + selectedLayers); + GWT.log("loading selectedListBoxes " + selectedListBoxes); + filleSelectableLevel(innerLevel, selectedItem); + } } diff --git a/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/ui/customoverlays/OverlayCustomLayerPanel.java b/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/ui/customoverlays/OverlayCustomLayerPanel.java index 5da70d8..55e3e17 100644 --- a/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/ui/customoverlays/OverlayCustomLayerPanel.java +++ b/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/ui/customoverlays/OverlayCustomLayerPanel.java @@ -114,12 +114,6 @@ public class OverlayCustomLayerPanel extends Composite { @Override public void onValueChange(ValueChangeEvent event) { GWT.log("CustomLayer selector flag changed to value : " + event.toDebugString()); - -// String collectionID = ((CheckBox) event.getSource()).getId().replace("gcubeCollectionSelector_", -// ""); - - // GWT.log("Collection ID is : " + collectionID + ", event value: " + - // event.getValue()); if (event.getValue()) { // OPEN COLLECTION applicationBus.fireEvent(new OverlayCustomLayerToMapEvent(layerItem, OverlayCustomLayerToMapEvent.ACTION_TYPE.VISIBILITY, true)); diff --git a/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/ui/util/OLGeoJSONUtil.java b/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/ui/util/OLGeoJSONUtil.java index aa766f4..80e2aa2 100644 --- a/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/ui/util/OLGeoJSONUtil.java +++ b/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/ui/util/OLGeoJSONUtil.java @@ -26,7 +26,7 @@ public class OLGeoJSONUtil { * @param geoJSONString the geo JSON string * @return the geo json */ - public static GeoJson buildGeoJSON(MAP_PROJECTION projection, String geoJSONString) { + public static GeoJson buildGeoJSON(MAP_PROJECTION projection) { GeoJsonFeatureOptions fo = new GeoJsonFeatureOptions(); ProjectionOptions projectionOptions = new ProjectionOptions(); projectionOptions.setCode(projection.getName()); @@ -48,7 +48,7 @@ public class OLGeoJSONUtil { * @return the feature[] */ public static Feature[] readGeoJsonFeatures(MAP_PROJECTION projection, String geoJSONString) { - GeoJson geoJson = buildGeoJSON(projection, geoJSONString); + GeoJson geoJson = buildGeoJSON(projection); return geoJson.readFeatures(geoJSONString); } 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 6efdbd4..ee64f81 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 @@ -508,19 +508,6 @@ public class GeoportalDataViewerServiceImpl extends RemoteServiceServlet impleme GCubeCollection coll = new GCubeCollection(); coll.setUcd(ucdDV); -// // Loading geoportal_grouped_overlay_layers if exists -// GEOPORTAL_DATA_HANDLER theHandler = GEOPORTAL_DATA_HANDLER.geoportal_grouped_overlay_layers; -// List handlers = u.getHandlersByType(theHandler.getType()); -// -// if (handlers != null && handlers.size() > 0) { -// // Loading Handler gcube_profiles -// HandlerDeclaration handler = handlers.get(0); -// List listCustomLayers = getGroupedOverlayLayers(u, handler, -// GEOPORTAL_DATA_HANDLER.geoportal_grouped_overlay_layers); -// config.setGroupCustomLayers(listCustomLayers); -// } else -// LOG.warn("No handler " + theHandler + "found into UCD " + u.getId() + ", continue..."); - // TODO TO Check index flag should be in configuration or evaluated according to // user credentials