/*
* 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.admin;
import org.apache.wicket.markup.html.CSSPackageResource;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.form.*;
import org.apache.wicket.markup.html.list.ListItem;
import org.apache.wicket.markup.html.list.ListView;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.model.Model;
import org.apache.wicket.model.PropertyModel;
import org.headsupdev.agile.api.*;
import org.headsupdev.agile.security.permission.AdminPermission;
import org.headsupdev.agile.storage.*;
import org.headsupdev.agile.web.HeadsUpPage;
import org.headsupdev.agile.web.MountPoint;
import org.headsupdev.agile.web.components.OnePressSubmitButton;
import org.hibernate.Session;
import java.util.*;
/**
* The HeadsUp about page.
*
* @author Andrew Williams
* @version $Id$
* @since 1.0
*/
@MountPoint( "membership" )
public class Membership
extends HeadsUpPage
{
public Permission getRequiredPermission()
{
return new AdminPermission();
}
public void layout()
{
super.layout();
add( CSSPackageResource.getHeaderContribution( getClass(), "admin.css" ));
add( new ProjectPermissionsForm( "projects" ) );
}
@Override
public String getTitle()
{
return "Manage Project Membership";
}
class ProjectPermissionsForm
extends Form
{
private List<Project> projects;
private List<User> users;
private User currentUser;
public ProjectPermissionsForm( String id )
{
super( id );
projects = new LinkedList<Project>( getStorage().getProjects() );
projects.add( StoredProject.getDefault() );
users = getSecurityManager().getRealUsers();
Iterator<User> userIter = users.iterator();
while ( userIter.hasNext() )
{
User user = userIter.next();
if ( !user.getRoles().contains( new MemberRole() ) )
{
userIter.remove();
}
}
if ( users.size() > 0 )
{
currentUser = users.get( 0 );
}
add( new DropDownChoice<User>( "user", new PropertyModel<User>( this, "currentUser" ), users, new IChoiceRenderer<User>()
{
public Object getDisplayValue( User user )
{
return user.getFullnameOrUsername();
}
public String getIdValue( User user, int i )
{
return user.getUsername();
}
} )
{
@Override
protected boolean wantOnSelectionChangedNotifications()
{
return true;
}
} );
add( new ProjectPermissionsListView( "projectlist", projects ) );
add( new OnePressSubmitButton( "membershipSubmit" ) );
}
protected void onSubmit()
{
Session session = HibernateUtil.getCurrentSession();
Set<User> defaultProjectMembers = new HashSet<User>();
for ( User user : users )
{
user = (User) session.merge( user );
// copy the project settings into the user object where it is stored
// this is needed to keep the table the right way up...
user.getProjects().clear();
for ( Project project : projects )
{
submitProject( project, user, defaultProjectMembers );
}
}
StoredProject.setDefaultProjectMembers( defaultProjectMembers );
StoredProject.getDefault().getUsers().clear();
StoredProject.getDefault().getUsers().addAll( defaultProjectMembers );
}
private void submitProject( Project project, User user, Set<User> defaultProjectMembers )
{
if ( project.getUsers().contains( user ) )
{
if ( project.equals( StoredProject.getDefault() ) )
{
defaultProjectMembers.add( user );
}
else
{
user.getProjects().add( project );
}
}
}
public class ProjectPermissionsListView
extends Panel
{
private static final String INDENT = " ";
public ProjectPermissionsListView( String id, List<Project> projects )
{
super( id );
add( new ListView<Project>( "project", projects ) {
@Override
protected void populateItem( ListItem<Project> listItem )
{
final Project project = listItem.getModelObject();
listItem.add( new Label( "projectname", indentedName( project ) ).setEscapeModelStrings( false ) );
listItem.add( new ProjectUserCheckBox( "user", project ) );
}
} );
}
private String indentedName( Project project )
{
String prefix = "";
Project parent = project.getParent();
while ( parent != null )
{
prefix += INDENT;
parent = parent.getParent();
}
return prefix + project.getAlias();
}
public class ProjectUserCheckBox extends CheckBox
{
public ProjectUserCheckBox( final String id, final Project project )
{
super( id, new Model<Boolean>()
{
public Boolean getObject()
{
return project.getUsers().contains( currentUser );
}
@Override
public void setObject( Boolean member )
{
if ( member )
{
project.getUsers().add( currentUser );
}
else
{
project.getUsers().remove( currentUser );
}
}
} );
}
}
}
}
}