package com.andreiolar.abms.client.view.impl;
import java.util.Date;
import com.andreiolar.abms.client.exception.EmailNotFoundException;
import com.andreiolar.abms.client.exception.InvalidCodeException;
import com.andreiolar.abms.client.exception.InvalidCredentialsException;
import com.andreiolar.abms.client.exception.UsernameUnavailableException;
import com.andreiolar.abms.client.place.AdminPlace;
import com.andreiolar.abms.client.place.UserPlace;
import com.andreiolar.abms.client.rpc.DBChangeForgotPassword;
import com.andreiolar.abms.client.rpc.DBChangeForgotPasswordAsync;
import com.andreiolar.abms.client.rpc.DBCheckForEmail;
import com.andreiolar.abms.client.rpc.DBCheckForEmailAsync;
import com.andreiolar.abms.client.rpc.DBCodeChecker;
import com.andreiolar.abms.client.rpc.DBCodeCheckerAsync;
import com.andreiolar.abms.client.rpc.DBConnection;
import com.andreiolar.abms.client.rpc.DBConnectionAsync;
import com.andreiolar.abms.client.rpc.DBForgotPassword;
import com.andreiolar.abms.client.rpc.DBForgotPasswordAsync;
import com.andreiolar.abms.client.rpc.DBRegisterUser;
import com.andreiolar.abms.client.rpc.DBRegisterUserAsync;
import com.andreiolar.abms.client.view.LoginView;
import com.andreiolar.abms.client.widgets.ModalCreator;
import com.andreiolar.abms.shared.Email;
import com.andreiolar.abms.shared.UserDetails;
import com.google.gwt.core.client.GWT;
import com.google.gwt.dom.client.Style.Float;
import com.google.gwt.dom.client.Style.FontStyle;
import com.google.gwt.dom.client.Style.TextDecoration;
import com.google.gwt.dom.client.Style.TextTransform;
import com.google.gwt.dom.client.Style.Unit;
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.KeyDownEvent;
import com.google.gwt.event.dom.client.KeyDownHandler;
import com.google.gwt.json.client.JSONObject;
import com.google.gwt.json.client.JSONString;
import com.google.gwt.user.client.Cookies;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.rpc.ServiceDefTarget;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.RootPanel;
import com.google.gwt.user.client.ui.Widget;
import gwt.material.design.addins.client.stepper.MaterialStep;
import gwt.material.design.addins.client.stepper.MaterialStepper;
import gwt.material.design.client.constants.ButtonType;
import gwt.material.design.client.constants.Color;
import gwt.material.design.client.constants.IconType;
import gwt.material.design.client.constants.ImageType;
import gwt.material.design.client.constants.InputType;
import gwt.material.design.client.constants.ModalType;
import gwt.material.design.client.constants.WavesType;
import gwt.material.design.client.ui.MaterialButton;
import gwt.material.design.client.ui.MaterialCheckBox;
import gwt.material.design.client.ui.MaterialColumn;
import gwt.material.design.client.ui.MaterialDatePicker;
import gwt.material.design.client.ui.MaterialDatePicker.MaterialDatePickerType;
import gwt.material.design.client.ui.MaterialImage;
import gwt.material.design.client.ui.MaterialListBox;
import gwt.material.design.client.ui.MaterialLoader;
import gwt.material.design.client.ui.MaterialModal;
import gwt.material.design.client.ui.MaterialModalContent;
import gwt.material.design.client.ui.MaterialModalFooter;
import gwt.material.design.client.ui.MaterialPanel;
import gwt.material.design.client.ui.MaterialRow;
import gwt.material.design.client.ui.MaterialTextArea;
import gwt.material.design.client.ui.MaterialTextBox;
import gwt.material.design.client.ui.MaterialTitle;
import gwt.material.design.client.ui.MaterialToast;
import gwt.material.design.client.ui.html.Option;
public class LoginViewImpl extends Composite implements LoginView {
private static Presenter presenter;
private static String name;
public LoginViewImpl() {
String loggedInUser = Cookies.getCookie("sid");
if (loggedInUser != null) {
if (loggedInUser.contains("Admin")) {
Window.Location.replace(GWT.getHostPageBaseURL() + "#AdminPlace:" + loggedInUser);
} else {
Window.Location.replace(GWT.getHostPageBaseURL() + "#UserPlace:" + loggedInUser);
}
}
String cookieMessage = Cookies.getCookie("badUserInfo");
if (cookieMessage != null) {
MaterialToast.fireToast(cookieMessage, "rounded");
}
String sessionExpired = Cookies.getCookie("sessionExpired");
if (sessionExpired != null) {
MaterialToast.fireToast(sessionExpired, "rounded");
}
String usernameChanged = Cookies.getCookie("usernameChanged");
if (usernameChanged != null) {
MaterialToast.fireToast(usernameChanged, "rounded");
}
String passwordChanged = Cookies.getCookie("passwordChanged");
if (passwordChanged != null) {
MaterialToast.fireToast(passwordChanged, "rounded");
}
Widget loginForm = createLoginForm();
initWidget(loginForm);
}
public Widget createLoginForm() {
MaterialRow materialRow = new MaterialRow();
materialRow.setBackgroundColor(Color.GREY_LIGHTEN_4);
materialRow.addStyleName("login-demo");
MaterialColumn materialColumn = new MaterialColumn(12, 8, 6);
materialColumn.setOffset("l3");
MaterialPanel panel = new MaterialPanel();
panel.setShadow(1);
panel.addStyleName("panel");
MaterialPanel fieldPanel = new MaterialPanel();
fieldPanel.addStyleName("fieldPanel");
MaterialImage materialImage = new MaterialImage("images/icons/ab.png");
materialImage.setType(ImageType.CIRCLE);
materialImage.addStyleName("imgProfile");
MaterialTextBox userBox = new MaterialTextBox();
userBox.setType(InputType.TEXT);
userBox.setPlaceholder("Username");
MaterialTextBox passwordBox = new MaterialTextBox();
passwordBox.setType(InputType.PASSWORD);
passwordBox.setPlaceholder("Password");
MaterialCheckBox loggedIn = new MaterialCheckBox();
loggedIn.setText("Keep me logged in");
MaterialButton loginButton = new MaterialButton();
loginButton.setWaves(WavesType.LIGHT);
loginButton.setText("Log In");
loginButton.setWidth("100%");
loginButton.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
String username = userBox.getText();
String password = passwordBox.getText();
performUserConnection(username, password, loginButton, loggedIn);
}
});
passwordBox.addKeyDownHandler(new KeyDownHandler() {
@Override
public void onKeyDown(KeyDownEvent event) {
if (event.getNativeKeyCode() == KeyCodes.KEY_ENTER) {
String username = userBox.getText();
String password = passwordBox.getText();
performUserConnection(username, password, loginButton, loggedIn);
}
}
});
MaterialButton registerButton = new MaterialButton();
registerButton.setWaves(WavesType.LIGHT);
registerButton.setText("Register");
registerButton.setWidth("100%");
registerButton.getElement().getStyle().setMarginTop(20.0, Unit.PX);
registerButton.setBackgroundColor(Color.LIGHT_BLUE_LIGHTEN_3);
registerButton.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
MaterialModal registerPanel = createRegistrationPanel();
RootPanel.get().add(registerPanel);
registerPanel.open();
}
});
MaterialRow rowAction = new MaterialRow();
rowAction.addStyleName("rowAction");
MaterialColumn mCol = new MaterialColumn(12, 12, 6);
mCol.setWidth("100%");
MaterialButton forgotPaswordLink = new MaterialButton();
forgotPaswordLink.setText("Forgot Password?");
forgotPaswordLink.setTextColor(Color.BLUE);
forgotPaswordLink.setType(ButtonType.FLAT);
forgotPaswordLink.getElement().getStyle().setMarginTop(10.0, Unit.PX);
forgotPaswordLink.setFloat(Float.RIGHT);
forgotPaswordLink.getElement().getStyle().setTextDecoration(TextDecoration.UNDERLINE);
forgotPaswordLink.getElement().getStyle().setTextTransform(TextTransform.CAPITALIZE);
forgotPaswordLink.getElement().getStyle().setFontStyle(FontStyle.ITALIC);
forgotPaswordLink.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
MaterialModal forgotPasswordPanel = createForgotPasswordPanel();
RootPanel.get().add(forgotPasswordPanel);
forgotPasswordPanel.open();
}
});
mCol.add(loggedIn);
mCol.add(forgotPaswordLink);
rowAction.add(mCol);
fieldPanel.add(materialImage);
fieldPanel.add(userBox);
fieldPanel.add(passwordBox);
fieldPanel.add(loginButton);
fieldPanel.add(registerButton);
fieldPanel.add(rowAction);
panel.add(fieldPanel);
materialColumn.add(panel);
materialRow.add(materialColumn);
return materialRow;
}
protected MaterialModal createForgotPasswordPanel() {
MaterialModal forgotPasswordPanel = new MaterialModal();
forgotPasswordPanel.setType(ModalType.DEFAULT);
forgotPasswordPanel.setDismissible(false);
forgotPasswordPanel.setInDuration(500);
forgotPasswordPanel.setOutDuration(500);
MaterialModalContent materialModalContent = new MaterialModalContent();
MaterialTitle materialTitle = new MaterialTitle("Password Recovery");
materialTitle.setDescription(
"Please provide all necessary information in order to reset your password. A code will be sent to you by E-Mail which will be used in the next step.");
materialModalContent.add(materialTitle);
MaterialTextBox emailTextBox = new MaterialTextBox();
emailTextBox.setType(InputType.EMAIL);
emailTextBox.setPlaceholder("E-Mail");
emailTextBox.setIconType(IconType.ACCOUNT_CIRCLE);
materialModalContent.add(emailTextBox);
MaterialButton processEmailButton = new MaterialButton();
processEmailButton.setWaves(WavesType.LIGHT);
processEmailButton.setText("Send Code");
processEmailButton.setWidth("100%");
processEmailButton.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
String email = emailTextBox.getText();
processEmailButton.setEnabled(false);
if (email.matches("^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.(?:[a-zA-Z]{2,6})$")) {
DBForgotPasswordAsync rpcService = (DBForgotPasswordAsync) GWT.create(DBForgotPassword.class);
ServiceDefTarget target = (ServiceDefTarget) rpcService;
String moduleRelativeURL = GWT.getModuleBaseURL() + "DBForgotPasswordImpl";
target.setServiceEntryPoint(moduleRelativeURL);
rpcService.sendMailToServer(email, new AsyncCallback<Boolean>() {
@Override
public void onSuccess(Boolean result) {
materialTitle.setDescription("Please enter the code you recieved by E-Mail.");
materialModalContent.remove(emailTextBox);
materialModalContent.remove(processEmailButton);
MaterialTextBox codeBox = new MaterialTextBox();
codeBox.setType(InputType.TEXT);
codeBox.setPlaceholder("Confirmation Code");
codeBox.setIconType(IconType.LOCK);
materialModalContent.add(codeBox);
MaterialButton processCodeButton = new MaterialButton();
processCodeButton.setWaves(WavesType.LIGHT);
processCodeButton.setText("Proceed");
processCodeButton.setWidth("100%");
processCodeButton.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
String code = codeBox.getText();
processCodeButton.setEnabled(false);
DBCodeCheckerAsync rpcService = (DBCodeCheckerAsync) GWT.create(DBCodeChecker.class);
ServiceDefTarget target = (ServiceDefTarget) rpcService;
String moduleRelativeURL = GWT.getModuleBaseURL() + "DBCodeCheckerImpl";
target.setServiceEntryPoint(moduleRelativeURL);
rpcService.checkCode(code, email, new AsyncCallback<Void>() {
@Override
public void onSuccess(Void result) {
materialTitle.setDescription("Please choose a new password.");
materialModalContent.remove(codeBox);
materialModalContent.remove(processCodeButton);
MaterialTextBox passwordBox = new MaterialTextBox();
passwordBox.setType(InputType.PASSWORD);
passwordBox.setPlaceholder("Password");
passwordBox.setLength(10);
passwordBox.setMaxLength(10);
passwordBox.setIconType(IconType.LOCK);
materialModalContent.add(passwordBox);
MaterialTextBox repeatPasswordBox = new MaterialTextBox();
repeatPasswordBox.setType(InputType.PASSWORD);
repeatPasswordBox.setPlaceholder("Repeat Password");
repeatPasswordBox.setLength(10);
repeatPasswordBox.setMaxLength(10);
repeatPasswordBox.setIconType(IconType.LOCK);
materialModalContent.add(repeatPasswordBox);
MaterialButton processPasswordButton = new MaterialButton();
processPasswordButton.setWaves(WavesType.LIGHT);
processPasswordButton.setText("Change Password");
processPasswordButton.setWidth("100%");
processPasswordButton.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
String password = passwordBox.getText();
String repeatPassword = repeatPasswordBox.getText();
boolean canProceed = true;
if (!password.matches("[A-Za-z0-9]{5,10}")) {
canProceed = false;
passwordBox.setError(
"Password can only contain uppercase, lowercase letters and 0-9 digits. Password has to be between 5 and 10 characters long.");
} else {
passwordBox.setSuccess("");
}
if (!repeatPassword.matches("[A-Za-z0-9]{5,10}")) {
canProceed = false;
repeatPasswordBox.setError(
"Password can only contain uppercase, lowercase letters and 0-9 digits. Password has to be between 5 and 10 characters long.");
} else {
repeatPasswordBox.setSuccess("");
}
if (canProceed) {
if (!repeatPassword.equals(password)) {
repeatPasswordBox.setError("Passwords must match.");
} else {
processPasswordButton.setEnabled(false);
DBChangeForgotPasswordAsync rpcService = (DBChangeForgotPasswordAsync) GWT
.create(DBChangeForgotPassword.class);
ServiceDefTarget target = (ServiceDefTarget) rpcService;
String moduleRelativeURL = GWT.getModuleBaseURL() + "DBChangeForgotPasswordImpl";
target.setServiceEntryPoint(moduleRelativeURL);
rpcService.resetPassword(email, password, new AsyncCallback<Boolean>() {
@Override
public void onSuccess(Boolean result) {
forgotPasswordPanel.close();
RootPanel.get().remove(forgotPasswordPanel);
MaterialToast.fireToast("Password changed successfully!", "rounded");
}
@Override
public void onFailure(Throwable caught) {
processPasswordButton.setEnabled(true);
if (!(caught instanceof RuntimeException)) {
MaterialToast.fireToast(caught.getMessage(), "rounded");
}
}
});
}
}
}
});
materialModalContent.add(processPasswordButton);
}
@Override
public void onFailure(Throwable caught) {
processCodeButton.setEnabled(true);
if (caught instanceof InvalidCodeException) {
codeBox.setError(caught.getMessage());
} else {
MaterialModal errorModal = ModalCreator.createModal(caught);
RootPanel.get().add(errorModal);
errorModal.open();
}
}
});
}
});
materialModalContent.add(processCodeButton);
}
@Override
public void onFailure(Throwable caught) {
processEmailButton.setEnabled(true);
MaterialModal errorModal = ModalCreator.createModal(caught);
RootPanel.get().add(errorModal);
errorModal.open();
}
});
} else {
processEmailButton.setEnabled(true);
emailTextBox.setError("Not a valid E-Mail Address.");
}
}
});
materialModalContent.add(processEmailButton);
MaterialModalFooter materialModalFooter = new MaterialModalFooter();
MaterialButton closeButton = new MaterialButton();
closeButton.setText("Close");
closeButton.setType(ButtonType.FLAT);
closeButton.addClickHandler(h -> {
forgotPasswordPanel.close();
RootPanel.get().remove(forgotPasswordPanel);
});
materialModalFooter.add(closeButton);
forgotPasswordPanel.add(materialModalContent);
forgotPasswordPanel.add(materialModalFooter);
return forgotPasswordPanel;
}
protected MaterialModal createRegistrationPanel() {
MaterialModal registerPanel = new MaterialModal();
registerPanel.setDismissible(false);
registerPanel.setInDuration(500);
registerPanel.setOutDuration(500);
MaterialModalContent content = new MaterialModalContent();
MaterialStepper stepper = new MaterialStepper();
MaterialStep stepOne = new MaterialStep();
MaterialStep stepTwo = new MaterialStep();
stepTwo.setEnabled(false);
MaterialStep stepThree = new MaterialStep();
stepThree.setEnabled(false);
// Step 1
stepOne.setStep(1);
stepOne.setTitle("E-Mail Verification");
stepOne.setDescription("Your registration elegibility will be verified.");
MaterialPanel stepOnePanel = new MaterialPanel();
stepOnePanel.setWidth("100%");
MaterialTextBox emailTextBox = new MaterialTextBox();
emailTextBox.setType(InputType.EMAIL);
emailTextBox.setPlaceholder("E-Mail");
emailTextBox.setIconType(IconType.ACCOUNT_CIRCLE);
stepOnePanel.add(emailTextBox);
stepOne.add(stepOnePanel);
MaterialButton continueStepOneButton = new MaterialButton();
continueStepOneButton.setText("Next Step");
continueStepOneButton.setGrid("l4");
continueStepOneButton.setMarginTop(12.0);
continueStepOneButton.setTextColor(Color.WHITE);
continueStepOneButton.setWaves(WavesType.DEFAULT);
continueStepOneButton.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
String email = emailTextBox.getText();
if (email.matches("^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.(?:[a-zA-Z]{2,6})$")) {
MaterialLoader.showLoading(true);
DBCheckForEmailAsync rpcService = (DBCheckForEmailAsync) GWT.create(DBCheckForEmail.class);
ServiceDefTarget target = (ServiceDefTarget) rpcService;
String moduleRelativeURL = GWT.getModuleBaseURL() + "DBCheckForEmailImpl";
target.setServiceEntryPoint(moduleRelativeURL);
rpcService.checkForEmail(email, new AsyncCallback<Email>() {
@Override
public void onSuccess(Email result) {
MaterialLoader.showLoading(false);
emailTextBox.setSuccess("");
stepper.setSuccess("");
stepTwo.setEnabled(true);
stepper.nextStep();
stepOne.setEnabled(false);
}
@Override
public void onFailure(Throwable caught) {
MaterialLoader.showLoading(false);
if (caught instanceof EmailNotFoundException) {
stepper.setError("Some errors occured!");
emailTextBox.setError(
"Provided E-Mail Address was not found. Please contact your Administrator for further information.");
} else {
stepper.setError("Something went wrong");
emailTextBox.removeErrorModifiers();
MaterialModal errorModal = ModalCreator.createModal(caught);
RootPanel.get().add(errorModal);
errorModal.open();
}
}
});
} else {
stepper.setError("Some errors occured!");
emailTextBox.setError("Not a valid E-Mail Address.");
}
}
});
stepOne.add(continueStepOneButton);
MaterialButton previousStepOneButton = new MaterialButton();
previousStepOneButton.setText("Cancel");
previousStepOneButton.setGrid("l4");
previousStepOneButton.setMarginTop(12.0);
previousStepOneButton.setType(ButtonType.FLAT);
previousStepOneButton.setWaves(WavesType.DEFAULT);
previousStepOneButton.addClickHandler(ch -> {
stepper.prevStep();
RootPanel.get().remove(registerPanel);
registerPanel.close();
MaterialToast.fireToast("Registration process aborted by user!", "rounded");
});
stepOne.add(previousStepOneButton);
// Step 2
stepTwo.setStep(2);
stepTwo.setTitle("Registration: Personal Details");
stepTwo.setDescription("Your personal details will be processed.");
MaterialPanel stepTwoPanel = new MaterialPanel();
stepTwoPanel.setWidth("100%");
/** Start adding registration widgets **/
MaterialTextBox firstNameBox = new MaterialTextBox();
firstNameBox.setType(InputType.TEXT);
firstNameBox.setPlaceholder("First Name");
firstNameBox.setMaxLength(30);
firstNameBox.setLength(30);
firstNameBox.setIconType(IconType.PERSON);
stepTwoPanel.add(firstNameBox);
MaterialTextBox lastNameBox = new MaterialTextBox();
lastNameBox.setType(InputType.TEXT);
lastNameBox.setPlaceholder("Last Name");
lastNameBox.setMaxLength(30);
lastNameBox.setLength(30);
lastNameBox.setIconType(IconType.PERSON);
stepTwoPanel.add(lastNameBox);
MaterialDatePicker dateOfBirthBox = new MaterialDatePicker();
dateOfBirthBox.setPlaceholder("Date of Birth");
dateOfBirthBox.setSelectionType(MaterialDatePickerType.YEAR);
dateOfBirthBox.setDate(new Date(0));
dateOfBirthBox.setDateMax(new Date());
dateOfBirthBox.setIconType(IconType.DATE_RANGE);
stepTwoPanel.add(dateOfBirthBox);
MaterialTextBox mobileNumberBox = new MaterialTextBox();
mobileNumberBox.setType(InputType.TEL);
mobileNumberBox.setPlaceholder("Phone Number");
mobileNumberBox.setMaxLength(10);
mobileNumberBox.setLength(10);
mobileNumberBox.setIconType(IconType.SMARTPHONE);
stepTwoPanel.add(mobileNumberBox);
MaterialListBox genderBox = new MaterialListBox();
genderBox.setPlaceholder("Gender");
genderBox.add(new Option("Male"));
genderBox.add(new Option("Female"));
stepTwoPanel.add(genderBox);
MaterialTextArea addressBox = new MaterialTextArea();
addressBox.setType(InputType.TEXT);
addressBox.setPlaceholder("Address");
addressBox.setLength(200);
addressBox.setIconType(IconType.HOME);
stepTwoPanel.add(addressBox);
MaterialTextBox cityBox = new MaterialTextBox();
cityBox.setType(InputType.TEXT);
cityBox.setPlaceholder("Home City");
cityBox.setMaxLength(30);
cityBox.setLength(30);
cityBox.setIconType(IconType.LOCATION_CITY);
stepTwoPanel.add(cityBox);
MaterialTextBox countryBox = new MaterialTextBox();
countryBox.setType(InputType.TEXT);
countryBox.setPlaceholder("Home Country");
countryBox.setMaxLength(30);
countryBox.setLength(30);
countryBox.setIconType(IconType.PUBLIC);
stepTwoPanel.add(countryBox);
MaterialTextBox cnpBox = new MaterialTextBox();
cnpBox.setType(InputType.TEXT);
cnpBox.setPlaceholder("CNP");
cnpBox.setMaxLength(13);
cnpBox.setLength(13);
cnpBox.setIconType(IconType.PERM_IDENTITY);
stepTwoPanel.add(cnpBox);
MaterialTextBox personalNumberBox = new MaterialTextBox();
personalNumberBox.setType(InputType.TEXT);
personalNumberBox.setPlaceholder("ID Series and Number");
personalNumberBox.setMaxLength(8);
personalNumberBox.setLength(8);
personalNumberBox.setIconType(IconType.PERM_IDENTITY);
stepTwoPanel.add(personalNumberBox);
/** End adding registration widgets **/
stepTwo.add(stepTwoPanel);
MaterialButton continueStepTwoButton = new MaterialButton();
continueStepTwoButton.setText("Next Step");
continueStepTwoButton.setGrid("l4");
continueStepTwoButton.setMarginTop(12.0);
continueStepTwoButton.setTextColor(Color.WHITE);
continueStepTwoButton.setWaves(WavesType.DEFAULT);
continueStepTwoButton.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
String firstName = firstNameBox.getText();
String lastName = lastNameBox.getText();
String mobileNumber = mobileNumberBox.getText();
String address = addressBox.getText();
String city = cityBox.getText();
String country = countryBox.getText();
String cnp = cnpBox.getText();
String personalNumber = personalNumberBox.getText();
boolean canProcceed = true;
if (!firstName.matches("[A-Za-z]{1,30}")) {
canProcceed = false;
stepper.setError("Some errors occured!");
firstNameBox.setError("First name cannot be empty or exceed 30 characters.");
} else {
firstNameBox.setSuccess("");
}
if (!lastName.matches("[A-Za-z]{1,30}")) {
canProcceed = false;
stepper.setError("Some errors occured!");
lastNameBox.setError("Last name cannot be empty or exceed 30 characters.");
} else {
lastNameBox.setSuccess("");
}
if (!mobileNumber.matches("[0-9]{10}")) {
canProcceed = false;
stepper.setError("Some errors occured!");
mobileNumberBox.setError("Only digits are allowed. Phone number must have 10 digits.");
} else {
mobileNumberBox.setSuccess("");
}
if (address.length() < 1 || address.length() > 200) {
canProcceed = false;
stepper.setError("Some errors occured!");
addressBox.setError("Address cannot be empty or exceed 200 characters.");
} else {
addressBox.setSuccess("");
}
if (!city.matches("[A-Za-z]{1,30}")) {
canProcceed = false;
stepper.setError("Some errors occured!");
cityBox.setError("City cannot be empty or exceed 30 characters.");
} else {
cityBox.setSuccess("");
}
if (!country.matches("[A-Za-z]{1,30}")) {
canProcceed = false;
stepper.setError("Some errors occured!");
countryBox.setError("Country cannot be empty or exceed 30 characters.");
} else {
countryBox.setSuccess("");
}
if (!cnp.matches("[0-9]{13}")) {
canProcceed = false;
stepper.setError("Some errors occured!");
cnpBox.setError("Only digits are allowed. CNP must have 13 digits.");
} else {
cnpBox.setSuccess("");
}
if (!personalNumber.matches("[A-Za-z]{2}[0-9]{6}")) {
canProcceed = false;
stepper.setError("Some errors occured!");
personalNumberBox.setError("Personal number and series cannot be empty. 2 letters followed by 6 numbers are required.");
} else {
personalNumberBox.setSuccess("");
}
if (canProcceed) {
stepper.setSuccess("");
dateOfBirthBox.setSuccess("");
genderBox.setSuccess("");
stepThree.setEnabled(true);
stepper.nextStep();
stepTwo.setEnabled(false);
}
}
});
stepTwo.add(continueStepTwoButton);
MaterialButton previousStepTwoButton = new MaterialButton();
previousStepTwoButton.setText("Previous Step");
previousStepTwoButton.setGrid("l4");
previousStepTwoButton.setMarginTop(12.0);
previousStepTwoButton.setType(ButtonType.FLAT);
previousStepTwoButton.setWaves(WavesType.DEFAULT);
previousStepTwoButton.addClickHandler(ch -> {
stepOne.setEnabled(true);
stepper.prevStep();
stepTwo.setEnabled(false);
});
stepTwo.add(previousStepTwoButton);
// Step 3
stepThree.setStep(3);
stepThree.setTitle("Registration: Login Credentials");
stepThree.setDescription("Your login credentials will be processed.");
MaterialPanel stepThreePanel = new MaterialPanel();
stepThreePanel.setWidth("100%");
/** Start adding credentials widgets **/
MaterialTextBox usernameBox = new MaterialTextBox();
usernameBox.setType(InputType.TEXT);
usernameBox.setPlaceholder("Username");
usernameBox.setLength(25);
usernameBox.setMaxLength(25);
usernameBox.setIconType(IconType.ACCOUNT_CIRCLE);
stepThreePanel.add(usernameBox);
MaterialTextBox passwordBox = new MaterialTextBox();
passwordBox.setType(InputType.PASSWORD);
passwordBox.setPlaceholder("Password");
passwordBox.setLength(10);
passwordBox.setMaxLength(10);
passwordBox.setIconType(IconType.LOCK);
stepThreePanel.add(passwordBox);
MaterialTextBox repeatPasswordBox = new MaterialTextBox();
repeatPasswordBox.setType(InputType.PASSWORD);
repeatPasswordBox.setPlaceholder("Repeat Password");
repeatPasswordBox.setLength(10);
repeatPasswordBox.setMaxLength(10);
repeatPasswordBox.setIconType(IconType.LOCK);
stepThreePanel.add(repeatPasswordBox);
/** End adding credentials widgets **/
stepThree.add(stepThreePanel);
MaterialButton continueStepThreeButton = new MaterialButton();
continueStepThreeButton.setText("Finish");
continueStepThreeButton.setGrid("l4");
continueStepThreeButton.setMarginTop(12.0);
continueStepThreeButton.setTextColor(Color.WHITE);
continueStepThreeButton.setWaves(WavesType.DEFAULT);
continueStepThreeButton.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
String username = usernameBox.getText();
String password = passwordBox.getText();
String repeatPassword = repeatPasswordBox.getText();
boolean canProceed = true;
if (!username.matches("[A-Za-z0-9._-]{5,25}")) {
canProceed = false;
stepper.setError("Some errors occured!");
usernameBox.setError(
"Username can only contain uppercase, lowercase letters, 0-9 digits and following special characters . _ - and must be between 5 and 25 characters long.");
} else {
usernameBox.setSuccess("");
}
if (!password.matches("[A-Za-z0-9]{5,10}")) {
canProceed = false;
stepper.setError("Some errors occured!");
passwordBox.setError(
"Password can only contain uppercase, lowercase letters and 0-9 digits. Password has to be between 5 and 10 characters long.");
} else {
passwordBox.setSuccess("");
}
if (!repeatPassword.matches("[A-Za-z0-9]{5,10}")) {
canProceed = false;
stepper.setError("Some errors occured!");
repeatPasswordBox.setError(
"Password can only contain uppercase, lowercase letters and 0-9 digits. Password has to be between 5 and 10 characters long.");
} else {
repeatPasswordBox.setSuccess("");
}
if (canProceed) {
if (!repeatPassword.equals(password)) {
canProceed = false;
stepper.setError("Some errors occured!");
repeatPasswordBox.setError("Passwords must match.");
} else {
repeatPasswordBox.setSuccess("");
String firstName = firstNameBox.getText();
String lastName = lastNameBox.getText();
Date dateOfBirth = dateOfBirthBox.getDate();
String email = emailTextBox.getText();
String mobileNumber = mobileNumberBox.getText();
String gender = genderBox.getSelectedItemText();
String address = addressBox.getText();
String city = cityBox.getText();
String country = countryBox.getText();
String cnp = cnpBox.getText();
String personalNumber = personalNumberBox.getText();
continueStepThreeButton.setEnabled(false);
DBRegisterUserAsync rpcService = (DBRegisterUserAsync) GWT.create(DBRegisterUser.class);
ServiceDefTarget target = (ServiceDefTarget) rpcService;
String moduleRelativeURL = GWT.getModuleBaseURL() + "DBRegisterUserImpl";
target.setServiceEntryPoint(moduleRelativeURL);
UserDetails userDetails = new UserDetails(firstName, lastName, dateOfBirth, email, mobileNumber, gender, address, city,
country, cnp, personalNumber, username, password, null);
rpcService.registerUser(userDetails, new AsyncCallback<Boolean>() {
@Override
public void onSuccess(Boolean result) {
continueStepThreeButton.setEnabled(true);
stepper.setSuccess("");
RootPanel.get().remove(registerPanel);
registerPanel.close();
MaterialToast.fireToast("User: " + username + " has successfully registered!", "rounded");
}
@Override
public void onFailure(Throwable caught) {
continueStepThreeButton.setEnabled(true);
if (caught instanceof UsernameUnavailableException) {
usernameBox.setError(caught.getMessage());
} else {
MaterialModal errorModal = ModalCreator.createModal(caught);
RootPanel.get().add(errorModal);
errorModal.open();
}
}
});
}
}
}
});
stepThree.add(continueStepThreeButton);
MaterialButton previousStepThreeButton = new MaterialButton();
previousStepThreeButton.setText("Previous Step");
previousStepThreeButton.setGrid("l4");
previousStepThreeButton.setMarginTop(12.0);
previousStepThreeButton.setType(ButtonType.FLAT);
previousStepThreeButton.setWaves(WavesType.DEFAULT);
previousStepThreeButton.addClickHandler(ch -> {
stepTwo.setEnabled(true);
stepper.prevStep();
stepThree.setEnabled(false);
});
stepThree.add(previousStepThreeButton);
stepper.add(stepOne);
stepper.add(stepTwo);
stepper.add(stepThree);
content.add(stepper);
registerPanel.add(content);
return registerPanel;
}
private static void performUserConnection(String username, String password, MaterialButton loginButton, MaterialCheckBox loggedIn) {
loginButton.setEnabled(false);
DBConnectionAsync rpcService = (DBConnectionAsync) GWT.create(DBConnection.class);
ServiceDefTarget target = (ServiceDefTarget) rpcService;
String moduleRelativeURL = GWT.getModuleBaseURL() + "DBConnectionImpl";
target.setServiceEntryPoint(moduleRelativeURL);
rpcService.authenticateUser(username, password, new AsyncCallback<UserDetails>() {
@Override
public void onSuccess(UserDetails userDetails) {
loginButton.setEnabled(true);
JSONObject userInfoObject = new JSONObject();
userInfoObject.put("firstName", new JSONString(userDetails.getFirstName()));
userInfoObject.put("lastName", new JSONString(userDetails.getLastName()));
userInfoObject.put("dateOfBirth", new JSONString(userDetails.getDateOfBirth().toString()));
userInfoObject.put("email", new JSONString(userDetails.getEmail()));
userInfoObject.put("mobileNumber", new JSONString(userDetails.getMobileNumber()));
userInfoObject.put("gender", new JSONString(userDetails.getGender()));
userInfoObject.put("address", new JSONString(userDetails.getAddress()));
userInfoObject.put("city", new JSONString(userDetails.getCity()));
userInfoObject.put("country", new JSONString(userDetails.getCountry()));
userInfoObject.put("personalNumber", new JSONString(userDetails.getPersonalNumber()));
userInfoObject.put("idSeries", new JSONString(userDetails.getIdSeries()));
userInfoObject.put("apartmentNumber", new JSONString(userDetails.getApartmentNumber()));
userInfoObject.put("username", new JSONString(userDetails.getUsername()));
if (loggedIn.getValue()) {
final long DURATION = 1000 * 60 * 60 * 24 * 1; // 1 day
Date expires = new Date(System.currentTimeMillis() + DURATION);
Cookies.setCookie("sid", userInfoObject.toString(), expires, null, "/", false);
} else {
final long DURATION = 1000 * 60 * 60; // 1 hour
Date expires = new Date(System.currentTimeMillis() + DURATION);
Cookies.setCookie("sid", userInfoObject.toString(), expires, null, "/", false);
}
if (userDetails.getType().equals("User")) {
presenter.goTo(new UserPlace(userInfoObject.toString()));
} else if (userDetails.getType().equals("Admin")) {
presenter.goTo(new AdminPlace(userInfoObject.toString()));
}
}
@Override
public void onFailure(Throwable caught) {
loginButton.setEnabled(true);
if (caught instanceof InvalidCredentialsException) {
MaterialToast.fireToast(caught.getMessage(), "rounded");
} else {
MaterialModal materialModal = ModalCreator.createErrorModal("Something went wrong", caught);
RootPanel.get().add(materialModal);
materialModal.open();
}
}
});
}
@Override
public void setName(String placeName) {
this.name = name;
}
@Override
public void setPresenter(Presenter presenter) {
this.presenter = presenter;
}
}