package com.andreiolar.abms.client.widgets;
import com.andreiolar.abms.client.constants.DialogBoxConstants;
import com.andreiolar.abms.client.constants.RegistrationFormConstants;
import com.andreiolar.abms.client.constants.UserMenuConstants;
import com.andreiolar.abms.client.rpc.DBUpdateUser;
import com.andreiolar.abms.client.rpc.DBUpdateUserAsync;
import com.andreiolar.abms.client.utils.DialogBoxCreator;
import com.andreiolar.abms.shared.EmptyStringValidator;
import com.andreiolar.abms.shared.IDSeriesValidator;
import com.andreiolar.abms.shared.MobileNumberValidator;
import com.andreiolar.abms.shared.NameValidator;
import com.andreiolar.abms.shared.UserInfo;
import com.google.gwt.core.client.GWT;
import com.google.gwt.dom.client.Style.Display;
import com.google.gwt.dom.client.Style.FontWeight;
import com.google.gwt.dom.client.Style.Unit;
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.i18n.client.DateTimeFormat;
import com.google.gwt.user.client.DOM;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.rpc.ServiceDefTarget;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.DialogBox;
import com.google.gwt.user.client.ui.Grid;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.TextArea;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.Widget;
import com.google.gwt.user.datepicker.client.DateBox;
public class AccountSettingsWidget extends Composite implements CustomWidget {
private UserInfo userInfo;
public AccountSettingsWidget(UserInfo userInfo) {
this.userInfo = userInfo;
initWidget(initializeWidget());
}
@Override
public Widget initializeWidget() {
VerticalPanel panel = new VerticalPanel();
panel.setSpacing(10);
Label personalInformationLabel = new Label("Personal Information");
personalInformationLabel.getElement().getStyle().setFontSize(24.0, Unit.PX);
personalInformationLabel.getElement().getStyle().setFontWeight(FontWeight.BOLD);
// First Name
Label firstName = new Label("First Name");
final CustomTexBox firstNameBox = new CustomTexBox();
firstNameBox.setMaxLength(30);
firstNameBox.setText(userInfo.getFirstName());
firstNameBox.addValidator(new NameValidator());
firstNameBox.addChangeHandler(new ChangeHandler() {
@Override
public void onChange(ChangeEvent event) {
validate(firstNameBox);
}
});
Label firstNameObs = new Label("(Max 30 characters a-z and a-Z)");
// Last Name
Label lastName = new Label("Last Name");
final CustomTexBox lastNameBox = new CustomTexBox();
lastNameBox.setMaxLength(30);
lastNameBox.setText(userInfo.getLastName());
lastNameBox.addValidator(new NameValidator());
lastNameBox.addChangeHandler(new ChangeHandler() {
@Override
public void onChange(ChangeEvent event) {
validate(lastNameBox);
}
});
Label lastNameObs = new Label("(Max 30 characters a-z and a-Z)");
// Date of Birth
Label dateOfBirth = new Label("Date Of Birth");
// Configure DateBox
DateTimeFormat dateFormat = DateTimeFormat.getLongDateFormat();
final DateBox dateBox = new DateBox();
dateBox.setValue(userInfo.getDateOfBirth());
dateBox.setFormat(new DateBox.DefaultFormat(dateFormat));
dateBox.getDatePicker().setYearArrowsVisible(true);
dateBox.setEnabled(false);
dateBox.setStyleName("fixed-input");
// E-Mail Address
Label emailAddress = new Label("E-Mail Address");
final TextBox formEmailBox = new TextBox();
formEmailBox.setText(userInfo.getEmail());
formEmailBox.setStyleName("fixed-input");
// Mobile Number
Label mobileNumber = new Label("Mobile Number");
final CustomTexBox mobileNumberBox = new CustomTexBox();
mobileNumberBox.setMaxLength(10);
mobileNumberBox.setText(userInfo.getMobileNumber());
mobileNumberBox.addValidator(new MobileNumberValidator());
mobileNumberBox.addChangeHandler(new ChangeHandler() {
@Override
public void onChange(ChangeEvent event) {
mobileNumberBox.validate();
}
});
Label mobileNumberObs = new Label("(10 digit number)");
// Address
Label address = new Label("Address");
final TextArea textArea = new TextArea();
textArea.setText(userInfo.getAddress());
textArea.setVisibleLines(5);
textArea.setWidth("200px");
Label addressObs = new Label("(From your current ID)");
// Country
Label country = new Label("Country");
final TextBox countryBox = new TextBox();
countryBox.setText(userInfo.getCountry());
Label countryObs = new Label("(From the current ID)");
countryBox.setStyleName("fixed-input");
// City
Label city = new Label("City");
final CustomTexBox cityBox = new CustomTexBox();
cityBox.addValidator(new EmptyStringValidator());
cityBox.setText(userInfo.getCity());
cityBox.addChangeHandler(new ChangeHandler() {
@Override
public void onChange(ChangeEvent event) {
cityBox.validate();
}
});
Label cityObs = new Label("(From your current ID)");
// Personal ID Number
Label personalNumber = new Label("Personal ID Number");
final CustomTexBox personalNumberBox = new CustomTexBox();
personalNumberBox.setMaxLength(13);
personalNumberBox.setText(userInfo.getPersonalNumber());
personalNumberBox.setEnabled(false);
Label personalNumberObs = new Label("(Cannot be changed)");
// ID Series
Label seriesNumber = new Label("ID Series");
final CustomTexBox seriesNumberBox = new CustomTexBox();
seriesNumberBox.setMaxLength(8);
seriesNumberBox.setText(userInfo.getIdSeries());
seriesNumberBox.addValidator(new IDSeriesValidator());
seriesNumberBox.addChangeHandler(new ChangeHandler() {
@Override
public void onChange(ChangeEvent event) {
seriesNumberBox.validate();
}
});
Label seriesNumberObs = new Label("(From your current ID)");
// Create a Grid to hold the personal information form
Grid registrationPanel = new Grid(10, 3);
registrationPanel.setWidget(0, 0, firstName);
registrationPanel.setWidget(0, 1, firstNameBox);
registrationPanel.setWidget(0, 2, firstNameObs);
registrationPanel.setWidget(1, 0, lastName);
registrationPanel.setWidget(1, 1, lastNameBox);
registrationPanel.setWidget(1, 2, lastNameObs);
registrationPanel.setWidget(2, 0, dateOfBirth);
registrationPanel.setWidget(2, 1, dateBox);
registrationPanel.setWidget(3, 0, emailAddress);
registrationPanel.setWidget(3, 1, formEmailBox);
registrationPanel.setWidget(4, 0, mobileNumber);
registrationPanel.setWidget(4, 1, mobileNumberBox);
registrationPanel.setWidget(4, 2, mobileNumberObs);
registrationPanel.setWidget(5, 0, address);
registrationPanel.setWidget(5, 1, textArea);
registrationPanel.setWidget(5, 2, addressObs);
registrationPanel.setWidget(6, 0, city);
registrationPanel.setWidget(6, 1, cityBox);
registrationPanel.setWidget(6, 2, cityObs);
registrationPanel.setWidget(7, 0, country);
registrationPanel.setWidget(7, 1, countryBox);
registrationPanel.setWidget(7, 2, countryObs);
registrationPanel.setWidget(8, 0, personalNumber);
registrationPanel.setWidget(8, 1, personalNumberBox);
registrationPanel.setWidget(8, 2, personalNumberObs);
registrationPanel.setWidget(9, 0, seriesNumber);
registrationPanel.setWidget(9, 1, seriesNumberBox);
registrationPanel.setWidget(9, 2, seriesNumberObs);
/* Buttons */
Button submitButton = new Button();
submitButton.setText("Submit");
submitButton.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
String firstName = firstNameBox.getText();
String lastName = lastNameBox.getText();
String email = formEmailBox.getText();
String mobileNumber = mobileNumberBox.getText();
String address = textArea.getText();
String city = cityBox.getText();
String country = countryBox.getText();
String personalNumber = personalNumberBox.getText();
String idSeries = seriesNumberBox.getText();
if (!firstName.equals(userInfo.getFirstName()) || !lastName.equals(userInfo.getLastName()) || !email.equals(userInfo.getEmail())
|| !mobileNumber.equals(userInfo.getMobileNumber()) || !address.equals(userInfo.getAddress())
|| !city.equals(userInfo.getCity()) || !country.equals(userInfo.getCountry()) || !idSeries.equals(userInfo.getIdSeries())) {
if (firstNameBox.validate() && lastNameBox.validate() && mobileNumberBox.validate() && cityBox.validate()
&& personalNumberBox.validate() && seriesNumberBox.validate()) {
DOM.getElementById("loading").getStyle().setDisplay(Display.BLOCK);
DBUpdateUserAsync rpc = (DBUpdateUserAsync) GWT.create(DBUpdateUser.class);
ServiceDefTarget tar = (ServiceDefTarget) rpc;
String moduleURL = GWT.getModuleBaseURL() + "DBUpdateUserImpl";
tar.setServiceEntryPoint(moduleURL);
rpc.updateUser(firstName, lastName, email, mobileNumber, address, city, country, idSeries, personalNumber,
new AsyncCallback<Boolean>() {
@Override
public void onSuccess(Boolean result) {
DOM.getElementById("loading").getStyle().setDisplay(Display.NONE);
DialogBox dialogBox = DialogBoxCreator.createDialogBox(UserMenuConstants.SUCCESS_UPDATE_USER_TITLE,
UserMenuConstants.SUCCESS_UPDATE_USER_MESSAGE, DialogBoxConstants.CLOSE_BUTTON, false, false);
dialogBox.setGlassEnabled(true);
dialogBox.setAnimationEnabled(true);
dialogBox.center();
dialogBox.show();
}
@Override
public void onFailure(Throwable caught) {
DOM.getElementById("loading").getStyle().setDisplay(Display.NONE);
DialogBox dialogBox = DialogBoxCreator.createDialogBox(UserMenuConstants.FAILED_UPDATE_USER_TITLE,
caught.getMessage(), DialogBoxConstants.CLOSE_BUTTON, false, false);
dialogBox.setGlassEnabled(true);
dialogBox.setAnimationEnabled(true);
dialogBox.center();
dialogBox.show();
}
});
} else {
DialogBox dialogBox = DialogBoxCreator.createDialogBox(RegistrationFormConstants.INVALID_DATA_TITLE,
RegistrationFormConstants.INVALID_DATA_MESSAGE, DialogBoxConstants.CLOSE_BUTTON, false, false);
dialogBox.setGlassEnabled(true);
dialogBox.setAnimationEnabled(true);
dialogBox.center();
dialogBox.show();
}
} else {
DialogBox dialogBox = DialogBoxCreator.createDialogBox(UserMenuConstants.DIALOG_BOX_FAILED_SUBMIT_INFO_TITLE,
UserMenuConstants.DIALOG_BOX_FAILED_SUBMIT_INFO_MESSAGE, DialogBoxConstants.CLOSE_BUTTON, false, false);
dialogBox.setGlassEnabled(true);
dialogBox.setAnimationEnabled(true);
dialogBox.center();
dialogBox.show();
}
}
});
// Create reset button
Button resetButton = new Button();
resetButton.setText("Reset");
resetButton.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
firstNameBox.setText(userInfo.getFirstName());
firstNameBox.setErrorStyles(true);
lastNameBox.setText(userInfo.getLastName());
lastNameBox.setErrorStyles(true);
formEmailBox.setText(userInfo.getEmail());
dateBox.setValue(userInfo.getDateOfBirth());
mobileNumberBox.setText(userInfo.getMobileNumber());
mobileNumberBox.setErrorStyles(true);
textArea.setText(userInfo.getAddress());
cityBox.setText(userInfo.getCity());
cityBox.setErrorStyles(true);
countryBox.setText(userInfo.getCountry());
personalNumberBox.setText(userInfo.getPersonalNumber());
personalNumberBox.setErrorStyles(true);
seriesNumberBox.setText(userInfo.getIdSeries());
seriesNumberBox.setErrorStyles(true);
}
});
// Create Grid to hold the buttons
Grid buttonPanel = new Grid(1, 2);
buttonPanel.setWidget(0, 0, submitButton);
buttonPanel.setWidget(0, 1, resetButton);
buttonPanel.setCellSpacing(20);
panel.add(personalInformationLabel);
panel.add(registrationPanel);
panel.add(buttonPanel);
return panel;
}
private void validate(CustomTexBox customBox) {
customBox.validate();
}
}