You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

126 lines
4.7 KiB

package app.views.personform;
import app.data.entity.SamplePerson;
import app.data.service.SamplePersonService;
import app.views.main.MainView;
import com.vaadin.flow.component.Component;
import com.vaadin.flow.component.button.Button;
import com.vaadin.flow.component.button.ButtonVariant;
import com.vaadin.flow.component.combobox.ComboBox;
import com.vaadin.flow.component.customfield.CustomField;
import com.vaadin.flow.component.datepicker.DatePicker;
import com.vaadin.flow.component.dependency.CssImport;
import com.vaadin.flow.component.formlayout.FormLayout;
import com.vaadin.flow.component.html.Div;
import com.vaadin.flow.component.html.H3;
import com.vaadin.flow.component.notification.Notification;
import com.vaadin.flow.component.orderedlayout.HorizontalLayout;
import com.vaadin.flow.component.textfield.EmailField;
import com.vaadin.flow.component.textfield.TextField;
import com.vaadin.flow.data.binder.Binder;
import com.vaadin.flow.router.PageTitle;
import com.vaadin.flow.router.Route;
@CssImport("app/views/personform/person-form-view.css")
@Route(value = "person-form", layout = MainView.class)
@PageTitle("Person Form")
public class PersonFormView extends Div {
private TextField firstName = new TextField("First name");
private TextField lastName = new TextField("Last name");
private EmailField email = new EmailField("Email address");
private DatePicker dateOfBirth = new DatePicker("Birthday");
private PhoneNumberField phone = new PhoneNumberField("Phone number");
private TextField occupation = new TextField("Occupation");
private Button cancel = new Button("Cancel");
private Button save = new Button("Save");
private Binder<SamplePerson> binder = new Binder<>(SamplePerson.class);
public PersonFormView(SamplePersonService personService) {
addClassName("person-form-view");
add(createTitle());
add(createFormLayout());
add(createButtonLayout());
binder.bindInstanceFields(this);
clearForm();
cancel.addClickListener(e -> clearForm());
save.addClickListener(e -> {
personService.update(binder.getBean());
Notification.show(binder.getBean().getClass().getSimpleName() + " details stored.");
clearForm();
});
}
private void clearForm() {
binder.setBean(new SamplePerson());
}
private Component createTitle() {
return new H3("Personal information");
}
private Component createFormLayout() {
FormLayout formLayout = new FormLayout();
email.setErrorMessage("Please enter a valid email address");
formLayout.add(firstName, lastName, dateOfBirth, phone, email, occupation);
return formLayout;
}
private Component createButtonLayout() {
HorizontalLayout buttonLayout = new HorizontalLayout();
buttonLayout.addClassName("button-layout");
save.addThemeVariants(ButtonVariant.LUMO_PRIMARY);
buttonLayout.add(save);
buttonLayout.add(cancel);
return buttonLayout;
}
private static class PhoneNumberField extends CustomField<String> {
private ComboBox<String> countryCode = new ComboBox<>();
private TextField number = new TextField();
public PhoneNumberField(String label) {
setLabel(label);
countryCode.setWidth("120px");
countryCode.setPlaceholder("Country");
countryCode.setPattern("\\+\\d*");
countryCode.setPreventInvalidInput(true);
countryCode.setItems("+354", "+91", "+62", "+98", "+964", "+353", "+44", "+972", "+39", "+225");
countryCode.addCustomValueSetListener(e -> countryCode.setValue(e.getDetail()));
number.setPattern("\\d*");
number.setPreventInvalidInput(true);
HorizontalLayout layout = new HorizontalLayout(countryCode, number);
layout.setFlexGrow(1.0, number);
add(layout);
}
@Override
protected String generateModelValue() {
if (countryCode.getValue() != null && number.getValue() != null) {
return countryCode.getValue() + " " + number.getValue();
}
return "";
}
@Override
protected void setPresentationValue(String phoneNumber) {
String[] parts = phoneNumber != null ? phoneNumber.split(" ", 2) : new String[0];
if (parts.length == 1) {
countryCode.clear();
number.setValue(parts[0]);
} else if (parts.length == 2) {
countryCode.setValue(parts[0]);
number.setValue(parts[1]);
} else {
countryCode.clear();
number.clear();
}
}
}
}