diff --git a/.settings/org.eclipse.wst.common.component b/.settings/org.eclipse.wst.common.component index 6d901b4..b318cda 100644 --- a/.settings/org.eclipse.wst.common.component +++ b/.settings/org.eclipse.wst.common.component @@ -5,9 +5,6 @@ - - uses - diff --git a/src/main/java/org/gcube/portlets/user/invitefriends/client/ui/InviteWidget.java b/src/main/java/org/gcube/portlets/user/invitefriends/client/ui/InviteWidget.java index 74c0009..f673899 100644 --- a/src/main/java/org/gcube/portlets/user/invitefriends/client/ui/InviteWidget.java +++ b/src/main/java/org/gcube/portlets/user/invitefriends/client/ui/InviteWidget.java @@ -1,5 +1,7 @@ package org.gcube.portlets.user.invitefriends.client.ui; +import org.gcube.portlets.user.invitefriends.client.validation.ValidationErrorsActivity; + import com.github.gwtbootstrap.client.ui.Button; import com.github.gwtbootstrap.client.ui.Form; import com.github.gwtbootstrap.client.ui.HelpBlock; @@ -12,13 +14,14 @@ import com.google.gwt.uibinder.client.UiField; import com.google.gwt.uibinder.client.UiHandler; import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.HTML; +import com.google.gwt.user.client.ui.SimplePanel; import com.google.gwt.user.client.ui.Widget; /** * * @author Massimiliano Assante, ISTI-CNR * */ -public class InviteWidget extends Composite { +public class InviteWidget extends Composite{ public static final String DISPLAY_NAME = "Invite people to this VRE"; @@ -29,29 +32,26 @@ public class InviteWidget extends Composite { } @UiField HTML header; - @UiField TextBox emailAddress; - @UiField Button openModal; - @UiField Button cancelInvite; - @UiField Button sendInvite; - @UiField Modal modalWindow; - @UiField Form mainForm; - @UiField HelpBlock helpBlock; + + @UiField SimplePanel validationErrorsFormPanel; public InviteWidget() { + super(); initWidget(uiBinder.createAndBindUi(this)); header.setText(DISPLAY_NAME); + + new ValidationErrorsActivity().start(validationErrorsFormPanel, null); } - - @UiHandler("openModal") - public void onClick(ClickEvent e) { - helpBlock.setText("We will send the invitation email to: "+emailAddress.getText()); - modalWindow.show(); - } - - @UiHandler("cancelInvite") - public void onCancelClick(ClickEvent e) { - modalWindow.hide(); - } - - +// +// @UiHandler("openModal") +// public void onClick(ClickEvent e) { +// helpBlock.setText("We will send the invitation email to: "+emailAddress.getText()); +// modalWindow.show(); +// } +// +// @UiHandler("cancelInvite") +// public void onCancelClick(ClickEvent e) { +// modalWindow.hide(); +// } +// } diff --git a/src/main/java/org/gcube/portlets/user/invitefriends/client/ui/InviteWidget.ui.xml b/src/main/java/org/gcube/portlets/user/invitefriends/client/ui/InviteWidget.ui.xml index c52d76c..8101f43 100644 --- a/src/main/java/org/gcube/portlets/user/invitefriends/client/ui/InviteWidget.ui.xml +++ b/src/main/java/org/gcube/portlets/user/invitefriends/client/ui/InviteWidget.ui.xml @@ -3,33 +3,6 @@ xmlns:g="urn:import:com.google.gwt.user.client.ui" xmlns:b="urn:import:com.github.gwtbootstrap.client.ui"> - - - - - - Send Invite - - - - - - - Please, enter name and lastname of the friend you - wish to invite: - - - - - - - - - - Cancel - Send Invite - - + \ No newline at end of file diff --git a/src/main/java/org/gcube/portlets/user/invitefriends/client/validation/ValidationErrorsActivity.java b/src/main/java/org/gcube/portlets/user/invitefriends/client/validation/ValidationErrorsActivity.java new file mode 100644 index 0000000..2ae68a6 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/invitefriends/client/validation/ValidationErrorsActivity.java @@ -0,0 +1,161 @@ +/** + * + */ +package org.gcube.portlets.user.invitefriends.client.validation; + +import java.util.HashSet; +import java.util.Set; + +import javax.validation.ConstraintViolation; +import javax.validation.Path; +import javax.validation.metadata.ConstraintDescriptor; + +import org.gcube.portlets.user.invitefriends.client.validation.ValidationErrorsView.UserDetails; + +import com.google.gwt.activity.shared.AbstractActivity; +import com.google.gwt.editor.client.EditorDriver; +import com.google.gwt.event.shared.EventBus; +import com.google.gwt.user.client.ui.AcceptsOneWidget; +import com.google.gwt.validation.client.impl.PathImpl; + +/** + * Showcase for ErrorEditors validation decoration of TextBoxes. + * + * @author ivangsa + * + */ +public class ValidationErrorsActivity extends AbstractActivity implements ValidationErrorsView.Delegate { + + private ValidationErrorsView view; + + + /** + * @see com.google.gwt.activity.shared.Activity#start(com.google.gwt.user.client.ui.AcceptsOneWidget, com.google.gwt.event.shared.EventBus) + */ + @Override + public void start(AcceptsOneWidget panel, EventBus eventBus) { + view = new ValidationErrorsViewImpl(this); + panel.setWidget(view); + } + + @SuppressWarnings({ "unchecked", "rawtypes" }) + @Override + public boolean onSendClick() { + EditorDriver editorDriver = view.getEditorDriver(); + UserDetails login = editorDriver.flush(); + Set> violations = validate(login); + /* This will decorate widgets implementing HasEditorErrors with validation messages */ + return editorDriver.setConstraintViolations( (Set) violations); + } + + private Set> validate(UserDetails user2InviteBean){ + Set> violations = new HashSet>(); + if(user2InviteBean.getEmail() == null || "".equals(user2InviteBean.getEmail().trim())) { + violations.add(buildNotNullConstraintViolation(user2InviteBean, "email")); + } + else if (!isValidEmailAddress(user2InviteBean.getEmail())) { + violations.add(buildInvalidEmailAddressConstraintViolation(user2InviteBean, "email")); + } + return violations; + } + + + private ConstraintViolation buildNotNullConstraintViolation(final UserDetails bean, final String path) { + return new ConstraintViolation() { + @Override + public String getMessage() { + return "must not be empty"; + } + @Override + public String getMessageTemplate() { + return null; + } + @Override + public UserDetails getRootBean() { + return bean; + } + @Override + public Class getRootBeanClass() { + return UserDetails.class; + } + @Override + public Object getLeafBean() { + return bean; + } + + @Override + public Path getPropertyPath() { + return new PathImpl().append(path); + } + + @Override + public Object getInvalidValue() { + return null; + } + @Override + public ConstraintDescriptor getConstraintDescriptor() { + return null; + } + }; + } + + private ConstraintViolation buildInvalidEmailAddressConstraintViolation(final UserDetails bean, final String path) { + return new ConstraintViolation() { + @Override + public String getMessage() { + return "email address must be valid"; + } + @Override + public String getMessageTemplate() { + return null; + } + @Override + public UserDetails getRootBean() { + return bean; + } + @Override + public Class getRootBeanClass() { + return UserDetails.class; + } + @Override + public Object getLeafBean() { + return bean; + } + + @Override + public Path getPropertyPath() { + return new PathImpl().append(path); + } + + @Override + public Object getInvalidValue() { + return null; + } + @Override + public ConstraintDescriptor getConstraintDescriptor() { + return null; + } + }; + } + /** + * + * @param emailValue + * @return + */ + private boolean isValidEmailAddress(String emailValue) { + if(emailValue == null) return true; + + String emailPattern = "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.(?:[a-zA-Z]{2,6})$"; + + boolean valid = false; + + if(emailValue.getClass().toString().equals(String.class.toString())) { + valid = ((String)emailValue).matches(emailPattern); + } else { + valid = ((Object)emailValue).toString().matches(emailPattern); + } + + return valid; +} + +} diff --git a/src/main/java/org/gcube/portlets/user/invitefriends/client/validation/ValidationErrorsView.java b/src/main/java/org/gcube/portlets/user/invitefriends/client/validation/ValidationErrorsView.java new file mode 100644 index 0000000..fc12c88 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/invitefriends/client/validation/ValidationErrorsView.java @@ -0,0 +1,52 @@ +/** + * + */ +package org.gcube.portlets.user.invitefriends.client.validation; + +import com.google.gwt.editor.client.EditorDriver; +import com.google.gwt.user.client.ui.IsWidget; + +/** + * @author ivangsa + * + */ +public interface ValidationErrorsView extends IsWidget { + + public static class UserDetails { + String email; + String name; + String lastName; + + public String getEmail() { + return email; + } + public void setEmail(String email) { + this.email = email; + } + public String getName() { + return name; + } + public void setName(String name) { + this.name = name; + } + + public String getLastName() { + return lastName; + } + public void setLastName(String lastName) { + this.lastName = lastName; + } + @Override + public String toString() { + return "UserDetails [email=" + email + ", name=" + name + + ", lastName=" + lastName + "]"; + } + + } + + public interface Delegate { + boolean onSendClick(); + } + + EditorDriver getEditorDriver(); +} diff --git a/src/main/java/org/gcube/portlets/user/invitefriends/client/validation/ValidationErrorsViewImpl.java b/src/main/java/org/gcube/portlets/user/invitefriends/client/validation/ValidationErrorsViewImpl.java new file mode 100644 index 0000000..89d161b --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/invitefriends/client/validation/ValidationErrorsViewImpl.java @@ -0,0 +1,76 @@ +/** + * + */ +package org.gcube.portlets.user.invitefriends.client.validation; + +import com.github.gwtbootstrap.client.ui.Button; +import com.github.gwtbootstrap.client.ui.HelpBlock; +import com.github.gwtbootstrap.client.ui.Modal; +import com.github.gwtbootstrap.client.ui.TextBox; +import com.google.gwt.core.client.GWT; +import com.google.gwt.editor.client.Editor; +import com.google.gwt.editor.client.EditorDriver; +import com.google.gwt.editor.client.SimpleBeanEditorDriver; +import com.google.gwt.event.dom.client.ClickEvent; +import com.google.gwt.uibinder.client.UiBinder; +import com.google.gwt.uibinder.client.UiField; +import com.google.gwt.uibinder.client.UiHandler; +import com.google.gwt.user.client.ui.Composite; +import com.google.gwt.user.client.ui.Widget; + +/** + * @author ivangsa + * + */ +public class ValidationErrorsViewImpl extends Composite implements ValidationErrorsView, Editor { + + interface Binder extends UiBinder {} + private static Binder uiBinder = GWT.create(Binder.class); + + interface Driver extends SimpleBeanEditorDriver { } + private Driver driver = GWT.create(Driver.class); + + private final Delegate delegate; + + @UiField TextBox email; + @UiField TextBox name; + @UiField TextBox lastName; +// + @UiField Button openModal; + @UiField Button cancelInvite; + @UiField Button sendInvite; + @UiField Modal modalWindow; + @UiField HelpBlock helpBlock; + + /** + * + */ + public ValidationErrorsViewImpl(Delegate delegate) { + super(); + this.delegate = delegate; + initWidget(uiBinder.createAndBindUi(this)); + driver.initialize(this); + driver.edit(new UserDetails()); + } + + @UiHandler("openModal") + void onUserClick(ClickEvent event) { + if (!delegate.onSendClick()) { + helpBlock.setText("We will send the invitation email to: "+email.getText()); + modalWindow.show(); + } + } + + @UiHandler("cancelInvite") + public void onCancelClick(ClickEvent e) { + modalWindow.hide(); + } + + + + @Override + public EditorDriver getEditorDriver() { + return driver; + } +} + diff --git a/src/main/java/org/gcube/portlets/user/invitefriends/client/validation/ValidationErrorsViewImpl.ui.xml b/src/main/java/org/gcube/portlets/user/invitefriends/client/validation/ValidationErrorsViewImpl.ui.xml new file mode 100644 index 0000000..a1f295f --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/invitefriends/client/validation/ValidationErrorsViewImpl.ui.xml @@ -0,0 +1,38 @@ + + + + + + + + + + Send Invite + + + + + + Please, enter Name and + Last name + of the friend you + wish to invite: + + + + + + + + + + Cancel + Send Invite + + + + + \ No newline at end of file diff --git a/src/main/resources/org/gcube/portlets/user/invitefriends/InviteFriends.gwt.xml b/src/main/resources/org/gcube/portlets/user/invitefriends/InviteFriends.gwt.xml index 096d3f3..d46ea40 100644 --- a/src/main/resources/org/gcube/portlets/user/invitefriends/InviteFriends.gwt.xml +++ b/src/main/resources/org/gcube/portlets/user/invitefriends/InviteFriends.gwt.xml @@ -2,6 +2,7 @@ +