package org.apache.wicket.examples.wizard;
import java.util.Arrays;
import java.util.List;
import org.apache.wicket.Component;
import org.apache.wicket.extensions.wizard.AjaxWizardButtonBar;
import org.apache.wicket.extensions.wizard.StaticContentStep;
import org.apache.wicket.extensions.wizard.Wizard;
import org.apache.wicket.extensions.wizard.WizardModel;
import org.apache.wicket.extensions.wizard.WizardModel.ICondition;
import org.apache.wicket.extensions.wizard.WizardStep;
import org.apache.wicket.markup.html.form.CheckBox;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.form.FormComponent;
import org.apache.wicket.markup.html.form.ListMultipleChoice;
import org.apache.wicket.markup.html.form.RequiredTextField;
import org.apache.wicket.markup.html.form.TextField;
import org.apache.wicket.markup.html.form.validation.AbstractFormValidator;
import org.apache.wicket.markup.html.form.validation.EqualInputValidator;
import org.apache.wicket.model.CompoundPropertyModel;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
import org.apache.wicket.model.ResourceModel;
import org.apache.wicket.model.StringResourceModel;
import org.apache.wicket.validation.ValidationError;
import org.apache.wicket.validation.validator.EmailAddressValidator;
@link
@author
public class NewUserWizard extends Wizard
{
private final class ConfirmationStep extends StaticContentStep
{
public ConfirmationStep()
{
super(true);
IModel<User> userModel = new Model<>(user);
setTitleModel(new ResourceModel("confirmation.title"));
setSummaryModel(new StringResourceModel("confirmation.summary", this, userModel));
setContentModel(new StringResourceModel("confirmation.content", this, userModel));
}
}
private final class UserDetailsStep extends WizardStep
{
public UserDetailsStep()
{
setTitleModel(new ResourceModel("confirmation.title"));
setSummaryModel(new StringResourceModel("userdetails.summary", this, new Model<>(
user)));
add(new RequiredTextField<>("user.firstName"));
add(new RequiredTextField<>("user.lastName"));
add(new TextField<>("user.department"));
add(new CheckBox("assignRoles"));
}
}
private final class UserNameStep extends WizardStep
{
public UserNameStep()
{
super(new ResourceModel("username.title"), new ResourceModel("username.summary"));
add(new RequiredTextField<>("user.userName"));
FormComponent<String> email = new RequiredTextField<String>("user.email").add(EmailAddressValidator.getInstance());
add(email);
TextField<String> emailRepeat = new TextField<>("emailRepeat",
new Model<String>());
add(emailRepeat);
add(new EqualInputValidator(email, emailRepeat));
}
}
private final class UserRolesStep extends WizardStep implements ICondition
{
public UserRolesStep()
{
super(new ResourceModel("userroles.title"), null);
setSummaryModel(new StringResourceModel("userroles.summary", this,
new Model<>(user)));
final ListMultipleChoice<String> rolesChoiceField = new ListMultipleChoice<>(
"user.roles", allRoles);
add(rolesChoiceField);
final TextField<String> rolesSetNameField = new TextField<>("user.rolesSetName");
add(rolesSetNameField);
add(new AbstractFormValidator()
{
@Override
public FormComponent[] getDependentFormComponents()
{
return null;
}
@Override
public void validate(Form<?> form)
{
String rolesInput = rolesChoiceField.getInput();
if (rolesInput != null && !rolesInput.isEmpty())
{
final String rolesSetNameFieldInput = rolesSetNameField.getInput();
if (rolesSetNameFieldInput == null || rolesSetNameFieldInput.isEmpty())
{
rolesSetNameField.error(new ValidationError().addKey("error.noSetNameForRoles"));
}
}
}
});
}
@Override
public boolean evaluate()
{
return assignRoles;
}
}
private static final List<String> allRoles = Arrays.asList("admin", "user", "moderator",
"joker", "slacker");
private boolean assignRoles = false;
private User user;
@param
public NewUserWizard(String id)
{
super(id);
user = new User();
setDefaultModel(new CompoundPropertyModel<>(this));
WizardModel model = new WizardModel();
model.add(new UserNameStep());
model.add(new UserDetailsStep());
model.add(new UserRolesStep());
model.add(new ConfirmationStep());
init(model);
}
@Override
protected Component newButtonBar(String id)
{
return new AjaxWizardButtonBar(id, this);
}
@return
public User getUser()
{
return user;
}
@return
public boolean isAssignRoles()
{
return assignRoles;
}
@see
@Override
public void onCancel()
{
setResponsePage(Index.class);
}
@see
@Override
public void onFinish()
{
setResponsePage(Index.class);
}
@param
public void setAssignRoles(boolean assignRoles)
{
this.assignRoles = assignRoles;
}
@param
public void setUser(User user)
{
this.user = user;
}
}