/////////////////////////////////////////////////////////////////////////////
//
// Project ProjectForge Community Edition
// www.projectforge.org
//
// Copyright (C) 2001-2014 Kai Reinhard (k.reinhard@micromata.de)
//
// ProjectForge is dual-licensed.
//
// This community edition is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License as published
// by the Free Software Foundation; version 3 of the License.
//
// This community edition is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
// Public License for more details.
//
// You should have received a copy of the GNU General Public License along
// with this program; if not, see http://www.gnu.org/licenses/.
//
/////////////////////////////////////////////////////////////////////////////
package org.projectforge.web.meb;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.markup.html.form.AjaxButton;
import org.apache.wicket.markup.html.form.Button;
import org.apache.wicket.markup.html.form.DropDownChoice;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.model.Model;
import org.apache.wicket.model.PropertyModel;
import org.apache.wicket.spring.injection.annot.SpringBean;
import org.hibernate.Hibernate;
import org.projectforge.core.ConfigXml;
import org.projectforge.jira.JiraConfig;
import org.projectforge.jira.JiraIssueType;
import org.projectforge.jira.JiraProject;
import org.projectforge.meb.MebEntryDO;
import org.projectforge.meb.MebEntryStatus;
import org.projectforge.orga.PostType;
import org.projectforge.user.PFUserDO;
import org.projectforge.user.UserGroupCache;
import org.projectforge.user.UserPrefArea;
import org.projectforge.web.URLHelper;
import org.projectforge.web.calendar.DateTimeFormatter;
import org.projectforge.web.user.UserSelectPanel;
import org.projectforge.web.wicket.AbstractEditForm;
import org.projectforge.web.wicket.WicketUtils;
import org.projectforge.web.wicket.components.FavoritesChoicePanel;
import org.projectforge.web.wicket.components.LabelValueChoiceRenderer;
import org.projectforge.web.wicket.components.MaxLengthTextArea;
import org.projectforge.web.wicket.components.SingleButtonPanel;
import org.projectforge.web.wicket.flowlayout.DivTextPanel;
import org.projectforge.web.wicket.flowlayout.FieldsetPanel;
import org.projectforge.web.wicket.flowlayout.TextAreaPanel;
public class MebEditForm extends AbstractEditForm<MebEntryDO, MebEditPage>
{
private static final long serialVersionUID = -1447905028243511191L;
private static final org.apache.log4j.Logger log = org.apache.log4j.Logger.getLogger(MebEditForm.class);
private static final String USER_PREF_KEY_JIRA_PROJECT = "meb.edit.recentJiraProject";
private static final String USER_PREF_KEY_JIRA_ISSUE_TYPE = "meb.edit.recentJiraIssueType";
@SpringBean(name = "userGroupCache")
private UserGroupCache userGroupCache;
private Integer jiraIssueType;
private FavoritesChoicePanel<JiraProject, JiraProject> jiraProjectChoice;
private final JiraConfig jiraConfig = ConfigXml.getInstance().getJiraConfig();
public MebEditForm(final MebEditPage parentPage, final MebEntryDO data)
{
super(parentPage, data);
}
@SuppressWarnings("serial")
@Override
protected void init()
{
super.init();
gridBuilder.newGridPanel();
{
// Date
final FieldsetPanel fs = gridBuilder.newFieldset(getString("date")).suppressLabelForWarning();
fs.add(new DivTextPanel(fs.newChildId(), DateTimeFormatter.instance().getFormattedDateTime(data.getDate())));
}
{
// Owner
final FieldsetPanel fs = gridBuilder.newFieldset(getString("meb.owner"));
PFUserDO owner = data.getOwner();
if (Hibernate.isInitialized(owner) == false) {
owner = userGroupCache.getUser(owner.getId());
data.setOwner(owner);
}
final UserSelectPanel userSelectPanel = new UserSelectPanel(fs.newChildId(), new PropertyModel<PFUserDO>(data, "owner"), parentPage,
"ownerId");
userSelectPanel.setRequired(true);
fs.add(userSelectPanel);
userSelectPanel.init();
}
{
// Owner
final FieldsetPanel fs = gridBuilder.newFieldset(getString("meb.sender")).suppressLabelForWarning();
fs.add(new DivTextPanel(fs.newChildId(), data.getSender()));
}
{
// DropDownChoice status
final FieldsetPanel fs = gridBuilder.newFieldset(getString("status"));
final LabelValueChoiceRenderer<PostType> statusChoiceRenderer = new LabelValueChoiceRenderer<PostType>(this, MebEntryStatus.values());
final DropDownChoice<PostType> statusChoice = new DropDownChoice<PostType>(fs.getDropDownChoiceId(), new PropertyModel<PostType>(
data, "status"), statusChoiceRenderer.getValues(), statusChoiceRenderer);
statusChoice.setNullValid(false);
statusChoice.setRequired(true);
fs.add(statusChoice);
}
{
// Message
final FieldsetPanel fs = gridBuilder.newFieldset(getString("meb.message"));
fs.add(new MaxLengthTextArea(TextAreaPanel.WICKET_ID, new PropertyModel<String>(data, "message")));
}
{
// Actions
final FieldsetPanel fs = gridBuilder.newFieldset(getString("meb.actions")).suppressLabelForWarning();
fs.add(new SingleButtonPanel(fs.newChildId(), new Button(SingleButtonPanel.WICKET_ID, new Model<String>("createTimesheet")) {
@Override
public final void onSubmit()
{
parentPage.createTimesheet();
}
}, getString("timesheet.title.add"), SingleButtonPanel.NORMAL));
// DropDownChoice favorites
jiraProjectChoice = new FavoritesChoicePanel<JiraProject, JiraProject>(fs.newChildId(), UserPrefArea.JIRA_PROJECT) {
@Override
protected void select(final JiraProject favorite)
{
if (StringUtils.isNotEmpty(this.selected) == true) {
parentPage.putUserPrefEntry(USER_PREF_KEY_JIRA_PROJECT, this.selected, true);
}
}
@Override
protected JiraProject getCurrentObject()
{
return null;
}
@Override
protected JiraProject newFavoriteInstance(final JiraProject currentObject)
{
return new JiraProject();
}
};
jiraProjectChoice.setClearSelectionAfterSelection(false).setNullKey("jira.chooseProject");
fs.add(jiraProjectChoice);
final DropDownChoice<String> choice = jiraProjectChoice.init();
choice.setNullValid(false);
List<JiraIssueType> issueTypes;
if (jiraConfig != null && jiraConfig.getIssueTypes() != null) {
issueTypes = jiraConfig.getIssueTypes();
} else {
issueTypes = new ArrayList<JiraIssueType>();
}
// DropDownChoice issueType
final LabelValueChoiceRenderer<JiraIssueType> typeChoiceRenderer = new LabelValueChoiceRenderer<JiraIssueType>(issueTypes);
@SuppressWarnings({ "rawtypes", "unchecked"})
final DropDownChoice typeChoice = new DropDownChoice(fs.getDropDownChoiceId(), new PropertyModel(this, "jiraIssueType"),
typeChoiceRenderer.getValues(), typeChoiceRenderer) {
@Override
protected boolean wantOnSelectionChangedNotifications()
{
return true;
}
@Override
protected void onSelectionChanged(final Object newSelection)
{
if (newSelection != null && newSelection instanceof Integer) {
parentPage.putUserPrefEntry(USER_PREF_KEY_JIRA_ISSUE_TYPE, newSelection, true);
// refresh();
}
}
};
final Integer recentJiraIssueType = (Integer) parentPage.getUserPrefEntry(Integer.class, USER_PREF_KEY_JIRA_ISSUE_TYPE);
if (recentJiraIssueType != null) {
this.jiraIssueType = recentJiraIssueType;
}
typeChoice.setNullValid(false);
fs.add(typeChoice);
final AjaxButton createJiraIssueButton = new AjaxButton(SingleButtonPanel.WICKET_ID, new Model<String>("createJIRAIssue")) {
@Override
public void onSubmit(final AjaxRequestTarget target, final Form< ? > form)
{
// ...create result page, get the url path to it...
target.appendJavaScript("window.open('" + buildCreateJiraIssueUrl() + "','newWindow');");
}
/**
* @see org.apache.wicket.ajax.markup.html.form.AjaxButton#onError(org.apache.wicket.ajax.AjaxRequestTarget,
* org.apache.wicket.markup.html.form.Form)
*/
@Override
protected void onError(final AjaxRequestTarget target, final Form< ? > form)
{
}
};
WicketUtils.addTooltip(createJiraIssueButton, getString("tooltip.popups.mustBeAllowed"));
fs.add(new SingleButtonPanel(fs.newChildId(), createJiraIssueButton, getString("meb.actions.createJIRAIssue"), SingleButtonPanel.NORMAL));
if (jiraConfig == null || StringUtils.isEmpty(jiraConfig.getCreateIssueUrl()) == true) {
jiraProjectChoice.setVisible(false);
typeChoice.setVisible(false);
// jiraCreateIssueLink.setVisible(false);
createJiraIssueButton.setVisible(false);
} else {
final String recentJiraProjectFavorite = (String) parentPage.getUserPrefEntry(String.class, USER_PREF_KEY_JIRA_PROJECT);
if (recentJiraProjectFavorite != null) {
jiraProjectChoice.setSelected(recentJiraProjectFavorite);
}
}
}
}
private String buildCreateJiraIssueUrl()
{
if (jiraConfig == null || jiraConfig.getCreateIssueUrl() == null) {
return "JIRA not configured.";
}
final JiraProject jiraProject = jiraProjectChoice.getCurrentFavorite();
return jiraConfig.getCreateIssueUrl()
+ "?pid="
+ (jiraProject != null ? jiraProject.getPid() : null)
+ "&issuetype="
+ (jiraIssueType != null ? jiraIssueType : 3)
+ "&priority=4&reporter="
+ URLHelper.encode(getUser().getJiraUsernameOrUsername())
+ "&description="
+ URLHelper.encode(getData().getMessage());
}
public Integer getJiraIssueType()
{
return jiraIssueType;
}
public void setJiraIssueType(final Integer jiraIssueType)
{
this.jiraIssueType = jiraIssueType;
}
@Override
protected Logger getLogger()
{
return log;
}
}