/*
* Copyright 2002-2005 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package info.jtrac.wicket;
import info.jtrac.domain.Space;
import info.jtrac.util.ValidationUtils;
import java.util.List;
import org.apache.wicket.behavior.HeaderContributor;
import org.apache.wicket.markup.html.IHeaderContributor;
import org.apache.wicket.markup.html.IHeaderResponse;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.WebPage;
import org.apache.wicket.markup.html.form.Button;
import org.apache.wicket.markup.html.form.CheckBox;
import org.apache.wicket.markup.html.form.DropDownChoice;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.form.IChoiceRenderer;
import org.apache.wicket.markup.html.form.TextArea;
import org.apache.wicket.markup.html.form.TextField;
import org.apache.wicket.markup.html.link.Link;
import org.apache.wicket.markup.html.panel.FeedbackPanel;
import org.apache.wicket.model.BoundCompoundPropertyModel;
import org.apache.wicket.validation.IValidatable;
import org.apache.wicket.validation.validator.AbstractValidator;
/**
* space edit form
*/
public class SpaceFormPage extends BasePage {
private WebPage previous;
public void setPrevious(WebPage previous) {
this.previous = previous;
}
public SpaceFormPage() {
Space space = new Space();
space.getMetadata().initRoles();
add(new SpaceForm("form", space));
}
public SpaceFormPage(Space space) {
add(new SpaceForm("form", space));
}
/**
* wicket form
*/
private class SpaceForm extends Form {
private Space space;
private Space copyFrom;
private JtracFeedbackMessageFilter filter;
public Space getSpace() {
return space;
}
public void setSpace(Space space) {
this.space = space;
}
public Space getCopyFrom() {
return copyFrom;
}
public void setCopyFrom(Space copyFrom) {
this.copyFrom = copyFrom;
}
public SpaceForm(String id, final Space space) {
super(id);
FeedbackPanel feedback = new FeedbackPanel("feedback");
filter = new JtracFeedbackMessageFilter();
feedback.setFilter(filter);
add(feedback);
this.space = space;
final BoundCompoundPropertyModel model = new BoundCompoundPropertyModel(this);
setModel(model);
// delete button only if edit ======================================
Button delete = new Button("delete") {
@Override
public void onSubmit() {
String heading = localize("space_delete.confirm");
String warning = localize("space_delete.line3");
String line1 = localize("space_delete.line1");
String line2 = localize("space_delete.line2");
ConfirmPage confirm = new ConfirmPage(SpaceFormPage.this, heading, warning, new String[] {line1, line2}) {
public void onConfirm() {
getJtrac().removeSpace(space);
// logged in user may have been allocated to this space
JtracSession.get().refreshPrincipal();
setResponsePage(new SpaceListPage());
}
};
setResponsePage(confirm);
}
};
delete.setDefaultFormProcessing(false);
if(space.getId() <= 0) {
delete.setVisible(false);
}
add(delete);
// display name ====================================================
final TextField name = new TextField("space.name");
name.setRequired(true);
name.add(new ErrorHighlighter());
name.setOutputMarkupId(true);
add(name);
add(new HeaderContributor(new IHeaderContributor() {
public void renderHead(IHeaderResponse response) {
response.renderOnLoadJavascript("document.getElementById('" + name.getMarkupId() + "').focus()");
}
}));
// prefix Code =====================================================
TextField prefixCode = new TextField("space.prefixCode");
prefixCode.setRequired(true);
prefixCode.add(new ErrorHighlighter());
// validation: greater than 3 chars?
prefixCode.add(new AbstractValidator() {
protected void onValidate(IValidatable v) {
String s = (String) v.getValue();
if(s.length() < 3) {
error(v);
}
}
@Override
protected String resourceKey() {
return "space_form.error.prefixCode.tooShort";
}
});
prefixCode.add(new AbstractValidator() {
protected void onValidate(IValidatable v) {
String s = (String) v.getValue();
if(s.length() > 10) {
error(v);
}
}
@Override
protected String resourceKey() {
return "space_form.error.prefixCode.tooLong";
}
});
// validation: format ok?
prefixCode.add(new AbstractValidator() {
protected void onValidate(IValidatable v) {
String s = (String) v.getValue();
if(!ValidationUtils.isValidSpaceKey(s)) {
error(v);
}
}
@Override
protected String resourceKey() {
return "space_form.error.prefixCode.invalid";
}
});
// validation: does space already exist with same prefixCode ?
prefixCode.add(new AbstractValidator() {
protected void onValidate(IValidatable v) {
String s = (String) v.getValue();
Space temp = getJtrac().loadSpace(s);
if(temp != null && temp.getId() != space.getId()) {
error(v);
}
}
@Override
protected String resourceKey() {
return "space_form.error.prefixCode.exists";
}
});
add(prefixCode);
// description =====================================================
add(new TextArea("space.description"));
// guest allowed ===================================================
add(new CheckBox("space.guestAllowed"));
// hide copy from option if edit ===================================
WebMarkupContainer hide = new WebMarkupContainer("hide");
if(space.getId() > 0) {
hide.setVisible(false);
} else {
List<Space> spaces = getJtrac().findAllSpaces();
DropDownChoice choice = new DropDownChoice("copyFrom", spaces, new IChoiceRenderer() {
public Object getDisplayValue(Object o) {
return ((Space) o).getName();
}
public String getIdValue(Object o, int i) {
return ((Space) o).getId() + "";
}
});
choice.setNullValid(true);
hide.add(choice);
}
add(hide);
// cancel link =====================================================
add(new Link("cancel") {
public void onClick() {
if(previous == null) {
setResponsePage(new OptionsPage());
} else {
if (previous instanceof SpaceListPage) {
((SpaceListPage) previous).setSelectedSpaceId(space.getId());
}
setResponsePage(previous);
}
}
});
}
@Override
protected void validate() {
filter.reset();
super.validate();
}
@Override
protected void onSubmit() {
if(copyFrom != null) {
Space temp = getJtrac().loadSpace(copyFrom.getId());
space.getMetadata().setXmlString(temp.getMetadata().getXmlString());
}
setResponsePage(new SpaceFieldListPage(space, null, previous));
}
}
}