import com.itmill.toolkit.demo.sampler.features.dates.DatePopup;
import com.itmill.toolkit.demo.sampler.features.dates.DateResolution;
import com.itmill.toolkit.demo.sampler.features.form.FormBasic;
+import com.itmill.toolkit.demo.sampler.features.form.FormPojo;
import com.itmill.toolkit.demo.sampler.features.layouts.ApplicationLayout;
import com.itmill.toolkit.demo.sampler.features.layouts.CustomLayouts;
import com.itmill.toolkit.demo.sampler.features.layouts.ExpandingComponent;
new Tabsheets(), //
new Accordions(), //
new Panels(), //
- // new Forms(), not done yet
+ new Forms(), // not done yet
new Windows(), //
new Tables(),//
new Texts(), //
super("Forms", new Feature[] {
//
new FormBasic(), //
- });
+ new FormPojo(), //
+ });
}
}
import com.itmill.toolkit.data.Validator;
import com.itmill.toolkit.demo.sampler.APIResource;
import com.itmill.toolkit.demo.sampler.Feature;
+import com.itmill.toolkit.demo.sampler.FeatureSet;
import com.itmill.toolkit.demo.sampler.NamedExternalResource;
+import com.itmill.toolkit.demo.sampler.features.form.FormPojoExample;
+import com.itmill.toolkit.ui.Component;
+import com.itmill.toolkit.ui.Form;
public class Validation extends Feature {
- private static final String desc = "";
+ private static final String desc = "Fields can have Validators that check"
+ + " entered values. This is most useful when used within a Form, but"
+ + " but can be used to validate single, stand-alone Fields as well.";
+
+ @Override
+ public Component getExample() {
+ return new FormPojoExample();
+ }
public String getDescription() {
return desc;
public APIResource[] getRelatedAPI() {
return new APIResource[] { new APIResource(Validatable.class),
- new APIResource(Validator.class) };
+ new APIResource(Validator.class), new APIResource(Form.class) };
}
public Class[] getRelatedFeatures() {
- // TODO link form sample
- return new Class[] { Errors.class };
+ return new Class[] { Errors.class, FeatureSet.Forms.class };
}
public NamedExternalResource[] getRelatedResources() {
- // TODO Auto-generated method stub
return null;
}
package com.itmill.toolkit.demo.sampler.features.form;
+import com.itmill.toolkit.data.Validatable;
+import com.itmill.toolkit.data.Validator;
import com.itmill.toolkit.demo.sampler.APIResource;
import com.itmill.toolkit.demo.sampler.Feature;
+import com.itmill.toolkit.demo.sampler.FeatureSet;
import com.itmill.toolkit.demo.sampler.NamedExternalResource;
+import com.itmill.toolkit.demo.sampler.features.commons.Errors;
+import com.itmill.toolkit.demo.sampler.features.commons.Validation;
import com.itmill.toolkit.ui.Component;
+import com.itmill.toolkit.ui.Form;
public class FormBasic extends Feature {
@Override
public String getDescription() {
- return "A basic form";
+ return "The Form -component provides a convenient way to organize"
+ + " related fields visually.<br/> It is most useful when connected"
+ + " to a data source, and provides buffering and customization"
+ + " features to support that scenario.";
}
- @Override
public APIResource[] getRelatedAPI() {
- // TODO Auto-generated method stub
- return null;
+ return new APIResource[] { new APIResource(Validatable.class),
+ new APIResource(Validator.class), new APIResource(Form.class) };
}
- @Override
public Class[] getRelatedFeatures() {
- // TODO Auto-generated method stub
- return null;
+ return new Class[] { Validation.class, Errors.class,
+ FeatureSet.Forms.class };
}
- @Override
public NamedExternalResource[] getRelatedResources() {
- // TODO Auto-generated method stub
return null;
}
--- /dev/null
+package com.itmill.toolkit.demo.sampler.features.form;
+
+import com.itmill.toolkit.data.Validatable;
+import com.itmill.toolkit.data.Validator;
+import com.itmill.toolkit.demo.sampler.APIResource;
+import com.itmill.toolkit.demo.sampler.Feature;
+import com.itmill.toolkit.demo.sampler.FeatureSet;
+import com.itmill.toolkit.demo.sampler.NamedExternalResource;
+import com.itmill.toolkit.demo.sampler.features.commons.Errors;
+import com.itmill.toolkit.demo.sampler.features.commons.Validation;
+import com.itmill.toolkit.ui.Component;
+import com.itmill.toolkit.ui.Form;
+
+public class FormPojo extends Feature {
+
+ @Override
+ public Component getExample() {
+ return new FormPojoExample();
+ }
+
+ @Override
+ public String getDescription() {
+ return "The Form -component provides a convenient way to organize"
+ + " related fields visually.<br/> It is most useful when connected"
+ + " to a data source, and provides buffering and customization"
+ + " features to support that scenario.<br> It easily be used as"
+ + " a POJO or Bean editor by wrapping the bean using BeanItem."
+ + " The basic functionality only requires a couple of lines of"
+ + " code, then Validators and other customizations can be"
+ + " applied to taste.";
+ }
+
+ public APIResource[] getRelatedAPI() {
+ return new APIResource[] { new APIResource(Validatable.class),
+ new APIResource(Validator.class), new APIResource(Form.class) };
+ }
+
+ public Class[] getRelatedFeatures() {
+ return new Class[] { Validation.class, Errors.class,
+ FeatureSet.Forms.class };
+ }
+
+ public NamedExternalResource[] getRelatedResources() {
+ return null;
+ }
+
+}
person = new Person(); // a person POJO
BeanItem personItem = new BeanItem(person); // item from POJO
- // create the Form
+ // Create the Form
final Form personForm = new Form();
personForm.setWriteThrough(false); // we want explicit 'apply'
personForm.setInvalidCommitted(false); // no invalid values in datamodel
+
// FieldFactory for customizing the fields and adding validators
personForm.setFieldFactory(new PersonFieldFactory());
personForm.setItemDataSource(personItem); // bind to POJO via BeanItem
- // determines which properties are shown, and in which order:
+
+ // Determines which properties are shown, and in which order:
personForm.setVisibleItemProperties(Arrays.asList(new String[] {
"firstName", "lastName", "countryCode", "password",
"birthdate", "shoesize", "uuid" }));
- addComponent(personForm); // add to layout
- // the cancel / apply buttons
+ // Add form to layout
+ addComponent(personForm);
+
+ // The cancel / apply buttons
HorizontalLayout buttons = new HorizontalLayout();
buttons.setSpacing(true);
Button discardChanges = new Button("Discard changes",
});
discardChanges.setStyleName(Button.STYLE_LINK);
buttons.addComponent(discardChanges);
+
Button apply = new Button("Apply", new Button.ClickListener() {
public void buttonClick(ClickEvent event) {
- personForm.commit();
+ try {
+ personForm.commit();
+ } catch (Exception e) {
+ // Ingnored, we'll let the Form handle the errors
+ }
}
});
buttons.addComponent(apply);
}
});
addComponent(showPojoState);
- // showPojoState();
}
private void showPojoState() {
if ("firstName".equals(propertyId)) {
TextField tf = (TextField) f;
tf.setRequired(true);
+ tf.setRequiredError("Please enter a First Name");
tf.setWidth("15em");
tf.addValidator(new StringLengthValidator(
"First Name must be 3-25 characters", 3, 25, false));
} else if ("lastName".equals(propertyId)) {
TextField tf = (TextField) f;
tf.setRequired(true);
+ tf.setRequiredError("Please enter a Last Name");
tf.setWidth("20em");
tf.addValidator(new StringLengthValidator(
"Last Name must be 3-50 characters", 3, 50, false));
TextField tf = (TextField) f;
tf.setSecret(true);
tf.setRequired(true);
+ tf.setRequiredError("Please enter a password");
tf.setWidth("10em");
tf.addValidator(new StringLengthValidator(
"Password must be 6-20 characters", 6, 20, false));