almost finished. Minor issues left

git-svn-id: http://svn.research-infrastructures.eu/public/d4science/gcube/trunk/portlets/widgets/grsf-manage-widget@162879 82a268e6-3cf1-43bd-a215-b396298e98cf
This commit is contained in:
Costantino Perciante 2018-02-03 19:44:21 +00:00
parent 55a97c4802
commit 97806357e6
7 changed files with 109 additions and 72 deletions

View File

@ -121,18 +121,18 @@
<dependency>
<groupId>org.gcube.core</groupId>
<artifactId>common-scope-maps</artifactId>
<scope>compile</scope>
<scope>provided</scope>
<!-- put at provided for deploying -->
</dependency>
<dependency>
<groupId>org.gcube.core</groupId>
<artifactId>common-encryption</artifactId>
<scope>compile</scope>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.gcube.common</groupId>
<artifactId>authorization-client</artifactId>
<scope>compile</scope>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>junit</groupId>

View File

@ -1,10 +1,6 @@
package org.gcube.datacatalogue.grsf_manage_widget.client;
import org.gcube.datacatalogue.grsf_manage_widget.client.view.ManageProductWidget;
import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.event.shared.HandlerManager;
import com.google.gwt.user.client.ui.RootPanel;
/**
* Entry point classes define <code>onModuleLoad()</code>.
@ -15,7 +11,7 @@ public class GRSFManageWidget implements EntryPoint {
* This is the entry point method.
*/
public void onModuleLoad(){
HandlerManager eventBus = new HandlerManager(null);
RootPanel.get("manageDiv").add(new ManageProductWidget("fffb6167-b570-42a8-92b9-5be28549c3b8", eventBus));
// HandlerManager eventBus = new HandlerManager(null);
// RootPanel.get("manageDiv").add(new ManageProductWidget("fffb6167-b570-42a8-92b9-5be28549c3b8", eventBus));
}
}

View File

