package org.appfuse.webapp.pages;
import org.apache.wicket.Page;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.model.CompoundPropertyModel;
import org.apache.wicket.model.IModel;
import org.apache.wicket.spring.injection.annot.SpringBean;
import org.appfuse.model.User;
import org.appfuse.service.RoleManager;
import org.appfuse.service.UserManager;
import org.appfuse.webapp.pages.components.UserEditPanel;
/**
* Abstract page for editing users.
*
* Reusable UserEditPanel allows to simple adjust for user signup and editing: current user, existing user, new user.
*
* @author Marcin ZajÄ…czkowski, 2011-03-19
*/
public abstract class AbstractUserEdit extends AbstractWebPage {
protected static Page NO_RESPONSE_PAGE = null;
@SpringBean(name = "userManager")
private UserManager userManager;
@SpringBean(name = "roleManager")
private RoleManager roleManager;
private final Page responsePage;
private final String propertyPrefix;
private final IModel<User> userModel;
private Form<User> userEditForm;
protected AbstractUserEdit(Page responsePage, String propertyPrefix, IModel<User> userModel) {
super();
this.responsePage = responsePage;
this.propertyPrefix = propertyPrefix;
this.userModel = userModel;
}
@Override
protected void onInitialize() {
super.onInitialize();
add(createPageTitleTag(propertyPrefix + ".title"));
add(createPageHeading(propertyPrefix + ".heading"));
add(createPageMessage(propertyPrefix + ".message"));
add(createFeedbackPanel());
CompoundPropertyModel<User> userCompoundPropertyModel = new CompoundPropertyModel<User>(userModel);
userEditForm = new Form<User>("userEditForm", userCompoundPropertyModel);
add(userEditForm);
//TODO: MZA: Extract concrete class and pass interface to avoid Foo.this.on... duplication
UserEditPanel userEditPanel = new UserEditPanel("userEditPanel", userCompoundPropertyModel,
roleManager.getAll()) {
@Override
protected void onSaveButtonSubmit() {
log.info("onSaveButtonSubmit");
AbstractUserEdit.this.onSaveButtonSubmit();
}
@Override
protected void onDeleteButtonSubmit() {
log.info("onDeleteButtonSubmit");
AbstractUserEdit.this.onDeleteButtonSubmit();
}
@Override
protected void onCancelButtonSubmit() {
log.info("onCancelButtonSubmit");
AbstractUserEdit.this.onCancelButtonSubmit();
}
@Override
protected boolean getAccountSettingsGroupVisibility() {
return AbstractUserEdit.this.getAccountSettingsGroupVisibility();
}
@Override
protected boolean getDisplayRolesGroupVisibility() {
return AbstractUserEdit.this.getDisplayRolesGroupVisibility();
}
@Override
protected boolean getDeleteButtonVisibility() {
return AbstractUserEdit.this.getDeleteButtonVisibility();
}
@Override
protected boolean isCollapsedAddressTab() {
return AbstractUserEdit.this.isCollapsedAddressTab();
}
};
userEditForm.add(userEditPanel);
}
protected void resolveAndSetResponsePage() {
if (responsePage == null) {
setResponsePage(getApplication().getHomePage());
} else {
setResponsePage(responsePage);
}
}
protected UserManager getUserManager() {
return userManager;
}
protected RoleManager getRoleManager() {
return roleManager;
}
protected Form<User> getUserEditForm() {
return userEditForm;
}
protected User getUser() {
return userModel.getObject();
}
//required by CurrentUserEdit which cannot lookup current user in a constructor
protected void setUser(User user) {
userModel.setObject(user);
}
protected abstract void onSaveButtonSubmit();
protected abstract void onDeleteButtonSubmit();
/**
* A handler for a click on a cancel button.
*
* Return to a requested response page is usually a good action. Can be overridden if needed.
*/
protected void onCancelButtonSubmit() {
resolveAndSetResponsePage();
}
protected abstract boolean getDisplayRolesGroupVisibility();
protected abstract boolean getAccountSettingsGroupVisibility();
protected abstract boolean getDeleteButtonVisibility();
protected boolean isCollapsedAddressTab() {
return true;
}
}