Merge branch 'develop' of ssh://git.dsv.su.se/git/scipro/scipro into develop

* 'develop' of ssh://git.dsv.su.se/git/scipro/scipro:
  Changed project menu to use the multi-row type, small modifications to the service/system menus
  Main menu now uses the TAB type, we might need to create a new type or fix the images used in the tabbed types to make this look decent.
  Allow supervisors to view opposition reports, not only admins
  Fix of several serious bugs in final seminar file handling and
  Removal of unused css file
  removed system out println
  Bugfix
  Removal of old incorrectly added javascript code
  Fix of menu label
  Removed unused stuff
  Refactored main menu to use another base
  And yes, even more cleaning up icons
  More cleaning up icons
  Cleaning up icons
  Added Icons used in Daisy
  Initial UI changes
This commit is contained in:
Fredrik Norberg 2011-08-02 14:25:15 +02:00
commit fefc7492e8
68 changed files with 434 additions and 1014 deletions
src/main
java/se/su/dsv/scipro
webapp

@ -34,7 +34,7 @@ public abstract class AbstractAdminSettingsPage extends AbstractAdminPage {
items.add(new MenuItem("Server Environment", AdminServerEnvironmentSettingsPage.class));
items.add(new MenuItem("Final seminar general settings", AdminFinalSeminarSettingsPage.class));
items.add(new MenuItem("Final seminar project level settings", AdminFinalSeminarSettingsPerProjectClassPage.class));
items.add(new MenuItem("Level settings", AdminPeerSettingsPage.class));
items.add(new MenuItem("Peer portal settings", AdminPeerSettingsPage.class));
items.add(new MenuItem("Edit levels", AdminProjectClassSettingsPage.class));
return items;

@ -3,15 +3,16 @@
xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.4-strict.dtd">
<body>
<wicket:extend>
<h3 class="section">Server/Request environment</h3>
<div style="overflow:auto;height:390px;">
<ul>
<li wicket:id="requestAttributes">
<span wicket:id="name">[name]</span>:
<span wicket:id="value">[value]</span>
</li>
</ul>
<h5 class="peer-title">Server/Request environment</h5>
<div>
<div style="overflow: auto; height: 360px;">
<ul>
<li wicket:id="requestAttributes"><span wicket:id="name">[name]</span>:
<span wicket:id="value">[value]</span>
</li>
</ul>
</div>
</div>
</wicket:extend>
</wicket:extend>
</body>
</html>

@ -25,10 +25,6 @@
<link href='http://fonts.googleapis.com/css?family=Ubuntu:regular,bold' rel='stylesheet' type='text/css' /> -->
<!--<link rel="stylesheet" href="css/scipro.css" media="screen,projection" />-->
<!-- <link type="text/css" href="css/smoothness/jquery-ui-1.8.10.custom.css" rel="stylesheet" />
<script type="text/javascript" src="js/jquery-1.5.2.min.js"></script>
<script type="text/javascript" src="js/jquery-ui-1.8.10.custom.min.js"></script> -->
<script type="text/javascript">
var _gaq = _gaq || [];

@ -0,0 +1,16 @@
package se.su.dsv.scipro.basepanels;
import org.apache.wicket.Page;
import se.su.dsv.scipro.components.AbstractMenuPanel;
public abstract class AbstractBaseMenuPanel extends AbstractMenuPanel {
private static final long serialVersionUID = 3738086567246191811L;
public AbstractBaseMenuPanel(final String id,final Class<? extends Page> menuContainerCommonSuperClass, final Class<? extends Page> containerClass) {
super(id,menuContainerCommonSuperClass,containerClass);
}
@Override
protected MenuType getMenuType() {
return MenuType.TAB;
}
}

@ -1,13 +1,19 @@
<!DOCTYPE html>
<html xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.4-strict.dtd">
<html
xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.4-strict.dtd">
<body>
<wicket:panel>
<header id="main-header" class="span-24">
<div class="prepend-1 span-5">
<h1 id="logo"><a href="#" wicket:id="homeLink" title="SciPro">SciPro</a></h1>
</div>
<div wicket:id="mainMenuPanel"></div>
</header>
</wicket:panel>
<wicket:panel>
<header id="main-header" class="span-24">
<div class="prepend-1 span-5">
<h1 id="logo">
<a href="#" wicket:id="homeLink" title="SciPro">SciPro</a>
</h1>
</div>
<div class="prepend-2 span-15 last user-links"
wicket:id="userLinksPanel"></div>
<div wicket:id="mainMenuPanel" class="main-menu prepend-6"></div>
<div wicket:id="serviceMenuPanel" class="service-menu"></div>
</header>
</wicket:panel>
</body>
</html>

@ -1,9 +1,7 @@
package se.su.dsv.scipro.basepanels;
import org.apache.wicket.Page;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.link.BookmarkablePageLink;
import org.apache.wicket.markup.html.panel.EmptyPanel;
import org.apache.wicket.markup.html.panel.Panel;
import se.su.dsv.scipro.SciProApplication;
@ -14,17 +12,13 @@ import se.su.dsv.scipro.SciProApplication;
*
*/
public class HeaderPanel extends Panel {
private static final long serialVersionUID = 1L;
public HeaderPanel(String id, Class<? extends Page> containerClass) {
super(id);
add(new BookmarkablePageLink<Void>("homeLink", SciProApplication.get().getHomePage()));
MainMenuPanel mainMenuPanel = new MainMenuPanel("mainMenuPanel", containerClass);
add(mainMenuPanel);
add(new MainMenuPanel("mainMenuPanel", containerClass));
add(new ServiceMenuPanel("serviceMenuPanel", containerClass));
add(new UserLinksPanel("userLinksPanel"));
}
}

@ -1,23 +0,0 @@
<!DOCTYPE html>
<html xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.4-strict.dtd">
<body>
<wicket:panel>
<nav id="main-nav">
<div class="span-18 last">
<div class="prepend-2 span-15 last" id="user-links" wicket:id="userLinksPanel"></div>
<div class="span-18 last">
<ul id="nav-list">
<li class="nav-list-item" id="home-menu-item" wicket:id="homeMenuItem"></li>
<li class="nav-list-item" id="messages-menu-item" wicket:id="messagesMenuItem"></li>
<li class="nav-list-item" id="project-menu-item" wicket:id="projectMenuItem"></li>
<li class="nav-list-item" id="supervisor-menu-item" wicket:id="supervisorMenuItem"></li>
<li class="nav-list-item" id="resources-menu-item" wicket:id="resourcesMenuItem"></li>
<li class="nav-list-item" id="admin-menu-item" wicket:id="adminMenuItem"></li>
</ul>
</div>
</div>
</nav>
</wicket:panel>
</body>
</html>

@ -4,123 +4,25 @@ import java.util.ArrayList;
import java.util.List;
import org.apache.wicket.Page;
import org.apache.wicket.PageParameters;
import org.apache.wicket.markup.html.link.BookmarkablePageLink;
import org.apache.wicket.markup.html.panel.Panel;
import org.odlabs.wiquery.core.commons.IWiQueryPlugin;
import org.odlabs.wiquery.core.commons.WiQueryResourceManager;
import org.odlabs.wiquery.core.javascript.JsStatement;
import se.su.dsv.scipro.HomePage;
import se.su.dsv.scipro.SciProApplication;
import se.su.dsv.scipro.admin.pages.AdminScheduleTemplatesPage;
import se.su.dsv.scipro.admin.pages.AdminStartPage;
import se.su.dsv.scipro.admin.pages.ProjectManagementPage;
import se.su.dsv.scipro.admin.pages.SystemMaintenancePage;
import se.su.dsv.scipro.basepages.MenuPage;
import se.su.dsv.scipro.basepanels.mainmenu.MainMenuItem;
import se.su.dsv.scipro.basepanels.mainmenu.MenuItem;
import se.su.dsv.scipro.knol.resource.page.ResourcePage;
import se.su.dsv.scipro.message.pages.PrivateMessagesPage;
import se.su.dsv.scipro.peer.pages.PeerReviewTemplatePage;
import se.su.dsv.scipro.project.pages.FinalSeminarProjectListPage;
import se.su.dsv.scipro.project.pages.ProjectOppositionPage;
import se.su.dsv.scipro.project.pages.ProjectPartnerPage;
import se.su.dsv.scipro.project.pages.ProjectStartPage;
import se.su.dsv.scipro.project.pages.ProjectChecklistPage;
import se.su.dsv.scipro.security.auth.MetaDataActionStrategy;
import se.su.dsv.scipro.security.auth.roles.Roles;
import se.su.dsv.scipro.supervisor.pages.SupervisorProjectsFinalSeminarPage;
import se.su.dsv.scipro.supervisor.pages.SupervisorStartPage;
import se.su.dsv.scipro.wiquery.mainmenu.MainMenuJavascriptResourceReference;
public class MainMenuPanel extends Panel implements IWiQueryPlugin {
public class MainMenuPanel extends AbstractBaseMenuPanel {
private static final long serialVersionUID = 3738086567246191811L;
public MainMenuPanel(String id, Class<? extends Page> containerClass) {
super(id);
add(new MainMenuItem("homeMenuItem", HomePage.MAIN_MENU_LABEL, HomePage.class, containerClass, null));
/*
* Messages
*/
MainMenuItem messagesMenuItem = new MainMenuItem("messagesMenuItem", PrivateMessagesPage.MAIN_MENU_LABEL, PrivateMessagesPage.class, containerClass, null);
MetaDataActionStrategy.authorize(messagesMenuItem, Roles.SYSADMIN); // TODO: Hidden for initial deployment
add(messagesMenuItem);
/*
* Project/Author
*/
List<MenuItem> projectMenuSubItems = new ArrayList<MenuItem>();
projectMenuSubItems.add(new MenuItem(ProjectStartPage.MAIN_MENU_LABEL, ProjectStartPage.class));
projectMenuSubItems.add(new MenuItem(ProjectOppositionPage.MAIN_MENU_LABEL, ProjectOppositionPage.class));
projectMenuSubItems.add(new MenuItem(FinalSeminarProjectListPage.MAIN_MENU_LABEL, FinalSeminarProjectListPage.class));
MainMenuItem projectMenuItem = new MainMenuItem("projectMenuItem", ProjectStartPage.MAIN_MENU_LABEL, ProjectStartPage.class, containerClass, projectMenuSubItems);
add(projectMenuItem);
/*
* Supervisor
*/
List<MenuItem> supervisorMenuSubItems = new ArrayList<MenuItem>();
//supervisorMenuSubItems.add(new MenuItem("Schedule Templates", SupervisorProjectsFinalSeminarPage.class));
supervisorMenuSubItems.add(new MenuItem(SupervisorStartPage.MAIN_MENU_LABEL, SupervisorStartPage.class));
supervisorMenuSubItems.add(new MenuItem(SupervisorProjectsFinalSeminarPage.MAIN_MENU_LABEL, SupervisorProjectsFinalSeminarPage.class));
MainMenuItem supervisorMenuItem = new MainMenuItem("supervisorMenuItem", SupervisorStartPage.MAIN_MENU_LABEL, SupervisorStartPage.class, containerClass, supervisorMenuSubItems);
MetaDataActionStrategy.authorize(supervisorMenuItem, new Roles[]{Roles.EXTERNAL, Roles.EMPLOYEE});
add(supervisorMenuItem);
/*
* Resource
*/
MainMenuItem resourcesMenuItem = new MainMenuItem("resourcesMenuItem", ResourcePage.MAIN_MENU_LABEL, ResourcePage.class, containerClass, null);
MetaDataActionStrategy.authorize(resourcesMenuItem, Roles.SYSADMIN ); // TODO: Hidden for initial deployment
add(resourcesMenuItem);
/*
* Admin
*/
List<MenuItem> adminMenuSubItems = new ArrayList<MenuItem>();
adminMenuSubItems.add(new MenuItem(AdminScheduleTemplatesPage.MAIN_MENU_LABEL, AdminScheduleTemplatesPage.class));
adminMenuSubItems.add(new MenuItem(SystemMaintenancePage.MAIN_MENU_LABEL, SystemMaintenancePage.class));
adminMenuSubItems.add(new MenuItem(ProjectManagementPage.MAIN_MENU_LABEL, ProjectManagementPage.class));
adminMenuSubItems.add(new MenuItem(PeerReviewTemplatePage.MAIN_MENU_LABEL, PeerReviewTemplatePage.class));
MainMenuItem adminMenuItem = new MainMenuItem("adminMenuItem", AdminStartPage.MAIN_MENU_LABEL, AdminStartPage.class, containerClass, adminMenuSubItems);
MetaDataActionStrategy.authorize(adminMenuItem, Roles.ADMIN);
add(adminMenuItem);
UserLinksPanel userLinksPanel = new UserLinksPanel("userLinksPanel");
add(userLinksPanel);
super(id,HomePage.class,containerClass);
}
@Override
public void contribute(WiQueryResourceManager wiQueryResourceManager) {
wiQueryResourceManager.addJavaScriptResource(MainMenuJavascriptResourceReference.get());
}
@Override
public JsStatement statement() {
return null;
}
/**
* @deprecated see {@link se.su.dsv.scipro.basepanels.mainmenu.AbstractMainMenuItem#getMenuLink(String)}
*/
@SuppressWarnings("unused")
private BookmarkablePageLink<Void> getMenuLink(String id, final Class<? extends Page> targetPageClass, final Class<? extends Page> containerClass){
return getMenuLink(id, targetPageClass, null, containerClass);
protected List<MenuItem> getItemList(){
List<MenuItem> list = new ArrayList<MenuItem>();
list.add(new MenuItem(ProjectStartPage.MAIN_MENU_LABEL,ProjectStartPage.class));
list.add(new MenuItem(SupervisorStartPage.MAIN_MENU_LABEL,SupervisorStartPage.class));
list.add(new MenuItem(AdminStartPage.MAIN_MENU_LABEL,AdminStartPage.class));
return list;
}
/**
* @deprecated see {@link se.su.dsv.scipro.basepanels.mainmenu.AbstractMainMenuItem#getMenuLink(String, PageParameters)}
*/
private BookmarkablePageLink<Void> getMenuLink(String id, final Class<? extends Page> targetPageClass, final PageParameters pp, final Class<? extends Page> containerClass){
BookmarkablePageLink<Void> result = new BookmarkablePageLink<Void>(id, targetPageClass, pp);
result.setOutputMarkupId(true);
if(targetPageClass == containerClass || (targetPageClass.getSuperclass().isAssignableFrom(containerClass) && targetPageClass.getSuperclass() != MenuPage.class) ){
result.setMarkupId("current");
}
return result;
}
}

@ -0,0 +1,24 @@
package se.su.dsv.scipro.basepanels;
import java.util.ArrayList;
import java.util.List;
import org.apache.wicket.Page;
import se.su.dsv.scipro.basepages.MenuPage;
import se.su.dsv.scipro.knol.resource.page.ResourcePage;
import se.su.dsv.scipro.message.pages.PrivateMessagesPage;
public class ServiceMenuPanel extends AbstractBaseMenuPanel {
private static final long serialVersionUID = 3738086567246191811L;
public ServiceMenuPanel(String id, Class<? extends Page> containerClass) {
super(id,MenuPage.class,containerClass);
}
@Override
protected List<MenuItem> getItemList(){
List<MenuItem> list = new ArrayList<MenuItem>();
list.add(new MenuItem(ResourcePage.MAIN_MENU_LABEL,ResourcePage.class));
list.add(new MenuItem(PrivateMessagesPage.MAIN_MENU_LABEL,PrivateMessagesPage.class));
return list;
}
}

@ -1,62 +0,0 @@
package se.su.dsv.scipro.basepanels.mainmenu;
import org.apache.wicket.Page;
import org.apache.wicket.PageParameters;
import org.apache.wicket.markup.html.link.BookmarkablePageLink;
import org.apache.wicket.markup.html.panel.Panel;
import se.su.dsv.scipro.basepages.MenuPage;
/**
* Abstract Class for Main Menu Items
*
* @author patrick
*
*/
public abstract class AbstractMainMenuItem extends Panel {
private static final long serialVersionUID = 2849283400267381932L;
protected Class<? extends Page> targetPageClass;
protected Class<? extends Page> containerPageClass;
private String menuLabel;
protected BookmarkablePageLink<Void> menuItemLink;
public AbstractMainMenuItem(String id, String label, Class<? extends Page> targetPageClass, Class<? extends Page> containerPageClass) {
super(id);
this.menuLabel = label;
this.targetPageClass = targetPageClass;
this.containerPageClass = containerPageClass;
}
public String getMenuLabel() {
return menuLabel;
}
/**
* {@link #getMenuLink(String, PageParameters)}
*/
protected BookmarkablePageLink<Void> getMenuLink(String id) {
return getMenuLink(id, null);
}
/**
* Creates a bookmarkable page link for the main menu.
*
* @param id
* @param pp
* @return
* @author Martin Peters
*/
protected BookmarkablePageLink<Void> getMenuLink(String id, final PageParameters pp) {
BookmarkablePageLink<Void> result = new BookmarkablePageLink<Void>(id, targetPageClass, pp);
result.setOutputMarkupId(true);
if(targetPageClass == containerPageClass || (targetPageClass.getSuperclass().isAssignableFrom(containerPageClass) && targetPageClass.getSuperclass() != MenuPage.class) ){
//TODO Should prefereably be replaced with the line below because repeating id's aren't valid html. I couldn't get the CSS to work though //mpeters
result.setMarkupId("current");
//result.add(new AttributeAppender("class", new Model<String>("current"), " "));
}
return result;
}
}

@ -1,12 +0,0 @@
<!DOCTYPE html>
<html xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.4-strict.dtd">
<body>
<wicket:panel>
<span class="menu-item">
<a wicket:id="mainMenuItemLink"><span wicket:id="mainMenuItemLabel"></span></a>
<img class="nav-arrow" wicket:id="mainMenuItemArrow" />
</span>
<div class="submenu rounded-bl rounded-br"><span wicket:id="mainMenuListItemSubMenu"><span wicket:id="subMenuItem"></span></span></div>
</wicket:panel>
</body>
</html>

@ -1,79 +0,0 @@
package se.su.dsv.scipro.basepanels.mainmenu;
import java.util.List;
import org.apache.wicket.Page;
import org.apache.wicket.behavior.AttributeAppender;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.image.ContextImage;
import org.apache.wicket.markup.html.list.ListItem;
import org.apache.wicket.markup.html.list.ListView;
import org.apache.wicket.model.Model;
/**
* Main Menu Item, the upper level of the main menu hierarchy.
*
* @author patrick
*
*/
public class MainMenuItem extends AbstractMainMenuItem {
private static final long serialVersionUID = 6103131868992599100L;
@SuppressWarnings("unused")
private List<MenuItem> subItems;
public MainMenuItem(String id, String label, final Class<? extends Page> targetPageClass, final Class<? extends Page> containerClass, final List<MenuItem> subItems) {
super(id, label, targetPageClass, containerClass);
this.subItems = subItems;
if (subItems != null)
this.add(new AttributeAppender("class", true, new Model<String>("parent"), " "));
menuItemLink = getMenuLink("mainMenuItemLink");
menuItemLink.add(new Label("mainMenuItemLabel", getMenuLabel()));
add(menuItemLink);
ContextImage mainMenuItemArrow = new ContextImage("mainMenuItemArrow", "images/site_nav_arrow2.png") {
private static final long serialVersionUID = 1793336840409311960L;
/* (non-Javadoc)
* @see org.apache.wicket.Component#isVisible()
*/
@Override
public boolean isVisible() {
return subItems != null;
}
};
mainMenuItemArrow.setOutputMarkupPlaceholderTag(true);
add(mainMenuItemArrow);
ListView<MenuItem> subItemListView = new ListView<MenuItem>("mainMenuListItemSubMenu", subItems) {
private static final long serialVersionUID = -1444218885819118389L;
@Override
protected void populateItem(ListItem<MenuItem> item) {
MenuItem obj = item.getModelObject();
item.add(obj.createSubItem("subMenuItem", containerClass));
add(item);
}
/* (non-Javadoc)
* @see org.apache.wicket.Component#isVisible()
*/
@Override
public boolean isVisible() {
return subItems != null;
}
};
subItemListView.setOutputMarkupPlaceholderTag(true);
add(subItemListView);
}
}

@ -1,8 +0,0 @@
<!DOCTYPE html>
<html xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.4-strict.dtd">
<body>
<wicket:panel>
<a href="#" wicket:id="mainMenuSubItemLink"><span wicket:id="mainMenuSubItemLabel">[Link]</span></a>
</wicket:panel>
</body>
</html>

@ -1,27 +0,0 @@
package se.su.dsv.scipro.basepanels.mainmenu;
import org.apache.wicket.Page;
import org.apache.wicket.markup.html.basic.Label;
/**
* Main Menu Sub Items
*
* @author patrick
*
*/
public class MainMenuSubItem extends AbstractMainMenuItem {
private static final long serialVersionUID = 8903203088965767242L;
public MainMenuSubItem(String id, String label, Class<? extends Page> targetPageClass,
Class<? extends Page> containerPageClass) {
super(id, label, targetPageClass, containerPageClass);
menuItemLink = getMenuLink("mainMenuSubItemLink");
menuItemLink.add(new Label("mainMenuSubItemLabel", getMenuLabel()));
add(menuItemLink);
}
}

@ -1,47 +0,0 @@
package se.su.dsv.scipro.basepanels.mainmenu;
import java.util.List;
import org.apache.wicket.IClusterable;
import org.apache.wicket.Page;
/**
* Helper Class for preparing the creation of main menu items
* @author patrick
*
*/
public class MenuItem implements IClusterable {
private static final long serialVersionUID = -5341715569517881163L;
private String menuLabel;
private Class<? extends Page> targetPageClass;
public MenuItem(String menuLabel, Class<? extends Page> targetPageClass) {
this.menuLabel = menuLabel;
this.targetPageClass = targetPageClass;
}
/**
* Creates a Main Menu Sub Item
*
* @param id
* @param containerPageClass
* @return
*/
public MainMenuSubItem createSubItem(String id, Class<? extends Page> containerPageClass) {
return new MainMenuSubItem(id, menuLabel, targetPageClass, containerPageClass);
}
/**
* Creates a Main Menu Item
*
* @param id
* @param containerPageClass
* @param subItems
* @return
*/
public MainMenuItem createMenuItem(String id, Class<? extends Page> containerPageClass, List<MenuItem> subItems) {
return new MainMenuItem(id, menuLabel, targetPageClass, containerPageClass, subItems);
}
}

@ -18,6 +18,11 @@ import org.apache.wicket.model.Model;
import se.su.dsv.scipro.icons.ImageIcon;
/**
* ABC-class for menu's of different types.
* Subclasses should implement their own data feed mechanics via <code>getItemList</code> and provide a menu type via <code>getMenuType</code>
* The returned menu-type is used to provide CSS-class mappings for the menu structure, see the MenuType enum for alternatives.
*/
public abstract class AbstractMenuPanel extends Panel {
private static final long serialVersionUID = 1L;
@ -33,6 +38,9 @@ public abstract class AbstractMenuPanel extends Panel {
}
};
/**
* Enumeration of supported menu types.
*/
public enum MenuType {
NONE,
TAB,
@ -41,7 +49,12 @@ public abstract class AbstractMenuPanel extends Panel {
VERTICAL
}
/**
* Superclass constructor, arguments
* @param id Wicket identifier for the component
* @param menuContainerCommonSuperClass [Needs documentation]
* @param containerClass [Needs documentation]
*/
public AbstractMenuPanel(final String id, final Class<? extends Page> menuContainerCommonSuperClass,final Class<? extends Page> containerClass) {
super(id);
@ -104,7 +117,10 @@ public abstract class AbstractMenuPanel extends Panel {
* @return
*/
protected abstract List<MenuItem> getItemList();
/**
* Implement in subclass to return the wanted MenuType.
* @return
*/
protected abstract MenuType getMenuType();
/**

@ -92,10 +92,8 @@ public class ConferencePanel extends Panel {
webMarkupContainer.setOutputMarkupId(true);
webMarkupContainer.add(new PagingNavigator("pagingNavigator", dataView));
add(webMarkupContainer);
if (boardMessageModel != null) {
if (boardMessageModel != null) {
int index = boardMessageDao.getBoardMessageSortOrderIndex(boardMessageModel.getObject());
System.out.println(index);
dataView.setCurrentPage(index/BOARDMESSAGESPERPAGE);
}
}

@ -6,11 +6,10 @@ import org.apache.wicket.markup.html.form.upload.FileUpload;
import se.su.dsv.scipro.data.dataobjects.FinalSeminar;
import se.su.dsv.scipro.data.dataobjects.FinalSeminarOpposition;
import se.su.dsv.scipro.data.dataobjects.User;
import se.su.dsv.scipro.repository.util.FileStorageException;
public interface FinalSeminarUploadController extends IClusterable {
void deleteSeminarFilesRecursive(FinalSeminar seminar);
void deleteOpponentFiles(FinalSeminarOpposition opp);
/**
@ -20,6 +19,15 @@ public interface FinalSeminarUploadController extends IClusterable {
* @throws Exception
*/
FinalSeminar deleteSeminarReport(FinalSeminar seminar) throws Exception;
/**
* Delete the upload report for the seminar, adminOverrideMode = true means no intentional exceptions will be thrown
* @param seminar
* @param adminOverrideMode
* @return
* @throws Exception
*/
FinalSeminar deleteSeminarReport(FinalSeminar seminar, boolean adminOverrideMode) throws Exception;
void storeSeminarDocument(FileUpload upload, User uploader, FinalSeminar seminar) throws Exception;

@ -78,17 +78,9 @@ public class FinalSeminarUploadControllerImpl implements FinalSeminarUploadContr
}
private void delete(String path) {
fileRepository.delete(path);
}
public void deleteSeminarFilesRecursive(final FinalSeminar seminar) throws FileStorageException {
if (seminar.getDocument() != null) {
//delete(getRepositorySeminarPath(seminar)); Use of deprecated path/method
delete(seminar.getDocument().getPath());
}
}
public void deleteOpponentFiles(final FinalSeminarOpposition opp) throws FileStorageException {
if (opp.getOpponentReport() != null) {
//delete(getRepositoryOppositionPath(opp)); Use of deprecated path/method
@ -103,18 +95,31 @@ public class FinalSeminarUploadControllerImpl implements FinalSeminarUploadContr
* @return
* @throws Exception
*/
public FinalSeminar deleteSeminarReport(FinalSeminar seminar) throws Exception {
public FinalSeminar deleteSeminarReport(FinalSeminar seminar) throws Exception{
return deleteSeminarReport(seminar, false);
}
/**
* Delete the upload report for the seminar, adminOverrideMode = true means no intentional exceptions will be thrown
* @param seminar
* @param adminOverrideMode
* @return
* @throws Exception
*/
public FinalSeminar deleteSeminarReport(FinalSeminar seminar, boolean adminOverrideMode) throws Exception {
seminar = finalSeminarDao.reLoad(seminar);
if (!seminar.getOppositions().isEmpty() || !seminar.getActiveParticipations().isEmpty()) {
throw new Exception(
"Cannot delete seminar report, seminar has opponents or active participants");
if( !adminOverrideMode ){
if (!seminar.getOppositions().isEmpty() || !seminar.getActiveParticipations().isEmpty()) {
throw new Exception(
"Cannot delete seminar report, seminar has opponents or active participants");
}
}
for (CheckPlagiarismEvent cpe : checkPlagiarismEventDao.getWithFileDescription(seminar
.getDocument())) {
checkPlagiarismEventDao.delete(cpe);
}
fileRepository.delete(seminar.getDocument().getPath());
if(seminar.getDocument() != null)
if(seminar.getDocument().getPath() != null)
fileRepository.delete(seminar.getDocument().getPath());
seminar.setDocument(null);
return finalSeminarDao.save(seminar);
}

@ -2,78 +2,73 @@
<html
xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.4-strict.dtd">
<body>
<wicket:panel>
<div wicket:id="titleContainer">
<strong>Project Title: </strong> <span wicket:id="projectTitle"></span>
<div>
<strong>Room: </strong> <span wicket:id="room"></span>
</div>
</div>
<div class="append-bottom">
<div>
<strong>Head supervisor:</strong>
</div>
<span wicket:id="headSupervisor"></span>
</div>
<div>
<strong>Author(s): </strong>
<ul class="no-list-style">
<li wicket:id="authorsList"><span wicket:id="author"></span></li>
</ul>
</div>
<wicket:panel>
<div wicket:id="feedback"></div>
<div wicket:id="titleContainer"><strong>Project Title: </strong>
<span wicket:id="projectTitle"></span>
<div><strong>Room: </strong> <span wicket:id="room"></span></div>
</div>
<div class="append-bottom">
<div><strong>Head supervisor:</strong></div>
<span wicket:id="headSupervisor"></span></div>
<div><strong>Author(s): </strong>
<ul class="no-list-style">
<li wicket:id="authorsList"><span wicket:id="author"></span></li>
</ul>
</div>
<div>
<strong>Co-supervisor(s): </strong>
<ul class="no-list-style">
<li wicket:id="coSupervisorsList"><span
wicket:id="coSupervisor"></span></li>
</ul>
</div>
<div><strong>Co-supervisor(s): </strong>
<ul class="no-list-style">
<li wicket:id="coSupervisorsList"><span wicket:id="coSupervisor"></span></li>
</ul>
</div>
<div>
<strong>Reviewer(s): </strong>
<ul class="no-list-style">
<li wicket:id="reviewersList"><span wicket:id="reviewer"></span>
</li>
</ul>
</div>
<div><strong>Reviewer(s): </strong>
<ul class="no-list-style">
<li wicket:id="reviewersList"><span wicket:id="reviewer"></span>
</li>
</ul>
</div>
<div wicket:id="detailsContainer">
<div>
<strong>Opponent(s): </strong>
<ul class="no-list-style">
<li wicket:id="opponentsList"><span wicket:id="opponent"></span>
</li>
</ul>
</div>
<div>
<strong>Active participant(s): </strong>
<ul class="no-list-style">
<li wicket:id="activeParticipantsList"><span
wicket:id="activeParticipant"></span></li>
</ul>
</div>
<div>
<strong>Presentation Language: </strong>
<div wicket:id="seminarLanguage"></div>
</div>
<div>
<strong>Thesis/Report Language: </strong>
<div wicket:id="thesisLanguage"></div>
</div>
<strong>Thesis/Report: </strong>
<div>
<span wicket:id="seminarReportTitle"></span> <span
wicket:id="uploadInfoContainer"> <a href="#"
wicket:id="open"><img
src="images/icons/document-preview_16x16.png" alt="Open/Preview" />
</a> <a href="#" wicket:id="download"><img
src="images/icons/download_16x16.png" alt="Download" /> </a> </span>
</div>
<div wicket:id="detailsContainer">
<div><strong>Opponent(s): </strong>
<ul class="no-list-style">
<li wicket:id="opponentsList"><span wicket:id="opponent"></span>
<div wicket:id="oppositionContainer"><strong>Report:</strong> <span wicket:id="oppositionReportTitle"></span> <a href="#"
wicket:id="open"><img
src="images/icons/document-preview_16x16.png" alt="Open/Preview" />
</a> <a href="#" wicket:id="download"><img
src="images/icons/download_16x16.png" alt="Download" /> </a> <a href="#"
wicket:id="deleteOppositionReport"><img
src="images/icons/delete_16x16.png" alt="delete" /> </a>
</div>
</wicket:panel>
</li>
</ul>
</div>
<div><strong>Active participant(s): </strong>
<ul class="no-list-style">
<li wicket:id="activeParticipantsList"><span
wicket:id="activeParticipant"></span></li>
</ul>
</div>
<div><strong>Presentation Language: </strong>
<div wicket:id="seminarLanguage"></div>
</div>
<div><strong>Thesis/Report Language: </strong>
<div wicket:id="thesisLanguage"></div>
</div>
<strong>Thesis/Report: </strong>
<div><span wicket:id="seminarReportTitle"></span> <span
wicket:id="uploadInfoContainer"> <a href="#" wicket:id="open"><img
src="images/icons/document-preview_16x16.png" alt="Open/Preview" /> </a>
<a href="#" wicket:id="download"><img
src="images/icons/download_16x16.png" alt="Download" /> </a> <a href="#"
wicket:id="deleteSeminarReport"><img
src="images/icons/delete_16x16.png" alt="delete" /> </a> </span></div>
</div>
</wicket:panel>
</body>
</html>

@ -3,16 +3,21 @@ package se.su.dsv.scipro.opponent.panels;
import java.util.ArrayList;
import java.util.List;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.markup.html.AjaxLink;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.list.ListItem;
import org.apache.wicket.markup.html.list.ListView;
import org.apache.wicket.markup.html.panel.EmptyPanel;
import org.apache.wicket.markup.html.panel.FeedbackPanel;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.model.Model;
import org.apache.wicket.spring.injection.annot.SpringBean;
import se.su.dsv.scipro.data.controllers.FinalSeminarUploadController;
import se.su.dsv.scipro.data.dao.interfaces.FinalSeminarDao;
import se.su.dsv.scipro.data.dao.interfaces.FinalSeminarOppositionDao;
import se.su.dsv.scipro.data.dataobjects.FinalSeminar;
import se.su.dsv.scipro.data.dataobjects.FinalSeminarActiveParticipation;
import se.su.dsv.scipro.data.dataobjects.FinalSeminarOpposition;
@ -23,6 +28,9 @@ import se.su.dsv.scipro.data.dataobjects.User;
import se.su.dsv.scipro.data.enums.ProjectTeamMemberRoles;
import se.su.dsv.scipro.repository.components.FileDownloadLink;
import se.su.dsv.scipro.repository.components.FileOpenLink;
import se.su.dsv.scipro.security.auth.MetaDataActionStrategy;
import se.su.dsv.scipro.security.auth.roles.Roles;
import se.su.dsv.scipro.util.JavascriptEventConfirmation;
public class FinalSeminarDetailsPanel extends Panel {
@ -30,11 +38,15 @@ public class FinalSeminarDetailsPanel extends Panel {
@SpringBean
private FinalSeminarDao finalSeminarDao;
@SpringBean
private FinalSeminarOppositionDao finalSeminarOppositionDao;
@SpringBean
private FinalSeminarUploadController finalSeminarUploadController;
public FinalSeminarDetailsPanel(final String id, final FinalSeminar seminar2,
final boolean details) {
public FinalSeminarDetailsPanel(final String id, final FinalSeminar seminar2, final boolean details) {
super(id);
this.setOutputMarkupId(true);
add(new FeedbackPanel("feedback"));
final FinalSeminar seminar = finalSeminarDao.reLoad(seminar2);
final Project project = seminar.getProject();
WebMarkupContainer titleContainer = new WebMarkupContainer("titleContainer") {
@ -53,8 +65,7 @@ public class FinalSeminarDetailsPanel extends Panel {
});
titleContainer.add(new Label("room", seminar.getRoom()));
add(titleContainer);
add(new ListView<Student>("authorsList", new ArrayList<Student>(
project.getProjectParticipants())) {
add(new ListView<Student>("authorsList", new ArrayList<Student>(project.getProjectParticipants())) {
private static final long serialVersionUID = 1L;
@Override
@ -111,41 +122,77 @@ public class FinalSeminarDetailsPanel extends Panel {
};
detailsContainer.add(new ListView<FinalSeminarOpposition>("opponentsList", seminar
.getOppositions()) {
detailsContainer.add(new ListView<FinalSeminarOpposition>("opponentsList", seminar.getOppositions()) {
private static final long serialVersionUID = 1L;
@Override
protected void populateItem(ListItem<FinalSeminarOpposition> item) {
item.add(item.getModelObject().getOpponent().getUser()
.getDisplayComponent("opponent", true));
protected void populateItem(final ListItem<FinalSeminarOpposition> item) {
item.add(item.getModelObject().getOpponent().getUser().getDisplayComponent("opponent", true));
WebMarkupContainer oppCon = new WebMarkupContainer("oppositionContainer"){
private static final long serialVersionUID = 1L;
@Override
public boolean isVisible(){
return item.getModelObject().getOpponentReport() != null;
}
};
//Students are not allowed to view other students opposition reports
MetaDataActionStrategy.authorize(oppCon, Roles.EMPLOYEE);
item.add(oppCon);
String reportTitle = "";
if(item.getModelObject().getOpponentReport() != null)
reportTitle = item.getModelObject().getOpponentReport().getName();
oppCon.add(new Label("oppositionReportTitle", reportTitle));
oppCon.add(new FileDownloadLink("download", item.getModelObject().getOpponentReport()));
oppCon.add(new FileOpenLink("open", item.getModelObject().getOpponentReport()));
oppCon.add(new AjaxLink<Void>("deleteOppositionReport"){
private static final long serialVersionUID = 1L;
{
MetaDataActionStrategy.authorize(this, Roles.ADMIN);
this.add(new JavascriptEventConfirmation("onclick", "Do you really want to delete this user-uploaded report?"));
}
@Override
public void onClick(AjaxRequestTarget target) {
try{
finalSeminarUploadController.deleteOpponentFiles(item.getModelObject());
FinalSeminarOpposition opp = item.getModelObject();
opp.setOpponentReport(null);
opp = finalSeminarOppositionDao.save(opp);
item.setModelObject(opp);
info("Opposition report deleted");
} catch(Exception e){
e.printStackTrace();
error("Something went wrong, see log files for stacktrace");
}
target.addComponent(FinalSeminarDetailsPanel.this);
}
});
add(item);
}
});
detailsContainer.add(new ListView<FinalSeminarActiveParticipation>(
"activeParticipantsList", seminar.getActiveParticipations()) {
detailsContainer.add(new ListView<FinalSeminarActiveParticipation>("activeParticipantsList", seminar.getActiveParticipations()) {
private static final long serialVersionUID = 1L;
@Override
protected void populateItem(ListItem<FinalSeminarActiveParticipation> item) {
item.add(item.getModelObject().getUser()
.getDisplayComponent("activeParticipant", true));
item.add(item.getModelObject().getUser().getDisplayComponent("activeParticipant", true));
add(item);
}
});
detailsContainer.add(new Label("seminarLanguage", seminar.getPresentationLanguage()
.toString()));
detailsContainer.add(new Label("seminarLanguage", seminar.getPresentationLanguage().toString()));
detailsContainer.add(new Label("thesisLanguage", seminar.getReportLanguage().toString()));
detailsContainer.add(new Label("seminarReportTitle", new Model<String>() {
private static final long serialVersionUID = 1L;
@Override
public String getObject() {
return seminar.getDocument() == null ? "No thesis/report uploaded" : seminar
.getDocument().getName();
return seminar.getDocument() == null ? "No thesis/report uploaded" : seminar.getDocument().getName();
}
}));
@ -161,6 +208,27 @@ public class FinalSeminarDetailsPanel extends Panel {
uploadInfoContainer.add(new FileDownloadLink("download", seminar.getDocument()));
uploadInfoContainer.add(new FileOpenLink("open", seminar.getDocument()));
uploadInfoContainer.add(new AjaxLink<Void>("deleteSeminarReport") {
private static final long serialVersionUID = 1L;
{
MetaDataActionStrategy.authorize(this, Roles.ADMIN);
this.add(new JavascriptEventConfirmation("onclick", "Do you really want to delete this user-uploaded report?"));
}
@Override
public void onClick(AjaxRequestTarget target) {
try {
finalSeminarUploadController.deleteSeminarReport(seminar, true);
seminar.setDocument(null); //Only to repaint the ajax call without the document icons
info("Report deleted");
} catch (Exception e) {
e.printStackTrace();
error("Deletion failed");
}
target.addComponent(FinalSeminarDetailsPanel.this);
}
});
detailsContainer.add(uploadInfoContainer);
add(detailsContainer);

@ -5,6 +5,7 @@
<wicket:panel>
<div class="span-22 prepend-top last">
<div wicket:id="feedback"></div>
<table class="rounded-table seminar-table even-rows">
<tr>
<th>Date</th>

@ -47,8 +47,8 @@ import se.su.dsv.scipro.opponent.models.OpponentModel;
public class OpponentListViewPanel extends Panel {
/**
*
*/
*
*/
private static final long serialVersionUID = 4988253889884804250L;
@SpringBean
@ -76,6 +76,10 @@ public class OpponentListViewPanel extends Panel {
super(id);
this.adminView = adminView;
loadListView(seminarList);
feedbackPanel = new FeedbackPanel("feedback");
add(feedbackPanel);
this.setOutputMarkupId(true);
editSeminarDialogContainer = new WebMarkupContainer("dialogContainer");
editSeminarDialog = new Dialog("dialog");
editSeminarDialog.setModal(true);
@ -96,7 +100,7 @@ public class OpponentListViewPanel extends Panel {
add(contactsSeminarDialog);
contactsDialogContainer.setOutputMarkupId(true);
contactsDialogContainer.add(contactsSeminarForm = new ContactsSeminarForm(
"contactsSeminarForm"));
"contactsSeminarForm"));
contactsSeminarForm.setOutputMarkupId(true);
add(linkListView);
@ -125,7 +129,7 @@ public class OpponentListViewPanel extends Panel {
User headSupervisor = seminar.getProject().getHeadSupervisor().getUser();
headSupervisorString += headSupervisor.getFirstName() + " "
+ headSupervisor.getLastName();
+ headSupervisor.getLastName();
item.add(new Label("headSupervisor", headSupervisorString));
item.add(new Label("projectClass", seminar.getProject().getProjectClass().getName()));
@ -191,20 +195,25 @@ public class OpponentListViewPanel extends Panel {
@Override
public void onClick(AjaxRequestTarget target) {
FinalSeminar seminar2 = finalSeminarDao.reLoad(seminar);
seminarUploadController.deleteSeminarFilesRecursive(seminar2);
for (FinalSeminarActiveParticipation al : seminar2
.getActiveParticipations()) {
finalSeminarActiveParticipationDao.delete(al);
}
try{
seminarUploadController.deleteSeminarReport(seminar2, true);
for (FinalSeminarActiveParticipation al : seminar2
.getActiveParticipations()) {
finalSeminarActiveParticipationDao.delete(al);
}
for (FinalSeminarOpposition fso : seminar2
.getOppositions()) {
seminarUploadController.deleteOpponentFiles(fso);
finalSeminarOppositionDao.delete(fso);
for (FinalSeminarOpposition fso : seminar2
.getOppositions()) {
seminarUploadController.deleteOpponentFiles(fso);
finalSeminarOppositionDao.delete(fso);
}
finalSeminarDao.delete(seminar2);
info("Final seminar deleted");
} catch (Exception e){
error("Something went wrong, see logs for stacktrace");
e.printStackTrace();
}
finalSeminarDao.delete(seminar2);
setResponsePage(AdminFinalSeminarPage.class);
target.addComponent(OpponentListViewPanel.this);
}
@Override
@ -227,7 +236,7 @@ public class OpponentListViewPanel extends Panel {
@Override
public CharSequence decorateScript(CharSequence script) {
String ret = "if(!confirm('The attendees of this seminar will NOT be notified that the seminar has been deleted, are you sure you wish to delete it?')) return false; "
+ script;
+ script;
return ret;
}
};
@ -243,8 +252,8 @@ public class OpponentListViewPanel extends Panel {
private class EditSeminarForm extends Form<OpponentModel> {
/**
*
*/
*
*/
private static final long serialVersionUID = -5004827722926732419L;
public EditSeminarForm(String name) {
@ -257,8 +266,8 @@ public class OpponentListViewPanel extends Panel {
private class EditForm extends Form<Void> {
/**
*
*/
*
*/
private static final long serialVersionUID = 5882957818616996808L;
public EditForm(String name, final FinalSeminar seminar) {
@ -290,8 +299,8 @@ public class OpponentListViewPanel extends Panel {
private class ContactsSeminarForm extends Form<OpponentModel> {
/**
*
*/
*
*/
private static final long serialVersionUID = -5004827722926732419L;
public ContactsSeminarForm(String name) {
@ -306,8 +315,8 @@ public class OpponentListViewPanel extends Panel {
private class ContactsForm extends Form<Void> {
/**
*
*/
*
*/
private static final long serialVersionUID = -8271761600388217566L;
public ContactsForm(String name, final FinalSeminar seminar) {
@ -316,8 +325,8 @@ public class OpponentListViewPanel extends Panel {
add(new AjaxButton("contacts", new Model<String>("Details")) {
/**
*
*/
*
*/
private static final long serialVersionUID = 1211337464815824507L;
@Override

@ -221,7 +221,7 @@ public class ProjectFinalSeminarPanel extends Panel {
public boolean isVisible() {
return !isSupervisorView && seminar.getActiveParticipations().isEmpty()
&& seminar.getOppositions().isEmpty() && seminar.getTurnitinId() != null;
&& seminar.getOppositions().isEmpty() && seminar.getTurnitinId() == null;
}
@Override

@ -1,86 +1,102 @@
<!DOCTYPE html>
<html xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.4-strict.dtd">
<html
xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.4-strict.dtd">
<body>
<wicket:extend>
<div class="span-22">
<div wicket:id="feedbackPanel"></div>
<form wicket:id="requestForm" class="wizard-form">
<div class="span-22 last">
<div class="span-11 colborder">
<div>
<fieldset>
<legend>Step 1 - Read instructions</legend>
<p>The instructions are located in the box to the right</p>
</fieldset>
<fieldset>
<legend wicket:id="fileUploadLabel">[Step 2 - Attach a file]</legend>
<input wicket:id="fileUpload" type="file" />
</fieldset>
<fieldset>
<legend>Step 3 - Write review guideline/comment (optional)</legend>
<textarea wicket:id="comment"></textarea>
</fieldset>
</div>
</div>
<div class="span-8 last info-box rounded-box">
<ul>
<li><p>Providing a review template is of great help for the reviewer, browse available templates and try to find an appropriate one!</p></li>
<li><p>If you cannot find an suitable review template, make sure to use the review guideline/comment to point out what you'd like feedback on.</p></li>
<li><p>If a review template covers too much, make sure to point out questions that you don't feel like they apply</p></li>
<li><p>If you're missing relevant questions in the review template, make sure to mention them in the comment.</p></li>
<li><p>If you have several files you'd like to attach, compress them to an archived file (ie. zip-file).</p></li>
<li><p><strong>Remember that the more guidelines (review template, questions you'd like answered etc.) you provide the reviewer, the greater the chance of a useful review!</strong></p></li>
</ul>
<wicket:extend>
<div class="span-22">
<div wicket:id="feedbackPanel"></div>
<form wicket:id="requestForm" class="wizard-form">
<div class="span-22">
<div>
<h5 class="peer-title">Step 1 - Read instructions</h5>
<ul>
<li>Providing a review template is of great help for the
reviewer, browse available templates and try to find an
appropriate one!</li>
<li>If you cannot find an suitable review template, make
sure to use the review guideline/comment to point out what you'd
like feedback on.</li>
<li>If a review template covers too much, make sure to point
out questions that you don't feel like they apply</li>
<li>If you're missing relevant questions in the review
template, make sure to mention them in the comment.</li>
<li>If you have several files you'd like to attach, compress
them to an archived file (ie. zip-file).</li>
<li>Remember that the more guidelines (review template,
questions you'd like answered etc.) you provide the reviewer,
the greater the chance of a useful review!</li>
</ul>
</div>
<div class="span-22 forcedPaddingBottom">
<div class="span-11 first">
<h5 class="peer-title" wicket:id="fileUploadLabel">[Step 2 -
Attach a file]</h5>
<input wicket:id="fileUpload" type="file" style="margin-top:2em;"/>
</div>
<div class="span-11 last">
<h5 class="peer-title">Step 3 - Write review
guideline/comment (optional)</h5>
<textarea wicket:id="comment"></textarea>
</div>
</div>
</div>
</div>
<div class="span-22 last">
<fieldset>
<legend>Step 4 - Select a suitable review template (optional)</legend>
<div wicket:id="listContainer">
<table class="rounded-table">
<tr>
<th>Select</th>
<th>Name</th>
<th>Description</th>
<th>Questions</th>
<th>Preview</th>
</tr>
<tr>
<td colspan="5"><i><span wicket:id="noTemplatesFoundMsg"></span></i></td>
</tr>
<tr wicket:id="templateList">
<td><a wicket:id="selectTemplateLink" href="#">Select</a></td>
<td><span wicket:id="templateName"></span></td>
<td><div class="span-8"><span wicket:id="templateDescription"></span></div></td>
<td><span wicket:id="templateNumQuestions"></span></td>
<td><a href="#" wicket:id="previewTemplateLink">Preview</a></td>
</tr>
<tr><td wicket:id="pager" colspan="5"></td></tr>
</table>
</div>
<div wicket:id="selectedTemplateContainer">
<strong>Selected template: </strong>
<span wicket:id="selectedTemplate"></span>
<a href="#" wicket:id="unSelectTemplateLink">
<img class="icon-12" src="images/icons/delete_16x16.png" alt="Unselect template"/> Unselect
</a>
</div>
</fieldset>
<fieldset>
<legend>Step 5 - Submit your request</legend>
<div wicket:id="feedbackPanel">
<!-- The feedback panel -->
</div>
<div>
<button wicket:id="sendRequestButton" class="button">Submit your request for review
<img src="css/blueprint/plugins/buttons/icons/tick.png" alt=""/>
<div class="span-22">
<h5 class="peer-title">Step 4 - Select a suitable review
template (optional)</h5>
<div wicket:id="listContainer">
<table class="rounded-table">
<tr>
<th>Select</th>
<th>Name</th>
<th>Description</th>
<th>Questions</th>
<th>Preview</th>
</tr>
<tr>
<td colspan="5"><i><span
wicket:id="noTemplatesFoundMsg"></span>
</i>
</td>
</tr>
<tr wicket:id="templateList">
<td><a wicket:id="selectTemplateLink" href="#">Select</a>
</td>
<td><span wicket:id="templateName"></span>
</td>
<td><div class="span-8">
<span wicket:id="templateDescription"></span>
</div>
</td>
<td><span wicket:id="templateNumQuestions"></span>
</td>
<td><a href="#" wicket:id="previewTemplateLink"><img src="images/icons/document-preview_16x16.png" class="icon-16" alt="Preview template"/></a>
</td>
</tr>
<tr>
<td wicket:id="pager" colspan="5"></td>
</tr>
</table>
</div>
<div wicket:id="selectedTemplateContainer" class="forcedPaddingBottom">
<strong>Selected template: </strong> <span
wicket:id="selectedTemplate"></span> <a href="#"
wicket:id="unSelectTemplateLink"> <img class="icon-12"
src="images/icons/delete_16x16.png" alt="Unselect template" />
Unselect </a>
</div>
<h5 class="peer-title">Step 5 - Submit your request</h5>
<div wicket:id="feedbackPanel">
<!-- The feedback panel -->
</div>
<div>
<button wicket:id="sendRequestButton" class="button">
Submit your request for review <img
src="css/blueprint/plugins/buttons/icons/tick.png" alt="" />
</button>
</div>
</fieldset>
</div>
</form>
</div>
</wicket:extend>
</div>
</div>
</form>
</div>
</wicket:extend>
</body>
</html>

@ -6,7 +6,7 @@
<body>
<wicket:panel>
<div class="append-bottom">
<h6>Requests with completed reviews</h6>
<h6>Completed reviews</h6>
<i wicket:id="noReceivedReviewsCompletedMessage"></i>
<ul class="no-list-style small">
<li wicket:id="receivedReviewsCompleted">
@ -20,7 +20,7 @@
</div>
<div class="append-bottom">
<h6>Requests with reviews in progress</h6>
<h6>In progress</h6>
<i wicket:id="noReceivedReviewsInProgressMessage"></i>
<ul class="no-list-style small">
<li wicket:id="receivedReviewsInProgress">
@ -34,7 +34,7 @@
</div>
<div class="append-bottom">
<h6>Requests waiting to be accepted</h6>
<h6>Awaiting review</h6>
<div wicket:id="peerInfoRequestsFeedback"></div>
<i wicket:id="noAwaitingAcceptMsg"></i>
<ul class="no-list-style small">

@ -6,7 +6,7 @@
<body>
<wicket:panel>
<div class="append-bottom">
<h6>Reviews completed</h6>
<h6>Completed</h6>
<i wicket:id="noAcceptedReviewsCompletedMessage"></i>
<ul class="no-list-style small">
<li wicket:id="acceptedReviewsCompleted">
@ -19,7 +19,7 @@
</div>
<div class="append-bottom">
<h6>Reviews in progress</h6>
<h6>In progress</h6>
<i wicket:id="noAcceptedInProgressMessage"></i>
<ul class="no-list-style small">
<li wicket:id="acceptedInProgress">
@ -32,7 +32,7 @@
</div>
<div>
<h6>Reviews aborted: <span wicket:id="abortedReviews"></span></h6>
<h6>Aborted: <span wicket:id="abortedReviews"></span></h6>
</div>
</wicket:panel>
</body>

@ -58,7 +58,7 @@ public class ProjectTabMenuPanel extends AbstractMenuPanel {
@Override
protected MenuType getMenuType() {
return MenuType.TAB;
return MenuType.TAB_MULTIPLE_ROWS;
}
}

Binary file not shown.

Before

(image error) Size: 852 B

After

(image error) Size: 2.5 KiB

Binary file not shown.

Before

(image error) Size: 829 B

After

(image error) Size: 3.4 KiB

@ -64,7 +64,7 @@
<tbody>
<tr>
<td></td>
<td><a href="#" wicket:id="up">[..]</a></td>
<td><a href="#" wicket:id="up"><img src="images/icons/daisyIcons/plain/folder_up.png" class="icon-24" alt="Parent folder"/></a></td>
</tr>
</tbody>
@ -72,7 +72,7 @@
<tr wicket:id="content">
<td><a href="delete" wicket:id="delete"><img src="images/icons/edit-delete_16x16.png" alt="X" /></a></td>
<td><a href="#" wicket:id="link"><img wicket:id="folderIcon" src="#" alt="folderIcon" /> <span wicket:id="name">name</span></a></td>
<td><a href="#" wicket:id="link"><img wicket:id="folderIcon" src="#" alt="folderIcon" class="icon-24"/> <span wicket:id="name">name</span></a></td>
<td><span wicket:id="created"></span></td>
</tr>
</tbody>

@ -1,20 +0,0 @@
package se.su.dsv.scipro.wiquery.mainmenu;
import org.apache.wicket.markup.html.resources.JavascriptResourceReference;
public class MainMenuJavascriptResourceReference extends
JavascriptResourceReference {
private static final long serialVersionUID = -5062441830192125794L;
private static MainMenuJavascriptResourceReference INSTANCE =
new MainMenuJavascriptResourceReference();
private MainMenuJavascriptResourceReference() {
super(MainMenuJavascriptResourceReference.class, "jquery.mainmenu.js");
}
public static MainMenuJavascriptResourceReference get() {
return INSTANCE;
}
}

@ -1,49 +0,0 @@
$(document).ready(function() {
$("img.nav-arrow").click(function() {
var parent = $(this).parents(".parent");
if (parent != null)
showMenu(parent);
})
.mouseover(function() {
//$(this).attr("src", "./images/site_nav_arrow_hover.png");
})
.mouseout(function() {
//$(this).attr("src", "./images/site_nav_arrow.png");
});
$(document).click(function(e) {
if ($(e.target).parents("#nav-list").length == 0) {
closeMenus(null);
}
});
$(document).mouseover(function(e) {
if ($(e.target).parents("#main-nav").length == 0) {
closeMenus(null);
}
});
addCurrentClassToIdentifier = function(identifier) {
var t = $("#nav-list").find(identifier).parents(".nav-list-item").get(0);
$(t).addClass("current");
};
closeMenus = function(node) {
$("#nav-list .parent").children(".over").each(function() {
if (this != node || node == null) {
$(this).removeClass("over");
}
});
};
showMenu = function(node) {
var thisMenu = $(node);
var isActive = $(node).find("div.submenu").hasClass("over");
closeMenus(thisMenu);
if (!isActive) {
thisMenu.find("div.submenu").toggleClass("over");
}
};
addCurrentClassToIdentifier("#current");
});

@ -1,98 +1,14 @@
#main-nav {
}
#nav-list {
margin-top: 4px;
z-index: 8001;
}
#nav-list li.nav-list-item {
float: left;
display: inline;
margin: 5px 8px 0 8px;
position: relative;
}
#nav-list li.nav-list-item .menu-item {
display: block;
height: 23px;
padding: 4px 2px 3px 2px;
}
#nav-list li.nav-list-item .menu-item a {
color: #fff;
font: 1.1em/1.5 arial, sans-serif;
font-weight: bold;
text-decoration: none;
padding: 0px 4px;
}
#nav-list li.nav-list-item .menu-item > a#current {
/* padding: 0 10px 7px 10px;
border-bottom: 5px solid #ccc; */
}
.menu-item img.nav-arrow {
vertical-align: middle;
width: 23px;
height: 23px;
margin-left: 4px;
margin-right: -3px;
}
#nav-list a#current {
/* Feel free to replace with something nicer */
/* padding-bottom: 7px; */
/* border-bottom: 5px solid #ccc; */
}
#nav-list li.current .menu-item,
#nav-list li.nav-list-item:hover .menu-item {
background-color: #fff;
-webkit-border-top-left-radius: 4px;
-moz-border-radius-topleft: 4px;
border-top-left-radius: 4px;
-webkit-border-top-right-radius: 4px;
-moz-border-radius-topright: 4px;
border-top-right-radius: 4px;
text-decoration: none;
}
#nav-list li.current .menu-item a,
#nav-list li.nav-list-item:hover .menu-item a {
color: #002f5f;
}
#nav-list li.nav-list-item.parent .submenu {
position: absolute;
top: 30px;
left: -1px;
width: 140px;
background: #fff;
padding: 5px;
display: none;
border-bottom: 1px solid #ccc;
border-left: 1px solid #ccc;
border-right: 1px solid #ccc;
z-index: 8000;
}
#nav-list li.nav-list-item.parent .over {
display: block;
}
#nav-list li.nav-list-item.parent .submenu {
font-size: 0.9em;
}
#nav-list li.nav-list-item.parent .submenu a:link,
#nav-list li.nav-list-item.parent .submenu a:visited,
#nav-list li.nav-list-item.parent .submenu a:hover {
display: block;
padding: 4px;
text-decoration: none;
}
#main-nav #user-links {
margin-top: 5px;
.user-links{
margin-top:5px;
font-size: 0.9em;
text-align: right;
}
#main-nav #user-links a {
.user-links a{
color: #99acbf;
}
.main-menu{
float:left;
}
.service-menu{
float: right;
}

@ -63,6 +63,7 @@ img.department-logotype {
#main-content {
min-height: 500px;
background: url('../images/background.png') repeat-y;
padding-bottom: 1.5em;
}
#main-content h1,
@ -236,6 +237,10 @@ ul.no-list-style li {
margin-left: -1.5em;
}
.rounded-table,
.rounded-table-top{
padding-top: 0.5em;
}
.rounded-table th,
.rounded-table-top th {
background: #ccc;
@ -831,7 +836,6 @@ td.active {
text-align:right;
white-space: nowrap;
}
.question-rounded-box {
font-size: 0.9em;
padding:1.5em;
@ -930,7 +934,9 @@ h5.peer-box-subtitle {
.shortened-table-header {
cursor: help;
}
.forcedPaddingBottom{
padding-bottom: 1.5em;
}
table.seminar-table {
font-size: 0.9em;
}

Binary file not shown.

After

(image error) Size: 3.1 KiB

Binary file not shown.

After

(image error) Size: 2.0 KiB

Binary file not shown.

After

(image error) Size: 2.0 KiB

Binary file not shown.

After

(image error) Size: 2.0 KiB

Binary file not shown.

After

(image error) Size: 1.8 KiB

Binary file not shown.

After

(image error) Size: 2.0 KiB

Binary file not shown.

After

(image error) Size: 3.3 KiB

Binary file not shown.

After

(image error) Size: 1.9 KiB

Binary file not shown.

After

(image error) Size: 3.0 KiB

Binary file not shown.

After

(image error) Size: 3.1 KiB

Binary file not shown.

After

(image error) Size: 2.1 KiB

Binary file not shown.

After

(image error) Size: 2.0 KiB

Binary file not shown.

After

(image error) Size: 2.7 KiB

Binary file not shown.

After

(image error) Size: 2.9 KiB

Binary file not shown.

After

(image error) Size: 1.9 KiB

Binary file not shown.

After

(image error) Size: 2.7 KiB

Binary file not shown.

After

(image error) Size: 2.5 KiB

Binary file not shown.

After

(image error) Size: 3.2 KiB

Binary file not shown.

After

(image error) Size: 3.4 KiB

Binary file not shown.

After

(image error) Size: 3.3 KiB

Binary file not shown.

After

(image error) Size: 3.1 KiB

Binary file not shown.

After

(image error) Size: 3.8 KiB

Binary file not shown.

After

(image error) Size: 3.9 KiB

Binary file not shown.

After

(image error) Size: 4.0 KiB

Binary file not shown.

After

(image error) Size: 1.1 KiB

Binary file not shown.

After

(image error) Size: 1.8 KiB

Binary file not shown.

After

(image error) Size: 3.2 KiB

Binary file not shown.

After

(image error) Size: 1.0 KiB

Binary file not shown.

After

(image error) Size: 1.9 KiB

Binary file not shown.

After

(image error) Size: 3.4 KiB

Binary file not shown.

After

(image error) Size: 2.7 KiB

Binary file not shown.

After

(image error) Size: 2.6 KiB

@ -1,230 +0,0 @@
@CHARSET "UTF-8";
html, body {
font-family: Calibri, Tahoma, Verdana, sans-serif;
margin: 0 0 0 0;
padding: 0 0 0 0;
font-size: 0.94em;
line-height: 1.5em;
padding-top: 30px;
}
h1, h2, h3 {
font-family: Cambria, Tahoma, Verdana, sans-serif;
}
#container {
width: 960px;
margin: auto;
}
#ajax-loader {
z-index:9999;
position: fixed;
top: 0;
left: 0;
width: 80px;
height: 30px;
background-color: #FFFF80;
border-bottom: 1px solid black;
border-right: 1px solid black;
}
#veil {
opacity:0.3;
filter:alpha(opacity=50);
position:absolute;
width: 100%;
height: 100%;
z-index:9998;
background-color: white;
}
#veil-loader {
z-index:9999;
position: absolute;
top: 30%;
left: 45%;
width: 100px;
height: 100px;
background: url(../images/ajax-loader.gif) center no-repeat;
}
p.inline {
display: inline;
}
.connectedSortable {
cursor: move;
}
.float-right {
float:right;
}
.float-left {
float:left;
}
td.icon,
span.icon {
padding-left: 20px;
line-height: 20px; /* To center the text vertically with the icon */
}
span.floating-icon {
width: 20px;
height: 20px;
}
td.icon-button,
span.icon-button {
cursor: pointer;
}
td.icon-user,
span.icon-user { /*The background image*/
background: url(../images/user.png) no-repeat left center;
}
td.icon-project,
span.icon-project { /*The background image*/
background: url(../images/project.png) no-repeat left center;
}
td.icon-arrowDown,
span.icon-arrowDown {
background: url(../images/icons/arrow-down.png) no-repeat left center;
}
td.icon-plus,
span.icon-plus {
background: url(../images/icons/add.gif) no-repeat left center;
}
td.icon-minus,
span.icon-minus {
background: url(../images/icons/minus.gif) no-repeat left center;
}
td.icon-check,
span.icon-check {
background: url(../images/icons/circle-check.png) no-repeat left center;
}
td.icon-pencil,
span.icon-pencil { /*The background image*/
background: url(../images/icons/pencil.png) no-repeat left center;
}
td.icon-delete,
span.icon-delete { /*The background image*/
background: url(../images/icons/circle-delete.png) no-repeat left center;
}
td.icon-zoom-in,
span.icon-zoom-in { /*The background image*/
background: url(../images/icons/zoom-in.png) no-repeat left center;
}
.bordered-box {
border: 1px solid #CCE6FF;
padding: 0.5em 0.5em;
}
.float-left {
float: left;
}
.float-right {
float: right;
}
.boxContent {
margin: 0.5em 0.5em;
}
.boxContent h4 {
border: 1px solid #0099CC;
background-color: #CCE6FF;
padding: 0.3em 0.3em;
}
.dashboardBox {
border: 1px solid #3300CC;
width: 50em;
min-height: 10em;
}
.dashboardBox h3 {
border-bottom: 1px solid #3300CC;
background-color: blue;
color: white;
padding: 0.2em;
margin: 0 0;
}
form.div {
display:block;
}
form.formRow {
display: inline;
}
#schedulePlannerCtrlContainer {
border: 1px solid #CCE6FF;
}
#schedulePlannerCtrlContainer ul {
list-style-type: none;
display: inline;
}
.scheduleEventList {
margin: 1em 0;
}
.scheduleEvent {
padding: 0.2em 0.2em;
-webkit-border-radius: 3px;
background-color: #E5F3FF;
border: 1px solid #B3DBFF;
}
.scheduleEventHeader {
padding: 0.4em 0.2em;
}
.scheduleEventHeaderBar {
margin-left: 0.5em;
}
.scheduleEventHeaderBar img {
float:left;
margin-right: 1em;
margin-left: 0.5em;
}
.scheduleEventHeaderBar span {
display: inline;
margin-left: 0.1em;
}
.scheduleEventIconbar {
margin: 0.4em 1em;
padding: 0.3em;
}
.scheduleEventContent {
padding: 0.3em 0.5em;
width: 45em;
}
.scheduleEventFooter {
margin-top: 1em;
}
form.dialogForm {
font-size: 0.9em;
}