@ -174,7 +174,7 @@ public class ManageProductWidget extends Composite{
// show modal
manageProductModal.addStyleName("management-metadata-modal-style");
manageProductModal.getElement().getStyle().setWidth(60, Unit.PCT);
// manageProductModal.getElement().getStyle().setWidth(60, Unit.PCT);
manageProductModal.show();
// async request to fetch the product
@ -315,7 +315,7 @@ public class ManageProductWidget extends Composite{
bean.setNewStatus(bean.getCurrentStatus());
else
bean.setNewStatus(Status.fromString(listBoxStatus.getSelectedItemText()));
manageProductModal.setCloseVisible(false);
cancelButton.setEnabled(false);
confirmButton.setEnabled(false);
@ -330,7 +330,10 @@ public class ManageProductWidget extends Composite{
// update similar records and to connect
if(similarRecordPanel != null)
bean.setSimilarGrsfRecords(similarRecordPanel.getSimilarRecords());
else
bean.setSimilarGrsfRecords(new ArrayList<SimilarGRSFRecord>(0));
// add the suggested ones, if any
bean.getSimilarGrsfRecords().addAll(suggestedMergesPanel.getSimilarRecords());
// set new values

View File

@ -17,6 +17,8 @@ import com.github.gwtbootstrap.client.ui.TextBox;
import com.github.gwtbootstrap.client.ui.constants.ButtonType;
import com.github.gwtbootstrap.client.ui.constants.IconType;
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.Float;
import com.google.gwt.dom.client.Style.FontWeight;
import com.google.gwt.dom.client.Style.Unit;
@ -24,7 +26,6 @@ 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.KeyCodes;
import com.google.gwt.event.dom.client.KeyPressEvent;
import com.google.gwt.event.dom.client.KeyPressHandler;
import com.google.gwt.uibinder.client.UiBinder;
@ -57,10 +58,9 @@ public class ConnectToWidget extends Composite{
@UiField
Button suggestRecord;
private List<Tuple> connectList = new ArrayList<Tuple>(0);
private List<Tuple> connectList = new ArrayList<Tuple>(0); // for the suggested ones
private List<ConnectedBean> currentlyConnected; // they can be "unconnected" or "removed"
private List<ConnectedBean> suggestedByKnowledgeBase; // they can be "connected"
private List<ConnectedBean> suggestedByUser = new ArrayList<ConnectedBean>(0); // they are "connected" if valid
private GRSFManageWidgetServiceAsync service;
public ConnectToWidget(final ManageProductBean bean, GRSFManageWidgetServiceAsync service) {
@ -170,7 +170,7 @@ public class ConnectToWidget extends Composite{
@Override
public void onClick(ClickEvent arg0) {
connected.setRemove(connect.getValue());
connected.setConnect(connect.getValue());
}
});
rightPanel.add(connect);
@ -200,20 +200,29 @@ public class ConnectToWidget extends Composite{
Paragraph semanticIdentifier = new Paragraph("UUID:");
final TextBox box = new TextBox();
final Icon icon = new Icon(IconType.OK_SIGN);
icon.setVisible(false);
icon.getElement().getStyle().setMarginLeft(10, Unit.PX);
icon.getElement().getStyle().setMarginTop(5, Unit.PX);
final Anchor view = new Anchor();
view.setText("View");
view.setTitle("Click to inspect the record");
view.setTarget("_blank");
view.getElement().getStyle().setFontWeight(FontWeight.BOLD);
view.setVisible(false);
icon.setVisible(false);
// add a couple of handlers
box.addKeyPressHandler(new KeyPressHandler() {
@Override
public void onKeyPress(KeyPressEvent event) {
GWT.log("onKeyPress " + event.getNativeEvent().getKeyCode());
if(!(event.getNativeEvent().getKeyCode() == KeyCodes.KEY_BACKSPACE || event.getNativeEvent().getKeyCode() == KeyCodes.KEY_DELETE))
validateUUID(box, cb, icon, view, acceptedDomain);
Scheduler.get().scheduleDeferred(new ScheduledCommand() {
@Override
public void execute() {
box.setFocus(false);
}
});
}
});
box.addChangeHandler(new ChangeHandler() {
@ -268,12 +277,14 @@ public class ConnectToWidget extends Composite{
protected void validateUUID(final TextBox box, final ConnectedBean c, final Icon icon, final Anchor view, final String acceptedDomain) {
final String currentText = box.getText().trim();
c.setKnowledgeBaseId(null);
c.setConnect(false);
icon.setVisible(false);
view.setVisible(false);
icon.setSpin(false);
if(currentText == null || currentText.isEmpty()){
icon.setVisible(false);
view.setVisible(false);
if(currentText == null || currentText.isEmpty())
return;
}
if(!currentText.matches(REGEX_UUID)){
icon.setType(IconType.BAN_CIRCLE);
@ -294,23 +305,23 @@ public class ConnectToWidget extends Composite{
@Override
public void onSuccess(String result) {
icon.setSpin(false);
if(result != null){
c.setKnowledgeBaseId(currentText);
c.setConnect(true);
icon.setType(IconType.OK_CIRCLE);
icon.setSpin(false);
icon.setTitle("");
icon.setVisible(true);
icon.setTitle("Accepted");
view.setHref(result);
view.setVisible(true);
}
else{
icon.setType(IconType.BAN_CIRCLE);
icon.setTitle("Not a valid UUID");
icon.setSpin(false);
icon.setVisible(true);
view.setVisible(false);
}
icon.setVisible(true);
box.setEnabled(true);
}
@ -319,6 +330,8 @@ public class ConnectToWidget extends Composite{
box.setEnabled(true);
icon.setSpin(false);
view.setVisible(false);
icon.setType(IconType.BAN_CIRCLE);
icon.setTitle(caught.getMessage());
}
});
@ -330,25 +343,25 @@ public class ConnectToWidget extends Composite{
*/
public List<ConnectedBean> getConnectList() {
//TODO
// List<ConnectedBean> toReturn = new ArrayList<>();
//
// if(currentlyConnected != null)
// currentlyConnected = new ArrayList<ConnectedBean>(0);
//
// for (Tuple p : connectList) {
// String suggestedIdentifier = ((ConnectedBean)p.getO()).getDestKnowledgeBaseId();
// if(suggestedIdentifier == null || suggestedIdentifier.isEmpty())
// continue;
// else{
// ConnectedBean connectedRecord = (ConnectedBean) p.getO();
// connectedRecord.setToBeKept(true);
// currentlyConnected.add((ConnectedBean) p.getO());
// }
// }
//
// return currentlyConnected;
return null;
List<ConnectedBean> toReturn = new ArrayList<>();
if(currentlyConnected != null)
toReturn.addAll(currentlyConnected);
if(suggestedByKnowledgeBase != null)
toReturn.addAll(suggestedByKnowledgeBase);
for (Tuple p : connectList) {
ConnectedBean potentialConnection = (ConnectedBean) p.getO();
String suggestedIdentifier = potentialConnection.getKnowledgeBaseId();
if(suggestedIdentifier == null || suggestedIdentifier.isEmpty())
continue;
else
toReturn.add(potentialConnection);
}
return toReturn;
}
}

View File

@ -91,7 +91,6 @@ public class SimilarGRSFRecordWidget extends Composite {
});
}
// add the existing ones, if any
int index = 0;
for (final SimilarGRSFRecord similarGRSFRecord : availableGRSFSimilarRecords) {
Widget widget = buildWidgetForSimilarRecord(similarGRSFRecord);

View File

@ -14,6 +14,8 @@ import com.github.gwtbootstrap.client.ui.TextBox;
import com.github.gwtbootstrap.client.ui.constants.ButtonType;
import com.github.gwtbootstrap.client.ui.constants.IconType;
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.Float;
import com.google.gwt.dom.client.Style.FontWeight;
import com.google.gwt.dom.client.Style.Unit;
@ -21,7 +23,6 @@ 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.KeyCodes;
import com.google.gwt.event.dom.client.KeyPressEvent;
import com.google.gwt.event.dom.client.KeyPressHandler;
import com.google.gwt.uibinder.client.UiBinder;
@ -57,7 +58,7 @@ public class SuggestMerges extends Composite {
public SuggestMerges(GRSFManageWidgetServiceAsync service) {
initWidget(uiBinder.createAndBindUi(this));
this.service = service;
// manage the "suggest button"
addSimilarRecord.setText("Add Merge");
addSimilarRecord.getElement().getStyle().setFontWeight(FontWeight.BOLD);
@ -99,20 +100,29 @@ public class SuggestMerges extends Composite {
Paragraph identifier = new Paragraph("UUID:");
final TextBox box = new TextBox();
final Icon icon = new Icon(IconType.OK_SIGN);
icon.setVisible(false);
icon.getElement().getStyle().setMarginLeft(10, Unit.PX);
icon.getElement().getStyle().setMarginTop(5, Unit.PX);
final Anchor view = new Anchor();
view.setText("View");
view.setTitle("Click to inspect the record");
view.setTarget("_blank");
view.getElement().getStyle().setFontWeight(FontWeight.BOLD);
view.setVisible(false);
icon.setVisible(false);
// add a couple of handlers
box.addKeyPressHandler(new KeyPressHandler() {
@Override
public void onKeyPress(KeyPressEvent event) {
GWT.log("onKeyPress " + event.getNativeEvent().getKeyCode());
if(!(event.getNativeEvent().getKeyCode() == KeyCodes.KEY_BACKSPACE || event.getNativeEvent().getKeyCode() == KeyCodes.KEY_DELETE))
validateUUID(box, s, icon, view, s.getDomain());
Scheduler.get().scheduleDeferred(new ScheduledCommand() {
@Override
public void execute() {
box.setFocus(false);
}
});
}
});
box.addChangeHandler(new ChangeHandler() {
@ -120,7 +130,7 @@ public class SuggestMerges extends Composite {
@Override
public void onChange(ChangeEvent event) {
GWT.log("onChange");
validateUUID(box, s, icon, view, s.getDomain());
validateUUID(box, s, icon, view);
}
});
box.setWidth("511px");
@ -154,6 +164,7 @@ public class SuggestMerges extends Composite {
if(pair.getO().equals(s)){
pair.getW().removeFromParent();
iterator.remove();
break;
}
}
}
@ -177,64 +188,64 @@ public class SuggestMerges extends Composite {
* @param icon
* @param view
*/
protected void validateUUID(final TextBox box, final SimilarGRSFRecord s, final Icon icon, final Anchor view, String domain) {
protected void validateUUID(final TextBox box, final SimilarGRSFRecord s, final Icon icon, final Anchor view) {
final String currentText = box.getText().trim();
s.setKnowledgeBaseId(null);
s.setSuggestedMerge(false);
icon.setVisible(false);
view.setVisible(false);
icon.setSpin(false);
if(currentText == null || currentText.isEmpty()){
s.setKnowledgeBaseId(null);
icon.setVisible(false);
view.setVisible(false);
if(currentText == null || currentText.isEmpty())
return;
}
if(!currentText.matches(REGEX_UUID)){
s.setKnowledgeBaseId(null);
icon.setType(IconType.BAN_CIRCLE);
icon.setTitle("Not a valid UUID");
icon.setVisible(true);
view.setVisible(false);
return;
}
// else check at server side if it exists
GWT.log("Text changed to " + currentText);
box.setEnabled(false);
icon.setVisible(true);
icon.setIcon(IconType.ROTATE_RIGHT);
icon.setTitle("Checking...");
icon.setSpin(true);
service.checkIdentifierExistsInDomain(currentText, domain, new AsyncCallback<String>() {
service.checkIdentifierExistsInDomain(currentText, s.getDomain(), new AsyncCallback<String>() {
@Override
public void onSuccess(String result) {
icon.setSpin(false);
if(result != null){
s.setKnowledgeBaseId(currentText);
s.setSuggestedMerge(true);
icon.setType(IconType.OK_CIRCLE);
icon.setSpin(false);
icon.setTitle("");
icon.setVisible(true);
icon.setTitle("Accepted");
view.setHref(result);
view.setVisible(true);
}
else{
s.setKnowledgeBaseId(null);
icon.setType(IconType.BAN_CIRCLE);
icon.setTitle("Not a valid UUID");
icon.setSpin(false);
icon.setVisible(true);
view.setVisible(false);
}
icon.setVisible(true);
box.setEnabled(true);
}
@Override
public void onFailure(Throwable caught) {
s.setKnowledgeBaseId(null);
box.setEnabled(true);
icon.setSpin(false);
icon.setType(IconType.BAN_CIRCLE);
icon.setVisible(true);
view.setVisible(false);
icon.setTitle(caught.getMessage());
}
});

View File

@ -484,6 +484,21 @@ public class GRSFNotificationService extends RemoteServiceServlet implements GRS
@Override
public String checkIdentifierExistsInDomain(String id,
String domain) throws Exception {
if(!Utils.isIntoPortal()){
boolean throwException = Math.random() > 0.5;
// simulate some delay...
Thread.sleep(2500);
if(throwException)
throw new Exception("The suggested record is not a GRSF record");
return "http://data.d4science.org/catalogue/grsf_admin/" + id;
}
String scopePerCurrentUrl = Utils.getScopeFromClientUrl(getThreadLocalRequest());
DataCatalogue catalogue = getCatalogue(scopePerCurrentUrl);
String username = Utils.getCurrentUser(getThreadLocalRequest()).getUsername();