Lag till en användarinställnings-dialog, en klass att persista datan i som öppnas när sessionen skapas och gjort lite småpillande i menyn

git-svn-id: svn://svn.dsv.su.se/scipro/scipro/trunk@492 73ecded7-942e-4092-bab0-0e58ef0ee984
This commit is contained in:
mpeters 2011-03-24 17:44:54 +00:00
parent 1040274814
commit 3bbf8bab8b
11 changed files with 279 additions and 6 deletions

@ -20,8 +20,10 @@ import org.apache.wicket.spring.injection.annot.SpringBean;
import se.su.dsv.scipro.data.dao.interfaces.ProjectDao;
import se.su.dsv.scipro.data.dao.interfaces.RoleDao;
import se.su.dsv.scipro.data.dao.interfaces.UserDao;
import se.su.dsv.scipro.data.dao.interfaces.UserSettingsDao;
import se.su.dsv.scipro.data.dataobjects.Project;
import se.su.dsv.scipro.data.dataobjects.User;
import se.su.dsv.scipro.data.dataobjects.UserSettings;
import se.su.dsv.scipro.security.auth.Authenticator;
import se.su.dsv.scipro.security.auth.roles.Admin;
import se.su.dsv.scipro.security.auth.roles.DefaultRole;
@ -46,6 +48,8 @@ public class SciProSession extends WebSession {
private RoleDao roleDao;
@SpringBean
private ProjectDao projectDao;
@SpringBean
private UserSettingsDao userSettingsDao;
private List<Role> roles = new ArrayList<Role>();
private User user = null;
@ -175,6 +179,19 @@ public class SciProSession extends WebSession {
if(roles.isEmpty()){
roles.add(new DefaultRole());
}
/*
* Set active project from users settings
*/
UserSettings userSettings = userSettingsDao.getUserSettings(user);
if(userSettings != null)
activeProject = userSettings.getActiveProject();
else {
userSettings = new UserSettings(user);
}
/*
* With this userSettings.created() will return a users first login date and userSettings.modified() will return last login
*/
userSettings = userSettingsDao.save(userSettings);
Logger logger = Logger.getLogger("Application");
logger.log(Level.INFO, "User: "+getLoggedInIdentity()+ " logged in as: "+user.getFirstName()+" "+user.getLastName()+" "+user.getUserNames());
@ -183,7 +200,7 @@ public class SciProSession extends WebSession {
e.printStackTrace();
} catch (LoginException e) {
e.printStackTrace();
}
}
return false;
}

@ -51,9 +51,8 @@
<ul id="nav-list">
<li class="nav-list-item"><span class="menu-item"><a href="#" wicket:id="homePage">Home</a></span></li>
<li class="nav-list-item"><span class="menu-item"><a href="#">Messages</a></span></li>
<li class="parent nav-list-item" id="project-menu-item"><span class="menu-item"><a href="#">Project</a><img class="nav-arrow" src="images/site_nav_arrow.png" /></span>
<li class="parent nav-list-item" id="project-menu-item"><span class="menu-item"><a href="#" wicket:id="projectStartPage">Project</a><img class="nav-arrow" src="images/site_nav_arrow.png" /></span>
<div id="project-sub" class="submenu rounded-bl rounded-br">
<a href="#" wicket:id="projectTestPage">Project Home</a>
<a href="#">Message Board</a>
<a href="#">Scheduling</a>
<a href="#">Bookmarks</a>

