/**
* Copyright 2010 OpenEngSB Division, Vienna University of Technology
*
* 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 org.openengsb.openticket.ui.web.panel;
import java.util.ArrayList;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.markup.html.form.AjaxButton;
import org.apache.wicket.authorization.strategies.role.annotations.AuthorizeInstantiation;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.form.Button;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.form.FormComponent;
import org.apache.wicket.markup.html.form.RequiredTextField;
import org.apache.wicket.markup.html.form.SimpleFormComponentLabel;
import org.apache.wicket.markup.html.form.TextField;
import org.apache.wicket.markup.html.list.ListItem;
import org.apache.wicket.markup.html.list.ListView;
import org.apache.wicket.markup.html.panel.FeedbackPanel;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.model.CompoundPropertyModel;
import org.apache.wicket.model.ResourceModel;
import org.apache.wicket.spring.injection.annot.SpringBean;
import org.apache.wicket.validation.validator.StringValidator;
import org.openengsb.core.api.workflow.TaskboxService;
import org.openengsb.core.api.workflow.WorkflowException;
import org.openengsb.core.api.workflow.model.Task;
import org.openengsb.openticket.model.DeveloperTicket;
@SuppressWarnings("serial")
@AuthorizeInstantiation("ROLE_USER")
public class DeveloperTicketPanel extends Panel {
@SpringBean(name = "taskboxService")
private TaskboxService service;
private DeveloperTicket temp;
public DeveloperTicketPanel(String id, Task task) {
super(id);
temp = new DeveloperTicket(task);
final FeedbackPanel feedback = new FeedbackPanel("feedback");
feedback.setOutputMarkupId(true);
add(feedback);
CompoundPropertyModel<DeveloperTicket> ticketModel = new CompoundPropertyModel<DeveloperTicket>(temp);
Form<DeveloperTicket> form = new Form<DeveloperTicket>("editTicket", ticketModel);
form.setOutputMarkupId(true);
add(form);
form.add(new Label("header-label-ticket", new ResourceModel("header.label.ticket")));
form.add(new Label("header-label-developerticket", new ResourceModel("header.label.developerticket")));
form = constituteReadOnlyFields(form);
form = constituteEditableFields(form);
AjaxButton saveButton = new AjaxButton("save", form) {
@Override
protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
form.remove("listContainer");
form.add(printTicketProperties());
form.setOutputMarkupId(true);
target.addComponent(form);
info(getLocalizer().getString("info.tempsaved", this));
target.addComponent(feedback);
}
@Override
protected void onError(AjaxRequestTarget target, Form<?> form) {
target.addComponent(feedback);
}
};
form.add(saveButton);
form.add(new Button("reset"));
form.add(new Label("finished-label", new ResourceModel("edit.label.finished.false")));
AjaxButton closeButton = new AjaxButton("close", form) {
@Override
protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
try {
service.finishTask(temp);
info(getLocalizer().getString("info.finished", this));
target.addComponent(feedback);
this.setEnabled(false);
this.setVisible(false);
form.remove("close");
form.add(this);
form.setEnabled(false);
Label finished_label = new Label("finished-label", new ResourceModel("edit.label.finished.true"));
form.remove("finished-label");
form.add(finished_label);
form.remove("listContainer");
form.add(printTicketProperties());
form.setOutputMarkupId(true);
target.addComponent(form);
setResponsePage(getPage().getClass());
} catch (WorkflowException e) {
e.printStackTrace();
error("Error: " + e.toString());
}
}
@Override
protected void onError(AjaxRequestTarget target, Form<?> form) {
target.addComponent(feedback);
}
};
form.add(closeButton);
form.add(printTicketProperties());
}
@SuppressWarnings("unchecked")
private WebMarkupContainer printTicketProperties() {
ArrayList<String> ticket_properties = new ArrayList<String>();
String propertyName;
for (int i = 0; i < temp.propertyCount(); i++) {
propertyName = new String(temp.propertyKeySet().toArray()[i].toString());
ticket_properties.add(propertyName + " : " + temp.getProperty(propertyName));
}
ListView lv = new ListView("propertiesList", new ArrayList<String>(ticket_properties)) {
@Override
protected void populateItem(ListItem item) {
item.add(new Label("propertiesLabel", item.getModel()));
}
};
WebMarkupContainer listContainer = new WebMarkupContainer("listContainer");
listContainer.setOutputMarkupId(true);
listContainer.add(lv);
return listContainer;
}
private Form<DeveloperTicket> constituteReadOnlyFields(Form<DeveloperTicket> form) {
FormComponent<String> fcId = new TextField<String>("taskId");
fcId.setEnabled(false);
fcId.setLabel(new ResourceModel("edit.label.id"));
form.add(fcId);
form.add(new SimpleFormComponentLabel("edit-label-id", fcId));
FormComponent<String> fcTime = new TextField<String>("taskCreationTimestamp");
fcTime.setEnabled(false);
fcTime.setLabel(new ResourceModel("edit.label.time"));
form.add(fcTime);
form.add(new SimpleFormComponentLabel("edit-label-time", fcTime));
FormComponent<String> fcName = new TextField<String>("name");
fcName.setEnabled(false);
fcName.setLabel(new ResourceModel("edit.label.name"));
form.add(fcName);
form.add(new SimpleFormComponentLabel("edit-label-name", fcName));
FormComponent<String> fcDesc = new TextField<String>("description");
fcDesc.setEnabled(false);
fcDesc.setLabel(new ResourceModel("edit.label.desc"));
form.add(fcDesc);
form.add(new SimpleFormComponentLabel("edit-label-desc", fcDesc));
FormComponent<String> fcType = new TextField<String>("taskType");
fcType.setEnabled(false);
fcType.setLabel(new ResourceModel("edit.label.type"));
form.add(fcType);
form.add(new SimpleFormComponentLabel("edit-label-type", fcType));
FormComponent<String> fcPriority = new TextField<String>("priority");
fcPriority.setEnabled(false);
fcPriority.setLabel(new ResourceModel("edit.label.priority"));
form.add(fcPriority);
form.add(new SimpleFormComponentLabel("edit-label-priority", fcPriority));
FormComponent<String> fcCust = new TextField<String>("customer");
fcCust.setEnabled(false);
fcCust.setLabel(new ResourceModel("edit.label.customer"));
form.add(fcCust);
form.add(new SimpleFormComponentLabel("edit-label-customer", fcCust));
FormComponent<String> fcEmail = new TextField<String>("contactEmailAddress");
fcEmail.setEnabled(false);
fcEmail.setLabel(new ResourceModel("edit.label.email"));
form.add(fcEmail);
form.add(new SimpleFormComponentLabel("edit-label-email", fcEmail));
return form;
}
private Form<DeveloperTicket> constituteEditableFields(Form<DeveloperTicket> form) {
FormComponent<Integer> fcH = new RequiredTextField<Integer>("workingHours", Integer.class);
fcH.setType(Integer.class);
fcH.setRequired(true);
fcH.setLabel(new ResourceModel("edit.label.h"));
form.add(fcH);
form.add(new SimpleFormComponentLabel("edit-label-h", fcH));
FormComponent<String> fcDC = new RequiredTextField<String>("developerComment");
fcDC.add(StringValidator.maximumLength(100));
fcDC.setRequired(true);
fcDC.setLabel(new ResourceModel("edit.label.dc"));
form.add(fcDC);
form.add(new SimpleFormComponentLabel("edit-label-dc", fcDC));
FormComponent<String> fcPO = new TextField<String>("problemsOccurred");
fcPO.add(StringValidator.maximumLength(100));
fcPO.setLabel(new ResourceModel("edit.label.po"));
form.add(fcPO);
form.add(new SimpleFormComponentLabel("edit-label-po", fcPO));
return form;
}
}