/* * 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.Item; import info.jtrac.domain.ItemSearch; import info.jtrac.domain.ItemUser; import info.jtrac.domain.Space; import info.jtrac.domain.State; import info.jtrac.domain.User; import info.jtrac.domain.UserSpaceRole; import info.jtrac.util.UserUtils; import java.util.List; import org.apache.wicket.PageParameters; 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.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.ListMultipleChoice; import org.apache.wicket.markup.html.form.TextArea; import org.apache.wicket.markup.html.form.TextField; import org.apache.wicket.markup.html.form.upload.FileUpload; import org.apache.wicket.markup.html.form.upload.FileUploadField; 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.model.LoadableDetachableModel; import org.apache.wicket.util.lang.Bytes; /** * Create / Edit item form page */ public class ItemFormPage extends BasePage { /** * Default constructor */ public ItemFormPage() { Item item = new Item(); item.setSpace(getCurrentSpace()); item.setStatus(State.NEW); add(new ItemForm("form", item)); } /** * Constructor with provided item id. * * @param itemId The */ public ItemFormPage(long itemId) { Item item = getJtrac().loadItem(itemId); add(new ItemForm("form", item)); } /** * Wicket form */ private class ItemForm extends Form { private JtracFeedbackMessageFilter filter; private FileUploadField fileUploadField = new FileUploadField("file"); private boolean editMode; private int version; /** * Constructor * * @param id * @param item */ public ItemForm(String id, final Item item) { super(id); setMultiPart(true); FeedbackPanel feedback = new FeedbackPanel("feedback"); filter = new JtracFeedbackMessageFilter(); feedback.setFilter(filter); add(feedback); version = item.getVersion(); if (item.getId() > 0) { editMode = true; } BoundCompoundPropertyModel model = null; if (editMode) { /* * This ensures that the model object is re-loaded as part * of the form submission workflow before form binding and * avoids hibernate lazy loading issues during the whole * update transaction. */ LoadableDetachableModel itemModel = new LoadableDetachableModel() { protected Object load() { logger.debug("attaching existing item " + item.getId()); return getJtrac().loadItem(item.getId()); } }; model = new BoundCompoundPropertyModel(itemModel); } else { model = new BoundCompoundPropertyModel(item); } setModel(model); /* * =================================================== * Summary * =================================================== */ final TextField summaryField = new TextField("summary"); summaryField.setRequired(true); summaryField.add(new ErrorHighlighter()); summaryField.setOutputMarkupId(true); add(summaryField); add(new HeaderContributor(new IHeaderContributor() { public void renderHead(IHeaderResponse response) { response.renderOnLoadJavascript("document.getElementById('" + summaryField.getMarkupId() + "').focus()"); } })); /* * =================================================== * Delete button * =================================================== */ Button delete = new Button("delete") { @Override public void onSubmit() { String heading = localize("item_delete.confirm"); String warning = localize("item_delete.line2"); String line1 = localize("item_delete.line1"); ConfirmPage confirm = new ConfirmPage(ItemFormPage.this, heading, warning, new String[] { line1 }) { public void onConfirm() { // avoid lazy init problem getJtrac().removeItem(getJtrac().loadItem(item.getId())); ItemSearch itemSearch = JtracSession.get().getItemSearch(); if (itemSearch != null) { setResponsePage(new ItemListPage(itemSearch)); } else { setResponsePage(DashboardPage.class); } } }; setResponsePage(confirm); } }; delete.setDefaultFormProcessing(false); add(delete); if (!editMode) { delete.setVisible(false); } /* * =================================================== * Detail * =================================================== */ add(new TextArea("detail").setRequired(true).add(new ErrorHighlighter())); /* * =================================================== * Custom fields * =================================================== */ if (editMode) { add(new CustomFieldsFormPanel("fields", model, item.getSpace()).setRenderBodyOnly(true)); } else { add(new CustomFieldsFormPanel("fields", model, item, getPrincipal()).setRenderBodyOnly(true)); } /* * Hide some components if editing item */ WebMarkupContainer hideAssignedTo = new WebMarkupContainer("hideAssignedTo"); WebMarkupContainer hideNotifyList = new WebMarkupContainer("hideNotifyList"); WebMarkupContainer hideEditReason = new WebMarkupContainer("hideEditReason"); add(hideAssignedTo); add(hideNotifyList); add(hideEditReason); if (editMode) { hideAssignedTo.setVisible(false); hideNotifyList.setVisible(false); hideEditReason.add(new TextArea("editReason").setRequired(true).add(new ErrorHighlighter())); } else { hideEditReason.setVisible(false); /* * =================================================== * Assigned to * =================================================== */ Space space = item.getSpace(); List<UserSpaceRole> userSpaceRoles = getJtrac().findUserRolesForSpace(space.getId()); List<User> assignable = UserUtils.filterUsersAbleToTransitionFrom(userSpaceRoles, space, State.OPEN); DropDownChoice choice = new DropDownChoice("assignedTo", assignable, new IChoiceRenderer() { public Object getDisplayValue(Object o) { return ((User) o).getName(); } public String getIdValue(Object o, int i) { return ((User) o).getId() + ""; } }); choice.setNullValid(true); choice.setRequired(true); WebMarkupContainer border = new WebMarkupContainer("border"); border.add(choice); border.add(new ErrorHighlighter(choice)); hideAssignedTo.add(border); /* * =================================================== * Notify list * =================================================== */ List<ItemUser> choices = UserUtils.convertToItemUserList(userSpaceRoles); ListMultipleChoice itemUsers = new JtracCheckBoxMultipleChoice("itemUsers", choices, new IChoiceRenderer() { public Object getDisplayValue(Object o) { return ((ItemUser) o).getUser().getName(); } public String getIdValue(Object o, int i) { return ((ItemUser) o).getUser().getId() + ""; } }, true); hideNotifyList.add(itemUsers); /* * =================================================== * Attachment * =================================================== */ hideNotifyList.add(fileUploadField); setMaxSize(Bytes.megabytes(getJtrac().getAttachmentMaxSizeInMb())); } /* * =================================================== * Send notifications * =================================================== */ add(new CheckBox("sendNotifications")); /* * =================================================== * Cancel * =================================================== */ add(new Link("cancel") { public void onClick() { setResponsePage(ItemViewPage.class, new PageParameters("0=" + item.getRefId())); } }.setVisible(editMode && JtracSession.get().getItemSearch() != null)); } /* (non-Javadoc) * @see org.apache.wicket.markup.html.form.Form#validate() */ @Override protected void validate() { filter.reset(); Item item = (Item) getModelObject(); if (editMode && item.getVersion() != version) { /* * User must have used back button after edit */ error(localize("item_form.error.version")); } super.validate(); } /* (non-Javadoc) * @see org.apache.wicket.markup.html.form.Form#onSubmit() */ @Override protected void onSubmit() { final FileUpload fileUpload = fileUploadField.getFileUpload(); Item item = (Item) getModelObject(); User user = getPrincipal(); if (editMode) { getJtrac().updateItem(item, user); } else { item.setLoggedBy(user); item.setStatus(State.OPEN); getJtrac().storeItem(item, fileUpload); } /* * On creating an item, clear any search filter (especially * the related item) from session. */ JtracSession.get().setItemSearch(null); setResponsePage(ItemViewPage.class, new PageParameters("0=" + item.getRefId())); } } // end inner class ItemForm }