/*
* HeadsUp Agile
* Copyright 2009-2014 Heads Up Development Ltd.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.headsupdev.agile.app.milestones;
import org.apache.wicket.PageParameters;
import org.apache.wicket.ResourceReference;
import org.apache.wicket.markup.html.CSSPackageResource;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.image.Image;
import org.apache.wicket.markup.html.link.ResourceLink;
import org.apache.wicket.markup.html.list.ListItem;
import org.apache.wicket.markup.html.list.ListView;
import org.apache.wicket.util.value.ValueMap;
import org.headsupdev.agile.api.MenuLink;
import org.headsupdev.agile.api.Permission;
import org.headsupdev.agile.storage.dao.MilestoneGroupsDAO;
import org.headsupdev.agile.app.milestones.entityproviders.MilestoneProvider;
import org.headsupdev.agile.app.milestones.permission.MilestoneViewPermission;
import org.headsupdev.agile.storage.Comment;
import org.headsupdev.agile.storage.StoredProject;
import org.headsupdev.agile.storage.issues.Milestone;
import org.headsupdev.agile.storage.issues.MilestoneGroup;
import org.headsupdev.agile.web.*;
import org.headsupdev.agile.web.components.FormattedDateModel;
import org.headsupdev.agile.web.components.MarkedUpTextModel;
import org.headsupdev.agile.web.components.milestones.MilestoneListPanel;
import org.headsupdev.agile.web.wicket.SortableEntityProvider;
import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.Restrictions;
import java.util.*;
/**
* Milestone Group view page
*
* @author Andrew Williams
* @version $Id$
* @since 2.0
*/
@MountPoint("viewgroup")
public class ViewMilestoneGroup
extends HeadsUpPage
{
private MilestoneGroupsDAO dao = new MilestoneGroupsDAO();
private MilestoneGroup group;
private HeadsUpPage page;
private MilestoneFilterPanel filter;
public Permission getRequiredPermission()
{
return new MilestoneViewPermission();
}
public void layout()
{
super.layout();
page = this;
add( CSSPackageResource.getHeaderContribution( getClass(), "milestone.css" ) );
String name = getPageParameters().getString( "id" );
group = dao.find(name, getProject());
if ( group == null )
{
notFoundError();
return;
}
addLinks( getLinks( group ) );
addDetails();
List<Comment> commentList = new LinkedList<Comment>();
commentList.addAll( group.getComments() );
Collections.sort( commentList, new Comparator<Comment>()
{
public int compare( Comment comment1, Comment comment2 )
{
return comment1.getCreated().compareTo( comment2.getCreated() );
}
} );
add( new ListView<Comment>( "comments", commentList )
{
protected void populateItem( ListItem<Comment> listItem )
{
Comment comment = listItem.getModelObject();
listItem.add( new Image( "icon", new ResourceReference( HeadsUpPage.class, "images/comment.png" ) ) );
listItem.add( new Label( "username", comment.getUser().getFullnameOrUsername() ) );
listItem.add( new Label( "created", new FormattedDateModel( comment.getCreated(),
( (HeadsUpSession) getSession() ).getTimeZone() ) ) );
listItem.add( new Label( "comment", new MarkedUpTextModel( comment.getComment(), getProject() ) )
.setEscapeModelStrings( false ) );
}
} );
filter = new MilestoneFilterPanel( "filter", getFilterButton(), getSession().getUser() )
{
@Override
public Criterion getCompletedCriterion()
{
Criterion c = super.getCompletedCriterion();
if ( c == null )
{
c = Restrictions.eq( "group", group );
}
else
{
c = Restrictions.and( c, Restrictions.eq( "group", group ) );
}
return c;
}
@Override
public void invalidDatePeriod()
{
warn( "Invalid date period" );
}
};
if ( group.isCompleted() )
{
filter.setFilters(0, false, true);
}
else
{
filter.setFilters(0, true, false);
}
add( filter );
boolean hideProject = true;
final SortableEntityProvider<Milestone> provider;
if ( getProject().equals( StoredProject.getDefault() ) )
{
provider = new MilestoneProvider( filter );
hideProject = false;
}
else
{
provider = new MilestoneProvider( getProject(), filter );
}
add( new MilestoneListPanel( "milestonelist", provider, this, hideProject, group ) );
boolean timeEnabled = Boolean.parseBoolean( group.getProject().getConfigurationValue(
StoredProject.CONFIGURATION_TIMETRACKING_ENABLED ) ) && group.hasValidTimePeriod();
add( new Image( "graph", new ResourceReference( "groupburndown.png" ), getPageParameters() ).setVisible( timeEnabled ) );
add( new WorkRemainingTable( "table", group ).setVisible( timeEnabled ) );
ValueMap params = new ValueMap();
params.put( "project", getProject().getId() );
params.put( "groupId", group.getName() );
params.put( "silent", true );
add( new ResourceLink( "exportgroup", new ResourceReference( "export-worked.csv" ), params ).setVisible( timeEnabled ) );
}
public MilestoneGroup getMilestoneGroup()
{
return group;
}
@Override
public String getPageTitle()
{
return "Milestonegroup:" + group.getName() + PAGE_TITLE_SEPARATOR + super.getPageTitle();
}
protected void addDetails()
{
add( new MilestoneGroupPanel( "group", group ) );
}
public static List<MenuLink> getLinks( MilestoneGroup group )
{
List<MenuLink> links = new LinkedList<MenuLink>();
PageParameters addMilestoneParams = new PageParameters();
addMilestoneParams.add( "project", group.getProject().getId() );
addMilestoneParams.add( "group", group.getName() );
PageParameters pageParams = new PageParameters();
pageParams.add( "project", group.getProject().getId() );
pageParams.add( "id", group.getName() );
links.add( new BookmarkableMenuLink( RenderUtil.getPageClass( "milestones/create" ), addMilestoneParams, "add milestone" ) );
links.add( new BookmarkableMenuLink( RenderUtil.getPageClass( "milestones/editgroup" ), pageParams, "edit" ) );
if ( group.getCompletedDate() == null )
{
// links.add( new BookmarkableMenuLink( RenderUtil.getPageClass( "milestones/commentgroup" ), pageParams, "comment" ) );
}
return links;
}
@Override
public boolean hasFilter()
{
return true;
}
}