@ -15,7 +15,7 @@ public class MainMenuPanel extends Panel {
public MainMenuPanel(String id, Class<? extends Page> containerClass) {
super(id);
add(getMenuLink("homePage", SciProApplication.get().getHomePage(), containerClass));
add(getMenuLink("projectTestPage", ProjectStartPage.class, containerClass));
add(getMenuLink("projectStartPage", ProjectStartPage.class, containerClass));
UserLinksPanel userLinksPanel = new UserLinksPanel("userLinksPanel");
add(userLinksPanel);
}
@ -23,7 +23,7 @@ public class MainMenuPanel extends Panel {
private BookmarkablePageLink<Void> getMenuLink(String id, final Class<? extends Page> targetPageClass, final Class<? extends Page> containerClass){
BookmarkablePageLink<Void> result = new BookmarkablePageLink<Void>(id, targetPageClass);
result.setOutputMarkupId(true);
if( (targetPageClass.getSuperclass().isAssignableFrom(containerClass) && targetPageClass.getSuperclass() != MenuPage.class) || targetPageClass == containerClass){
if(targetPageClass == containerClass || (targetPageClass.getSuperclass().isAssignableFrom(containerClass) && targetPageClass.getSuperclass() != MenuPage.class) ){
result.setMarkupId("current");
}
return result;

@ -2,7 +2,12 @@
<html xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.4-strict.dtd">
<body>
<wicket:panel>
<p>Logged in as: <span wicket:id="loggedInAs"></span> <a href=# wicket:id="systemSettingsLink">[S]</a> | <a href=# wicket:id="logoutLink">Logout</a></p>
<p>Logged in as: <span wicket:id="loggedInAs"></span> <a href=# wicket:id="userSettingsLink"><img src="images/icons/system-settings_16x16.png" alt="User Settings"></img></a>
<a href=# wicket:id="systemSettingsLink"> [S]</a> | <a href=# wicket:id="logoutLink">Logout</a></p>
<div wicket:id="dialog">
<div wicket:id="dialogContent"></div>
</div>
</wicket:panel>
</body>
</html>

@ -1,8 +1,12 @@
package se.su.dsv.scipro.basepanels;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.markup.html.AjaxLink;
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 org.odlabs.wiquery.ui.dialog.Dialog;
import se.su.dsv.scipro.SciProSession;
import se.su.dsv.scipro.basepages.SystemSettingsPage;
@ -11,6 +15,8 @@ import se.su.dsv.scipro.loginlogout.pages.LogoutPage;
public class UserLinksPanel extends Panel {
private static final long serialVersionUID = 4874973667648883012L;
private Dialog dialog;
public UserLinksPanel(String id) {
super(id);
@ -18,6 +24,26 @@ public class UserLinksPanel extends Panel {
add(new Label("loggedInAs", SciProSession.get().getUser() != null ? SciProSession.get().getUser().toString() : "ERROR: NO USER!"));
add(new BookmarkablePageLink<Void>("logoutLink", LogoutPage.class));
dialog = new Dialog("dialog");
dialog.setModal(true);
dialog.setAutoOpen(false);
dialog.add(new EmptyPanel("dialogContent"));
dialog.setWidth(500);
dialog.setHeight(500);
add(dialog);
add(new AjaxLink<Void>("userSettingsLink"){
private static final long serialVersionUID = 1L;
@Override
public void onClick(AjaxRequestTarget target) {
dialog.replace(new UserSettingsPanel("dialogContent"));
target.addComponent(dialog);
dialog.setTitle("User settings");
dialog.open(target);
}
});
/*
* Because of the annotation to the SystemSettingsPage class this link won't be visible for users without sysadmin role
*/

@ -0,0 +1,11 @@
<!DOCTYPE html>
<html xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.4-strict.dtd">
<body>
<wicket:panel>
<form wicket:id="userSettingsForm">
<label for="activeProject">Active project</label>
<select name="Active project" wicket:id="activeProject" id="activeProject"></select>
</form>
</wicket:panel>
</body>
</html>

@ -0,0 +1,90 @@
package se.su.dsv.scipro.basepanels;
import java.util.ArrayList;
import java.util.List;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.form.DropDownChoice;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.form.IChoiceRenderer;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.model.PropertyModel;
import org.apache.wicket.spring.injection.annot.SpringBean;
import se.su.dsv.scipro.SciProSession;
import se.su.dsv.scipro.data.dao.interfaces.ProjectDao;
import se.su.dsv.scipro.data.dao.interfaces.UserSettingsDao;
import se.su.dsv.scipro.data.dataobjects.Project;
import se.su.dsv.scipro.data.dataobjects.UserSettings;
/**
*
* @author Martin Peters - mpeters@dsv.su.se
*
*/
public class UserSettingsPanel extends Panel {
private static final long serialVersionUID = 1L;
@SpringBean
private ProjectDao projectDao;
@SpringBean
private UserSettingsDao userSettingsDao;
public UserSettingsPanel(String id) {
super(id);
add(new UserSettingsForm("userSettingsForm"));
}
private class UserSettingsForm extends Form<Void> {
private static final long serialVersionUID = 1L;
private Project activeProject;
public UserSettingsForm(String id) {
super(id);
activeProject = SciProSession.get().getActiveProject();
List<Project> userProjects = new ArrayList<Project>();
List<Project> existingProjects = projectDao.getProjectsByParticipant(SciProSession.get().getUser(), null);
userProjects.addAll(existingProjects);
DropDownChoice<Project> projectChoice = new DropDownChoice<Project>("activeProject", new PropertyModel<Project>(this, "activeProject"), userProjects);
projectChoice.setChoiceRenderer(new ProjectChoiceRenderer());
projectChoice.add(new AjaxFormComponentUpdatingBehavior("onchange") {
private static final long serialVersionUID = 1L;
protected void onUpdate(AjaxRequestTarget target) {
UserSettings userSettings = userSettingsDao.getUserSettings(SciProSession.get().getUser());
userSettings.setActiveProject(activeProject);
userSettings = userSettingsDao.save(userSettings);
SciProSession.get().setActiveProject(activeProject);
}
});
projectChoice.setNullValid(true);
add(projectChoice);
}
}//UserSettingsForm
private static class ProjectChoiceRenderer implements IChoiceRenderer<Project> {
private static final long serialVersionUID = 1L;
@Override
public Object getDisplayValue(Project project) {
String result = "Title: \"";
String title = project.getTitle();
final int maxLength = 30;
if(title.length() > maxLength)
title = title.substring(0, maxLength)+".. ";
result = result + title + "\" [" + project.getProjectStatus() + "]";
return result;
}
@Override
public String getIdValue(Project object, int index) {
return object.getId().toString();
}
}//ProjectChoiceRenderer
}

@ -0,0 +1,10 @@
package se.su.dsv.scipro.data.dao.interfaces;
import se.su.dsv.scipro.data.dataobjects.User;
import se.su.dsv.scipro.data.dataobjects.UserSettings;
public interface UserSettingsDao extends Dao<UserSettings>{
UserSettings getUserSettings(User user);
}

@ -0,0 +1,47 @@
package se.su.dsv.scipro.data.dao.jpa;
import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.PersistenceException;
import javax.persistence.TypedQuery;
import org.hibernate.ejb.QueryHints;
import org.springframework.orm.jpa.JpaCallback;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;
import se.su.dsv.scipro.data.dao.interfaces.UserSettingsDao;
import se.su.dsv.scipro.data.dataobjects.User;
import se.su.dsv.scipro.data.dataobjects.UserSettings;
/**
*
* @author Martin Peters - mpeters@dsv.su.se
*
*/
@Repository("userSettingsDao")
public class UserSettingsDaoJPAImp extends AbstractDaoJPAImp<UserSettings> implements UserSettingsDao{
public UserSettingsDaoJPAImp() {
super(UserSettings.class);
}
@Transactional
public UserSettings getUserSettings(final User user){
return getJpaTemplate().execute(new JpaCallback<UserSettings>() {
public UserSettings doInJpa(EntityManager em)
throws PersistenceException {
TypedQuery<UserSettings> query = em.createQuery("select us FROM UserSettings us, User u WHERE u = :user and us.user = u", UserSettings.class);
query.setParameter("user", user);
query.setHint(QueryHints.HINT_CACHEABLE, "true");
try{
return query.getSingleResult();
} catch (NoResultException e) {
return null;
}
}
});
}
}

@ -0,0 +1,66 @@
package se.su.dsv.scipro.data.dataobjects;
import javax.persistence.Cacheable;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
import javax.persistence.OneToOne;
import javax.persistence.Table;
import org.hibernate.annotations.Cache;
import org.hibernate.annotations.CacheConcurrencyStrategy;
/**
*
* @author Martin Peters - mpeters@dsv.su.se
*
*/
@Entity
@Table(name="user_settings")
@Cacheable(true)
@Cache(usage= CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) //Hibernate specific
public class UserSettings extends DomainObject {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue
private Long id;
@OneToOne(optional=false)
private User user;
@ManyToOne(optional=true)
private Project activeProject = null;
public UserSettings() {}
public UserSettings(User user){
this.user = user;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public Project getActiveProject() {
return activeProject;
}
public void setActiveProject(Project activeProject) {
this.activeProject = activeProject;
}
}

@ -59,6 +59,7 @@
<class>se.su.dsv.scipro.data.dataobjects.LinkResource</class>
<class>se.su.dsv.scipro.data.dataobjects.EmbedResource</class>
<class>se.su.dsv.scipro.data.dataobjects.FileResource</class>
<class>se.su.dsv.scipro.data.dataobjects.UserSettings</class>
<properties>
@ -148,6 +149,7 @@
<class>se.su.dsv.scipro.data.dataobjects.LinkResource</class>
<class>se.su.dsv.scipro.data.dataobjects.EmbedResource</class>
<class>se.su.dsv.scipro.data.dataobjects.FileResource</class>
<class>se.su.dsv.scipro.data.dataobjects.UserSettings</class>
<properties>