Commit e1de63fe by Tuomas Riihimäki

Merge branch 'user_selectable_groups' into 'master'

User selectable groups

Roolille voi pistää täpän joka sanoo että käyttäjä voi valita sen itse itsellensä.

Tähän oli aluksi iisot suunnitelmat mallia "määritellään ylärooli joka sanoo montako roolia voidaan valita sen alta", mutta kun pääsin käyttäjävieweihin asti totesin että ny ammutaan taas singolla kärpästä, ja tein yksinkertaisen version. Jos joku joskus tulevaisuudessa oikeasti tarttee monipuolisempaa, niin tehdään se silloin.

Tämä korjaa kanssa lectureen liittyviä asioita, tämän hyväksyminen kesti niin pushailin niitä tähän ettei tarvitse kiireessä ruveta leikkimään usealla branchilla ja arpomaan miten ne mergeytyy.

Reviewed-by: @tuomari
2 parents f0611443 7760d10c
Showing with 508 additions and 133 deletions
......@@ -203,6 +203,7 @@ public class BootstrapBean implements BootstrapBeanLocal {
"ALTER TABLE lecture_participants ADD CONSTRAINT FK_lecture_participants_eventuser_id FOREIGN KEY (eventuser_id) REFERENCES event_users (id)",
"ALTER TABLE lecture_participants ADD CONSTRAINT FK_lecture_participants_lecture_id FOREIGN KEY (lecture_id) REFERENCES lectures (id)"});
dbUpdates.add(new String[] { "ALTER TABLE roles ADD COLUMN user_selectable_role boolean DEFAULT false;" });
}
@EJB
......
......@@ -2,16 +2,21 @@ package fi.codecrew.moya.beans;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import javax.annotation.security.DeclareRoles;
import javax.annotation.security.RolesAllowed;
import javax.ejb.EJB;
import javax.ejb.Stateless;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import fi.codecrew.moya.enums.apps.LecturePermission;
import fi.codecrew.moya.facade.EventUserFacade;
import fi.codecrew.moya.facade.LectureFacade;
import fi.codecrew.moya.facade.LectureGroupFacade;
import fi.codecrew.moya.model.ApplicationPermission;
import fi.codecrew.moya.model.EventUser;
import fi.codecrew.moya.model.Lecture;
import fi.codecrew.moya.model.LectureGroup;
......@@ -24,6 +29,8 @@ import fi.codecrew.moya.model.Role;
@DeclareRoles({ LecturePermission.S_VIEW, LecturePermission.S_MANAGE })
public class LectureBean implements LectureBeanLocal {
private static final Logger logger = LoggerFactory.getLogger(LectureBean.class);
@EJB
LectureFacade lectureFacade;
@EJB
......@@ -93,6 +100,7 @@ public class LectureBean implements LectureBeanLocal {
lecture = lectureFacade.merge(lecture);
}
return lecture;
}
......@@ -192,4 +200,18 @@ public class LectureBean implements LectureBeanLocal {
return maxCount - userLectureSelects(group, user);
}
@Override
public boolean isUserCanParticipate(EventUser user) {
List<Role> roles = userBean.findUsersRoles(user);
for (Role role : roles) {
for (ApplicationPermission apperm : role.getPermissions()) {
if(apperm.getPermission().getFullName().equals(LecturePermission.PARTICIPATE.getFullName()))
return true;
}
}
return false;
}
}
......@@ -297,7 +297,9 @@ public class MenuBean implements MenuBeanLocal {
MenuNavigation adminlectures = adminmenu.addPage(null, null);
adminlectures.setKey("topnavi.adminlectures");
adminlectures.addPage(menuitemfacade.findOrCreate("/lectureadmin/manageLectureGroups"), LecturePermission.MANAGE);
adminlectures.addPage(menuitemfacade.findOrCreate("/lectureadmin/manageLectures"), LecturePermission.MANAGE).setVisible(false);;
adminlectures.addPage(menuitemfacade.findOrCreate("/lectureadmin/lectureParticipants"), LecturePermission.MANAGE);
adminlectures.addPage(menuitemfacade.findOrCreate("/lectureadmin/manageLectures"), LecturePermission.MANAGE).setVisible(false);
......
......@@ -12,6 +12,7 @@ import javax.annotation.Resource;
import javax.annotation.security.DeclareRoles;
import javax.annotation.security.RolesAllowed;
import javax.ejb.EJB;
import javax.ejb.EJBAccessException;
import javax.ejb.LocalBean;
import javax.ejb.SessionContext;
import javax.ejb.Stateless;
......@@ -20,6 +21,7 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import fi.codecrew.moya.enums.apps.IAppPermission;
import fi.codecrew.moya.enums.apps.SpecialPermission;
import fi.codecrew.moya.enums.apps.UserPermission;
import fi.codecrew.moya.facade.EventUserFacade;
import fi.codecrew.moya.facade.RoleFacade;
......@@ -56,7 +58,10 @@ public class RoleBean implements RoleBeanLocal {
private EventUserFacade eventuserfacade;
@EJB
private EventBeanLocal permbean;
private PermissionBeanLocal permbean;
@EJB
private LoggingBeanLocal loggerbean;
@EJB
private CardTemplateBean cardTemplateBean;
......@@ -212,9 +217,40 @@ public class RoleBean implements RoleBeanLocal {
cardTemplateBean.checkPrintedCard(usr);
}
@Override
@RolesAllowed(UserPermission.S_READ_ROLES)
@RolesAllowed(SpecialPermission.S_USER)
public List<Role> getRoles(EventUser selectedUser) {
if (!permbean.isCurrentUser(selectedUser) && !permbean.hasPermission(UserPermission.READ_ROLES)) {
loggerbean.logMessage(SecurityLogType.permissionDenied, permbean.getCurrentUser(), "User tried to touch another user roles: " + selectedUser);
throw new EJBAccessException("Not enough rights to read user permissions");
}
return roleFacade.findForUser(selectedUser);
}
@Override
public void saveUserSelectableRoles(EventUser user, List<Role> roles) {
List<Role> allRoles = roleFacade.findUserSelectableRoles();
for (Role ur : allRoles)
{
if (roles.contains(ur)) {
if (!ur.getUsers().contains(user)) {
ur.getUsers().add(user);
}
} else {
ur.getUsers().remove(user);
}
}
cardTemplateBean.checkPrintedCard(user);
}
@Override
public List<Role> listUserSelectableRoles() {
return roleFacade.findUserSelectableRoles();
}
}
......@@ -156,7 +156,6 @@ public class UserBean implements UserBeanLocal {
@EJB
private ProductFacade productFacade;
@Override
@RolesAllowed(UserPermission.S_VIEW_ALL)
public List<EventUser> getUsers() {
......@@ -217,6 +216,8 @@ public class UserBean implements UserBeanLocal {
// add roles from events default role.
addRecursive(checkedRoles, event.getDefaultRole());
}
if (!u.isAnonymous()) {
// add roles from accountEvents of the user
addRecursive(checkedRoles, productbean.getRolesFromAccountEvents(u));
......@@ -230,6 +231,7 @@ public class UserBean implements UserBeanLocal {
}
}
}
}
}
// currentEventuser = u;
......
package fi.codecrew.moya.facade;
import java.util.ArrayList;
import java.util.List;
import javax.ejb.EJB;
......@@ -9,11 +10,11 @@ import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;
import fi.codecrew.moya.model.Role_;
import fi.codecrew.moya.beans.EventBeanLocal;
import fi.codecrew.moya.model.EventUser;
import fi.codecrew.moya.model.LanEvent;
import fi.codecrew.moya.model.Role;
import fi.codecrew.moya.model.Role_;
@Stateless
@LocalBean
......@@ -60,4 +61,16 @@ public class RoleFacade extends IntegerPkGenericFacade<Role> {
return getEm().createQuery(cq).getResultList();
}
public List<Role> findUserSelectableRoles() {
CriteriaBuilder cb = getEm().getCriteriaBuilder();
CriteriaQuery<Role> cq = cb.createQuery(Role.class);
Root<Role> root = cq.from(Role.class);
cq.where(cb.equal(root.get(Role_.event), eventbean.getCurrentEvent()),
cb.equal(root.get(Role_.userSelectableRole), Boolean.TRUE));
List<Role> roles = getEm().createQuery(cq).getResultList();
return roles;
}
}
......@@ -32,4 +32,6 @@ public interface LectureBeanLocal {
public int userLectureSelectsLeft(LectureGroup group, EventUser user);
public int userLectureSelects(LectureGroup group, EventUser user);
public boolean isUserCanParticipate(EventUser user);
}
......@@ -34,8 +34,12 @@ public interface RoleBeanLocal {
public void saveRoles(EventUser usr, List<Role> usersRoles);
public void saveUserSelectableRoles(EventUser user, List<Role> roles);
public List<Role> getRoles(EventUser selectedUser);
Role addRole(EventUser eventuser, Role role);
List<Role> listUserSelectableRoles();
}
......@@ -7,6 +7,7 @@ package fi.codecrew.moya.model;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import javax.persistence.Column;
......@@ -63,7 +64,7 @@ public class Lecture extends GenericEntity {
@Temporal(TemporalType.TIMESTAMP)
@Column(name = "start_time")
private Calendar startTime;
private Date startTime;
@Column(name = "hours", precision = 10, scale = 2)
private BigDecimal hours;
......@@ -133,17 +134,19 @@ public class Lecture extends GenericEntity {
this.maxParticipantsCount = maxParticipantsCount;
}
public Calendar getStartTime() {
public Date getStartTime() {
if (startTime == null) {
startTime = Calendar.getInstance();
startTime = new Date();
}
return startTime;
}
public void setStartTime(Calendar startTime) {
public void setStartTime(Date startTime) {
this.startTime = startTime;
}
/*
@Transient
public Calendar getEndTime() {
if (getStartTime() == null || getHours() == null)
......@@ -156,6 +159,7 @@ public class Lecture extends GenericEntity {
return endTime;
}
@Transient
public void setEndTime(Calendar endTime) {
if (endTime == null || getStartTime() == null) {
......@@ -163,7 +167,7 @@ public class Lecture extends GenericEntity {
}
setHours(new BigDecimal((int) endTime.compareTo(getStartTime()) / 1000 / 60 / 60));
}
}*/
public BigDecimal getHours() {
return hours;
......@@ -184,7 +188,7 @@ public class Lecture extends GenericEntity {
newLecture.setName(getName());
newLecture.setHours(getHours());
newLecture.setMaxParticipantsCount(getMaxParticipantsCount());
newLecture.setStartTime( (Calendar) getStartTime().clone());
newLecture.setStartTime( (Date) getStartTime().clone());
newLecture.setOpenForRoles(new ArrayList<Role>(getOpenForRoles()));
return newLecture;
......@@ -193,7 +197,7 @@ public class Lecture extends GenericEntity {
@Transient
public boolean isFull() {
if (getMaxParticipantsCount() <= 0) {
if (getMaxParticipantsCount() == null || getMaxParticipantsCount() <= 0) {
return false;
}
......
......@@ -74,6 +74,9 @@ public class Role extends GenericEntity {
@JoinColumn(name = EVENT_ID_COLUMN, nullable = false)
private LanEvent event;
@Column(name = "user_selectable_role", nullable = true)
private boolean userSelectableRole;
@ManyToMany
@JoinTable(name = "roles_provided_by_org_roles",
joinColumns = { @JoinColumn(name = "role_id", referencedColumnName = Role.ID_COLUMN) },
......@@ -208,12 +211,22 @@ public class Role extends GenericEntity {
this.orgRoles = orgRoles;
}
public List<Lecture> getLectures() {
return lectures;
}
public void setLectures(List<Lecture> lectures) {
this.lectures = lectures;
}
public boolean isUserSelectableRole() {
return userSelectableRole;
}
public void setUserSelectableRole(boolean user_selectable_group) {
this.userSelectableRole = user_selectable_group;
}
}
......@@ -5,6 +5,7 @@ import fi.codecrew.moya.enums.BortalApplication;
public enum LecturePermission implements IAppPermission {
VIEW,
PARTICIPATE,
MANAGE,
;
......
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core" xmlns:products="http://java.sun.com/jsf/composite/cditools/products" xmlns:users="http://java.sun.com/jsf/composite/cditools/user" xmlns:c="http://java.sun.com/jsp/jstl/core" xmlns:p="http://primefaces.org/ui">
<h:body>
<ui:composition template="#{sessionHandler.template}">
<f:metadata>
<f:viewParam name="lecturegroupid" value="#{lectureView.lectureGroupId}" />
<f:event type="preRenderView" listener="#{lectureReportsView.initView()}" />
</f:metadata>
<ui:define rendered="#{lectureReportsView.lectureGroupsVisible}" name="title">
<h1>#{i18n['viewlectures.title']}</h1>
</ui:define>
<ui:define name="content">
<h:form id="viewlecturesform">
<p:fieldset rendered="#{lectureReportsView.lectureGroupsVisible}" id="lectureGroups" legend="#{i18n['lecture.selectgroup']}">
<p:dataTable value="#{lectureReportsView.lectureGroups}" var="lectureGroup">
<p:column headerText="#{i18n['lectureGroup.name']}">
<h:outputText value="#{lectureGroup.name}" />
</p:column>
<p:column headerText="#{i18n['lectureGroup.description']}">
<h:outputText value="#{lectureGroup.description}" />
</p:column>
<p:column headerText="#{i18n['lectureGroup.selectCountUserInfo']}">
<h:outputText value="#{lectureGroup.selectCount}" />
</p:column>
<p:column>
<p:commandButton value="#{i18n['lectureGroup.view']}" actionListener="#{lectureReportsView.selectCurrentLectureGroup}" update=":viewlecturesform:participatedLectures :viewlecturesform:availableLectures :viewlecturesform:title" onerror="location.reload(true)" />
</p:column>
</p:dataTable>
</p:fieldset>
<h1>
<h:outputText id="title" value="#{lectureReportsView.currentLectureGroup.name}" />
</h1>
<p:fieldset id="availableLectures" legend="#{i18n['lecture.availableLectures']}">
<p:commandButton value="#{i18n['refresh']}" actionListener="#{lectureReportsView.refresh}" />
<p:dataTable value="#{lectureReportsView.lectures}" var="lecture">
<p:column style="width:16px">
<p:rowToggler />
</p:column>
<p:column headerText="#{i18n['lecture.name']}" sortBy="#{lecture.name}">
<h:outputText value="#{lecture.name}" />
</p:column>
<p:column headerText="#{i18n['lecture.description']}" sortBy="#{lecture.description}">
<h:outputText value="#{lecture.description}" />
</p:column>
<p:column headerText="#{i18n['lecture.hours']}" sortBy="#{lecture.hours}">
<h:outputText value="#{lecture.hours}" />
</p:column>
<p:column headerText="#{i18n['lecture.startTime']}" sortBy="#{lecture.startTime}">
<h:outputText value="#{lecture.startTime}">
<f:convertDateTime pattern="#{sessionHandler.datetimeFormat}" timeZone="#{sessionHandler.timezone}" />
</h:outputText>
</p:column>
<p:column headerText="#{i18n['lecture.participants']}" sortBy="#{lecture.participantsCount}">
<h:outputText value="#{lecture.participantsCount}" /> / <h:outputText value="#{lecture.maxParticipantsCount}" />
</p:column>
<p:column>
<h:outputText value="#{i18n['lecture.full']}" rendered="#{lecture.full}" />
</p:column>
<p:rowExpansion>
<p:dataTable value="#{lecture.participants}" var="user">
<p:column>
<h:outputText value="#{user.user.nick}" />
</p:column>
<p:column>
<h:outputText value="#{user.user.lastname}" />
</p:column>
<p:column>
<h:outputText value="#{user.user.firstnames}" />
</p:column>
</p:dataTable>
</p:rowExpansion>
</p:dataTable>
<p:commandButton value="#{i18n['refresh']}" actionListener="#{lectureReportsView.refresh}" />
</p:fieldset>
</h:form>
</ui:define>
</ui:composition>
</h:body>
</html>
\ No newline at end of file
......@@ -31,7 +31,7 @@
</p:column>
<p:column headerText="#{i18n['lecture.startTime']}">
<h:outputText value="#{lecture.startTime.time}">
<h:outputText value="#{lecture.startTime}">
<f:convertDateTime pattern="#{sessionHandler.datetimeFormat}" timeZone="#{sessionHandler.timezone}" />
</h:outputText>
</p:column>
......@@ -60,7 +60,7 @@
<p:inputText value="#{lectureView.currentLecture.maxParticipantsCount}" />
<p:outputLabel value="#{i18n['lecture.startTime']}" />
<p:calendar value="#{lectureView.currentLecture.startTime.time}" pattern="#{sessionHandler.datetimeFormat}" showOn="button" />
<p:calendar value="#{lectureView.currentLecture.startTime}" pattern="#{sessionHandler.datetimeFormat}" showOn="button" />
<p:outputLabel value="#{i18n['lecture.hours']}" />
<p:inputText value="#{lectureView.currentLecture.hours}" />
......
......@@ -15,6 +15,11 @@
<h:form id="viewlecturesform">
<p:outputPanel styleClass="messagebox" rendered="#{!lectureUserView.participateActive}">
<h2><p:outputLabel value="#{i18n['lecture.participateNotActive.title']}" /></h2>
<p:outputLabel value="#{i18n['lecture.participateNotActive.message']}" />
</p:outputPanel>
<p:fieldset rendered="#{lectureUserView.lectureGroupsVisible}" id="lectureGroups" legend="#{i18n['lecture.selectgroup']}">
<p:dataTable value="#{lectureUserView.lectureGroups}" var="lectureGroup">
<p:column headerText="#{i18n['lectureGroup.name']}">
......@@ -37,52 +42,52 @@
</h1>
<p:fieldset id="participatedLectures" legend="#{i18n['lecture.participatedLectures']} #{lectureUserView.currentGroupParticipateCount} / #{lectureUserView.currentLectureGroup.selectCount}">
<p:fieldset id="participatedLectures" rendered="#{lectureUserView.participateActive}" legend="#{i18n['lecture.participatedLectures']} #{lectureUserView.currentGroupParticipateCount} / #{lectureUserView.currentLectureGroup.selectCount}">
<p:dataTable value="#{lectureUserView.participatedLectures}" var="lecture">
<p:column headerText="#{i18n['lecture.name']}">
<p:column headerText="#{i18n['lecture.name']}" style="width:125px">
<h:outputText value="#{lecture.name}" />
</p:column>
<p:column headerText="#{i18n['lecture.description']}">
<h:outputText value="#{lecture.description}" />
</p:column>
<p:column headerText="#{i18n['lecture.hours']}">
<p:column headerText="#{i18n['lecture.hours']}" style="width:110px">
<h:outputText value="#{lecture.hours}" />
</p:column>
<p:column headerText="#{i18n['lecture.startTime']}">
<h:outputText value="#{lecture.startTime.time}">
<p:column headerText="#{i18n['lecture.startTime']}" style="width:110px">
<h:outputText value="#{lecture.startTime}">
<f:convertDateTime pattern="#{sessionHandler.datetimeFormat}" timeZone="#{sessionHandler.timezone}" />
</h:outputText>
</p:column>
<p:column headerText="#{i18n['lecture.participants']}">
<p:column headerText="#{i18n['lecture.participants']}" style="width:110px">
<h:outputText value="#{lecture.participantsCount}" /> / <h:outputText value="#{lecture.maxParticipantsCount}" />
</p:column>
<p:column>
<p:column style="width:110px">
<p:commandButton value="#{i18n['lecture.unparticipate']}" actionListener="#{lectureUserView.unParticipateCurrent}" update=":viewlecturesform:availableLectures :viewlecturesform:participatedLectures" onerror="location.reload(true)" />
</p:column>
</p:dataTable>
</p:fieldset>
<br /><br />
<p:fieldset id="availableLectures" legend="#{i18n['lecture.availableLectures']}">
<p:fieldset id="availableLectures" legend="#{i18n['lecture.availableLectures']}" >
<p:dataTable value="#{lectureUserView.lectures}" var="lecture">
<p:column headerText="#{i18n['lecture.name']}">
<p:column headerText="#{i18n['lecture.name']}" sortBy="#{lecture.name}" style="width:125px">
<h:outputText value="#{lecture.name}" />
</p:column>
<p:column headerText="#{i18n['lecture.description']}">
<p:column headerText="#{i18n['lecture.description']}" sortBy="#{lecture.description}">
<h:outputText value="#{lecture.description}" />
</p:column>
<p:column headerText="#{i18n['lecture.hours']}">
<p:column headerText="#{i18n['lecture.hours']}" sortBy="#{lecture.hours}" style="width:110px">
<h:outputText value="#{lecture.hours}" />
</p:column>
<p:column headerText="#{i18n['lecture.startTime']}">
<h:outputText value="#{lecture.startTime.time}">
<p:column headerText="#{i18n['lecture.startTime']}" sortBy="#{lecture.startTime}" style="width:110px">
<h:outputText value="#{lecture.startTime}">
<f:convertDateTime pattern="#{sessionHandler.datetimeFormat}" timeZone="#{sessionHandler.timezone}" />
</h:outputText>
</p:column>
<p:column headerText="#{i18n['lecture.participants']}">
<p:column headerText="#{i18n['lecture.participants']}" sortBy="#{lecture.participantsCount}" style="width:110px">
<h:outputText value="#{lecture.participantsCount}" /> / <h:outputText value="#{lecture.maxParticipantsCount}" />
</p:column>
<p:column>
<p:commandButton value="#{i18n['lecture.participate']}" rendered="#{!lectureUserView.currentGroupFull and !lecture.full}" actionListener="#{lectureUserView.participateCurrent}" update=":viewlecturesform:availableLectures :viewlecturesform:participatedLectures" onerror="location.reload(true)" />
<p:column style="width:80px">
<p:commandButton value="#{i18n['lecture.participate']}" rendered="#{!lectureUserView.currentGroupFull and !lecture.full and lectureUserView.participateActive}" actionListener="#{lectureUserView.participateCurrent}" update=":viewlecturesform:availableLectures :viewlecturesform:participatedLectures" onerror="location.reload(true)" />
<h:outputText value="#{i18n['lecture.full']}" rendered="#{lecture.full}" />
<h:outputText value="#{i18n['lecture.groupFull']}" rendered="#{lectureUserView.currentGroupFull}" />
</p:column>
......
......@@ -100,8 +100,10 @@
</h:panelGrid>
<br />
<h:panelGroup rendered="#{productShopView.gatherBillInfo}">
<h2><p:outputLabel value="#{i18n['bill.notes.title']}" /> </h2>
<p:inputTextarea cols="50" rendered="#{productShopView.gatherBillInfo}" value="#{productShopView.otherInfo}" label="#{i18n['otherInfo']}" />
<p:inputTextarea cols="50" value="#{productShopView.otherInfo}" label="#{i18n['otherInfo']}" />
</h:panelGroup>
<br />
<p:commandButton onerror="location.reload(true);" action="#{cc.attrs.commitaction}" id="commitbutton-botton" value="#{cc.attrs.commitValue}" />
......
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core" xmlns:composite="http://java.sun.com/jsf/composite"
xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:c="http://java.sun.com/jsp/jstl/core" xmlns:p="http://primefaces.org/ui" xmlns:tools="http://java.sun.com/jsf/composite/tools"
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core" xmlns:composite="http://java.sun.com/jsf/composite" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:c="http://java.sun.com/jsp/jstl/core" xmlns:p="http://primefaces.org/ui" xmlns:tools="http://java.sun.com/jsf/composite/tools"
xmlns:role="http://java.sun.com/jsf/composite/tools/role">
......@@ -25,12 +24,12 @@
<h:form id="addmember">
<h:outputText value="#{i18n['roleView.adduser']}" />
<p:autoComplete id="useradder" value="#{roleView.addableUser}" completeMethod="#{roleView.searchUser}" converter="#{userConverter}" var="usr" itemValue="#{usr}"
itemLabel="#{usr.shortUserDescriptor}">
<p:autoComplete id="useradder" value="#{roleView.addableUser}" completeMethod="#{roleView.searchUser}" converter="#{userConverter}" var="usr" itemValue="#{usr}" itemLabel="#{usr.shortUserDescriptor}">
<p:ajax onerror="location.reload(true);" update=":editor:addmember,:editor:memberlist" event="itemSelect" listener="#{roleView.addUser}" />
</p:autoComplete>
</h:form>
<p:fieldset legend="#{i18n['roleView.members']}" collapsed="true">
<h:dataTable id="memberlist" value="#{roleView.role.users}" var="usr">
<h:column>
<h:outputText value="#{usr.login}" />
......@@ -46,13 +45,14 @@
</h:column>
</h:dataTable>
</p:fieldset>
<button id="roledisplayer" onclick='$("#roleeditor").show(); $(this).hide();'>#{i18n['role.showPermissioneditor']}</button>
<button id="roledisplayer" onclick='$("#roleeditor").show(); $(this).hide();'>#{i18n['roleView.showPermissioneditor']}</button>
<div id="roleeditor" style="display: none">
<button onclick='$("#roleeditor").hide(); $("#roledisplayer").show();'>#{i18n['role.hidePermissioneditor']}</button>
<button onclick='$("#roleeditor").hide(); $("#roledisplayer").show();'>#{i18n['roleView.hidePermissioneditor']}</button>
<h2>#{i18n['role.permissionheader']}</h2>
<p>
<h:form id="permissionform">
......
......@@ -10,6 +10,8 @@
<h:panelGrid columns="2">
<h:outputText value="#{i18n['role.name']}" />
<h:inputText value="#{roleView.role.name}" />
<h:outputText value="#{i18n['role.userSelectableRole']}" />
<p:selectBooleanCheckbox value="#{roleView.role.userSelectableRole}" />
<h:outputText value="#{i18n['role.parents']}" />
<h:selectManyCheckbox converter="#{roleConverter}" layout="pageDirection" id="roleparents"
......@@ -23,6 +25,8 @@
</h:selectOneMenu>
</h:panelGrid>
<br /><br />
</ui:composition>
</html>
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core" xmlns:composite="http://java.sun.com/jsf/composite"
xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:c="http://java.sun.com/jsp/jstl/core" xmlns:tools="http://java.sun.com/jsf/composite/tools" xmlns:p="http://primefaces.org/ui">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core" xmlns:composite="http://java.sun.com/jsf/composite" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:c="http://java.sun.com/jsp/jstl/core" xmlns:tools="http://java.sun.com/jsf/composite/tools" xmlns:p="http://primefaces.org/ui">
<composite:interface>
......@@ -10,21 +9,20 @@
<composite:attribute name="creating" required="false" default="false" />
<composite:attribute name="commitaction" required="true" method-signature="java.lang.String action()" />
<composite:attribute name="camAlwaysOn" required="false" default="false" />
<composite:attribute name="showRoles" required="false" default="false" />
</composite:interface>
<composite:implementation>
<h:outputScript library="primefaces" name="jquery/jquery.js" target="head" />
<h:panelGrid columns="2">
<h:panelGrid columns="3" cellpadding="20" columnClasses="topalign,topalign,topalign">
<h:form id="userform" enctype="multipart/form-data">
<h:panelGroup>
<ui:fragment rendered="#{not empty userView.selectedUser.id}">
<p:dialog id="chartPanel" for="webcamButton" modal="true" dynamic="true" widgetVar="webcamDialog">
<p:photoCam widgetVar="pc" listener="#{userView.oncapture}" update="@all" />
<p:commandButton type="button" value="Capture" onclick="PF('pc').capture()" onerror="location.reload(true);"/>
<p:commandButton type="button" value="Capture" onclick="PF('pc').capture()" onerror="location.reload(true);" />
</p:dialog>
......@@ -80,103 +78,99 @@
</h:form>
<h:form>
<h:panelGrid columns="2" columnClasses="topalign,topalign">
<h:panelGroup>
<table>
<ui:fragment rendered="#{!cc.attrs.creating}">
<tr>
<td colspan="2"><b><h:outputLabel for="login" value="#{i18n['user.login']}" /></b><br />
<h:outputText value="#{userView.selectedUser.login}" id="login" />
</td>
<td colspan="2"><b><h:outputLabel for="login" value="#{i18n['user.login']}" /></b><br /> <h:outputText value="#{userView.selectedUser.login}" id="login" /></td>
</tr>
</ui:fragment>
<tr>
<td colspan="2"><b><h:outputLabel value="#{i18n['user.nick']}" for="nick" /> </b><br />
<p:inplace emptyLabel="#{i18n['user.insert']}">
<td colspan="2"><b><h:outputLabel value="#{i18n['user.nick']}" for="nick" /> </b><br /> <p:inplace emptyLabel="#{i18n['user.insert']}">
<p:inputText size="45" id="nick" disabled="#{!cc.attrs.creating and !userView.canSave}" value="#{userView.selectedUser.nick}" />
</p:inplace>
</td>
</p:inplace></td>
</tr>
<tr>
<td><b><h:outputLabel value="#{i18n['user.firstNames']}" for="firstnames" /></b><br />
<p:inplace emptyLabel="#{i18n['user.insert']}">
<td><b><h:outputLabel value="#{i18n['user.firstNames']}" for="firstnames" /></b><br /> <p:inplace emptyLabel="#{i18n['user.insert']}">
<p:inputText size="22" id="firstnames" disabled="#{!cc.attrs.creating and !userView.canSave}" value="#{userView.selectedUser.firstnames}" />
</p:inplace>
</td>
<td><b><h:outputLabel value="#{i18n['user.lastName']}" for="lastname" /></b><br />
<p:inplace emptyLabel="#{i18n['user.insert']}">
</p:inplace></td>
<td><b><h:outputLabel value="#{i18n['user.lastName']}" for="lastname" /></b><br /> <p:inplace emptyLabel="#{i18n['user.insert']}">
<p:inputText size="30" id="lastname" disabled="#{!cc.attrs.creating and !userView.canSave}" value="#{userView.selectedUser.lastname}" />
</p:inplace>
</td>
</p:inplace></td>
</tr>
<tr>
<td colspan="2"><b><h:outputLabel value="#{i18n['user.sex']}" for="sex" /></b> <br />
<p:selectOneMenu disabled="#{!cc.attrs.creating and !userView.canSave}" id="sex" value="#{userView.selectedUser.gender}">
<td colspan="2"><b><h:outputLabel value="#{i18n['user.sex']}" for="sex" /></b> <br /> <p:selectOneMenu disabled="#{!cc.attrs.creating and !userView.canSave}" id="sex" value="#{userView.selectedUser.gender}">
<f:selectItem id="undefined" itemLabel="#{i18n['user.sex.UNDEFINED']}" itemValue="UNDEFINED" />
<f:selectItem id="male" itemLabel="#{i18n['user.sex.MALE']}" itemValue="MALE" />
<f:selectItem id="female" itemLabel="#{i18n['user.sex.FEMALE']}" itemValue="FEMALE" />
</p:selectOneMenu>
</td>
</p:selectOneMenu></td>
</tr>
<tr>
<td><b><h:outputLabel for="birthday" value="#{i18n['user.birthday']}" /></b><br />
<p:inplace emptyLabel="#{i18n['user.insert']}">
<td><b><h:outputLabel for="birthday" value="#{i18n['user.birthday']}" /></b><br /> <p:inplace emptyLabel="#{i18n['user.insert']}">
<p:calendar id="birthday" navigator="true" yearRange="c-80:c-0" value="#{userView.selectedUser.birthday}">
<f:convertDateTime pattern="#{sessionHandler.dateFormat}" timeZone="#{sessionHandler.timezone}" />
</p:calendar>
</p:inplace> <h:message for="birthday" />
</td>
<td><b><h:outputLabel for="age" value="#{i18n['user.age']}" /></b><br />
<h:outputText value="#{userView.selectedUser.user.age}">
<f:convertNumber minFractionDigits="2" maxFractionDigits="2"/>
</h:outputText>
</td>
</p:inplace> <h:message for="birthday" /></td>
<td><b><h:outputLabel for="age" value="#{i18n['user.age']}" /></b><br /> <h:outputText value="#{userView.selectedUser.user.age}">
<f:convertNumber minFractionDigits="2" maxFractionDigits="2" />
</h:outputText></td>
</tr>
</table>
<table>
<tr>
<td colspan="2"><b><p:outputLabel value="#{i18n['user.address']}" for="address" /></b><br />
<p:inplace emptyLabel="#{i18n['user.insert']}">
<td colspan="2"><b><p:outputLabel value="#{i18n['user.address']}" for="address" /></b><br /> <p:inplace emptyLabel="#{i18n['user.insert']}">
<p:inputText size="45" id="address" disabled="#{!cc.attrs.creating and !userView.canSave}" value="#{userView.selectedUser.address}" />
</p:inplace>
</td>
</p:inplace></td>
</tr>
<tr>
<td><b><p:outputLabel value="#{i18n['user.zipCode']}" for="zip" /></b><br />
<p:inplace emptyLabel="#{i18n['user.insert']}">
<td><b><p:outputLabel value="#{i18n['user.zipCode']}" for="zip" /></b><br /> <p:inplace emptyLabel="#{i18n['user.insert']}">
<p:inputText styleClass="ui-input" size="7" id="zip" disabled="#{!cc.attrs.creating and !userView.canSave}" value="#{userView.selectedUser.zip}" />
</p:inplace> <p:message for="zip" />
</td>
<td><b><p:outputLabel value="#{i18n['user.town']}" for="town" /></b><br />
<p:inplace emptyLabel="#{i18n['user.insert']}">
</p:inplace> <p:message for="zip" /></td>
<td><b><p:outputLabel value="#{i18n['user.town']}" for="town" /></b><br /> <p:inplace emptyLabel="#{i18n['user.insert']}">
<p:inputText styleClass="ui-input" size="25" id="town" disabled="#{!cc.attrs.creating and !userView.canSave}" value="#{userView.selectedUser.town}" />
</p:inplace> <p:message for="town" />
</td>
</p:inplace> <p:message for="town" /></td>
</tr>
<tr>
<td colspan="2"><b><h:outputLabel value="#{i18n['user.email']}" for="email" /></b> <br />
<p:inplace emptyLabel="#{i18n['user.insert']}">
<td colspan="2"><b><h:outputLabel value="#{i18n['user.email']}" for="email" /></b> <br /> <p:inplace emptyLabel="#{i18n['user.insert']}">
<p:inputText validator="#{userValidator.validateEmail}" size="45" id="email" disabled="#{!cc.attrs.creating and !userView.canSave}" value="#{userView.selectedUser.email}" />
</p:inplace>
</td>
</p:inplace></td>
</tr>
<tr>
<td><b><p:outputLabel value="#{i18n['user.phone']}" for="phone" /></b><br />
<p:inplace emptyLabel="#{i18n['user.insert']}">
<td><b><p:outputLabel value="#{i18n['user.phone']}" for="phone" /></b><br /> <p:inplace emptyLabel="#{i18n['user.insert']}">
<p:inputText styleClass="ui-input" size="7" id="phone" disabled="#{!cc.attrs.creating and !userView.canSave}" value="#{userView.selectedUser.phone}" />
</p:inplace> <p:message for="phone" />
</td>
</p:inplace> <p:message for="phone" /></td>
</tr>
</table>
<p:commandButton rendered="#{cc.attrs.creating or userView.canSave}" id="commitbtn" action="#{cc.attrs.commitaction}" ajax="false" value="#{cc.attrs.commitvalue}" onerror="location.reload(true);"/>
<p:commandButton rendered="#{cc.attrs.creating or userView.canSave}" id="commitbtn" action="#{cc.attrs.commitaction}" ajax="false" value="#{cc.attrs.commitvalue}" onerror="location.reload(true);" />
</h:panelGroup>
<h:panelGroup rendered="#{userView.showUserSelectableRoles and cc.attrs.showRoles}">
<h2>
<h:outputText value="#{i18n['user.userSelectableRoles']}:" />
</h2>
<p:selectManyCheckbox converter="#{roleConverter}" layout="pageDirection" value="#{userView.userSelectableRoles}">
<f:selectItems value="#{roleDataView.userSelectableRoles}" var="roleitem" itemLabel="#{roleitem.name}" itemValue="#{roleitem}" />
</p:selectManyCheckbox>
<div>
<h:message rendered="#{roleView.canReadRoles}" for="roles" />
</div>
<h:commandButton action="#{userView.saveUserSelectableRoles}" value="#{i18n['user.saveUserSelectableRoles']}" />
</h:panelGroup>
</h:panelGrid>
</h:form>
</h:panelGrid>
</composite:implementation>
</html>
......
......@@ -206,3 +206,15 @@ th, td {
padding-left: 10px;
padding-top: 10px;
}
.topalign {
vertical-align: top;
padding-left: 20px;
}
.messagebox {
border: 1px red solid;
padding-left: 20px;
padding-right: 20px;
padding-bottom: 20px;
}
......@@ -14,7 +14,7 @@
<h1>#{i18n['user.edit.title']}</h1>
</ui:define>
<ui:define name="content">
<users:edit commitaction="#{userView.saveUser()}" commitvalue="#{i18n['user.save']}" />
<users:edit commitaction="#{userView.saveUser()}" commitvalue="#{i18n['user.save']}" showRoles="true" />
</ui:define>
</ui:composition>
</h:body>
......
......@@ -116,17 +116,14 @@ cardTemplate.emptyCardTemplate = ----
code.inputfield = Sy\u00F6t\u00E4 viivakoodi
create = Luo
delete = Poista
create = Luo
edit = Muokkaa
error = Virhe
error.contact = If this happens again, contact Info with the following code:
error.error = You have encountered an error.
......@@ -208,6 +205,7 @@ lecture.availableLectures = Aihealueen kurssit ja luennot
lecture.createLecture = Uuden tiedot
lecture.createNew = Luo uusi
lecture.description = Kuvaus
lecture.full = Kurssi t\u00E4ynn\u00E4
lecture.groupFull = Kiinti\u00F6 t\u00E4ynn\u00E4
lecture.hours = Kesto, tunteja
lecture.maxParticipantsCount = Max. osallistujia
......@@ -215,6 +213,8 @@ lecture.multicreate = Luo monta putkeen
lecture.name = Nimi
lecture.participants = Osallistujia
lecture.participate = Ilmoittaudu
lecture.participateNotActive.message = Voit ilmoittautua kursseille kun olet ostanut lipun tapahtumaan
lecture.participateNotActive.title = Osta ensiksi p\u00E4\u00E4sylippu
lecture.participatedLectures = Kurssi-ilmoittautumisesi
lecture.roles = Roolit
lecture.saveLecture = Muokkaa
......@@ -253,7 +253,6 @@ navi.auth.login = frontpage
navi.auth.loginerror = frontpage
navi.auth.logout = frontpage
off = Poissa
on = P\u00E4\u00E4ll\u00E4
......@@ -294,6 +293,8 @@ productshop.plusTen = +10
reader.autopoll = Jatkuva lukijan seuraaminen
refresh = P\u00E4ivit\u00E4
registerleaflet.title = Rekisteriseloste
resetMail.header = Reset lost password
......@@ -302,43 +303,40 @@ resetMail.username = Username
resetmailSent.body = Email has been sent containing a link where you can change the password.
resetmailSent.header = Email sent
save = Tallenna
role.userSelectableRole = K\u00E4ytt\u00E4j\u00E4n valittavissaoleva rooli
roleView.adduser = Lis\u00E4\u00E4 k\u00E4ytt\u00E4j\u00E4
roleView.hidePermissioneditor = Piilota oikeusasetukset
roleView.members = K\u00E4ytt\u00E4j\u00E4t
roleView.showPermissioneditor = N\u00E4yt\u00E4 oikeusasetukset
save = Tallenna
submenu.NotImplementedYet = Not implemented
submenu.admin.adduser = K\u00E4ytt\u00E4j\u00E4nlis\u00E4ys
submenu.admin.adduser.index = K\u00E4ytt\u00E4j\u00E4nlis\u00E4ys
submenu.frontpage = Frontpage
submenu.info.incoming = Sis\u00E4\u00E4ntulo
submenu.info.index = Infon\u00E4kym\u00E4
submenu.info.shop = Kauppa
submenu.info.index = Infon\u00E4kym\u00E4
= Infon\u00E4kym\u00E4
submenu.lectureadmin.lectureParticipants = Tarkastele osallistujia
submenu.lectureadmin.manageLectureGroups = Hallinnoi
submenu.lectures.viewLectures = Ilmoittaudu
subnavi.cards = \u0009\u0009
subnavi.info = Info
success = Onnistui
topnavi.adminlectures = Kurssit ja luennot
topnavi.license = Lisenssikoodit
topnavi.userlectures = Kurssit ja luennot
user.cropImage = Crop
user.imageUpload.imageNotFound = Select image to upload
user.saveUserSelectableRoles = Tallenna
user.unauthenticated = Kirjautumaton
user.userSelectableRoles = Valitse yksi
usercart.downloadCsv = CSV
usercart.showoverview = Vie tarkastusn\u00E4kym\u00E4\u00E4n
......
......@@ -284,11 +284,9 @@ compofile.uploadTime = Upload time
content.showContentEditLinks = Show content edit links
delete = Delete
create = Create
delete = Delete
discount.active = Active
discount.amountMax = Max amount
......@@ -559,6 +557,7 @@ lecture.availableLectures = available lectures
lecture.createLecture = New lecture
lecture.createNew = Create new
lecture.description = Description
lecture.full = Lecture full
lecture.groupFull = Limit reached
lecture.hours = Duration hours
lecture.maxParticipantsCount = Max participants
......@@ -566,6 +565,8 @@ lecture.multicreate = Create multible in row
lecture.name = Name
lecture.participants = Participants
lecture.participate = Participate
lecture.participateNotActive.message = You can participate to lectures when you have bought a ticket to event.
lecture.participateNotActive.title = Buy tickets before participating
lecture.participatedLectures = Your lectures
lecture.roles = Roles
lecture.saveLecture = Edit
......@@ -940,6 +941,8 @@ readerevent.tagname = Tag
readerview.cards = Card ( printcount )
refresh = Refresh
registerleaflet.title = Register leaflet
rejectcard.body = Body
......@@ -977,9 +980,14 @@ role.parents = Parents
role.permissionheader = Role permissions
role.read = (R)
role.savePermissions = Save permissions
role.userSelectableRole = User selectable role
role.write = (W)
roleView.adduser = Add user
roleView.hidePermissioneditor = Hide permissioneditor
roleView.members = Users
roleView.save = Save changes
roleView.showPermissioneditor = Show permissioneditor
salespoint.edit = Edit
salespoint.name = Name
......@@ -1058,7 +1066,6 @@ sitepage.save = Save
sitepagelist.header = Site pages
submenu.NotImplementedYet = Not implemented
submenu.actionlog.messagelist = ActionLog
submenu.actionlog.taskview = View tasks
......@@ -1093,6 +1100,9 @@ submenu.index = Frontpage
submenu.info.incoming = Incomingview
submenu.info.index = Infoview
submenu.info.shop = Shop
submenu.lectureadmin.lectureParticipants = Lecture participants
submenu.lectureadmin.manageLectureGroups = Management
submenu.lectures.viewLectures = Participate
submenu.license.manageCodes = Manage codes
submenu.license.viewCodes = View codes
submenu.map.create = Create map
......@@ -1150,11 +1160,6 @@ submenu.voting.create = Create new compo
submenu.voting.myEntries = My entries
submenu.voting.submitEntry = Submit entry
submenu.lectureadmin.manageLectureGroups = Management
submenu.lectures.viewLectures = Participate
subnavi.billing = Billing
subnavi.cards = Cards
subnavi.info = Info
......@@ -1392,6 +1397,7 @@ user.save = Save
user.saveFailed = Save failed, Not enough permissions!
user.saveRoles = Save roles
user.saveSuccessfull = Changes saved successfully
user.saveUserSelectableRoles = Save
user.search = Search
user.searchUser = Search user
user.sendPicture = Send image
......@@ -1406,6 +1412,7 @@ user.superadmin = Superadmin
user.thisIsCurrentImage = Current image
user.town = City
user.uploadimage = Send image
user.userSelectableRoles = Select one
user.username = Username
user.validate.notUniqueUsername = Username already exists. Please select another.
user.validateUser.commit = Send
......
......@@ -197,7 +197,6 @@ card.massprint.title = Tulosta kaikki
cardCode.code = Koodi
cardCode.type = Tyyppi
cardObjectData.create = Liit\u00E4 kuvia
cardObjectData.edit = Muokkaa
cardObjectData.save = Tallenna
......@@ -286,11 +285,9 @@ compofile.uploadTime = Tallennusaika
content.showContentEditLinks = N\u00E4yt\u00E4 sis\u00E4ll\u00F6nmuokkauslinkit
delete = Poista
create = Luo
delete = Poista
discount.active = Aktiivinen
discount.amountMax = Enimm\u00E4ism\u00E4\u00E4r\u00E4
......@@ -570,6 +567,7 @@ lecture.availableLectures = Aihealueen kurssit ja luennot
lecture.createLecture = Uuden tiedot
lecture.createNew = Luo uusi
lecture.description = Kuvaus
lecture.full = Kurssi t\u00E4ynn\u00E4
lecture.groupFull = Kiinti\u00F6 t\u00E4ynn\u00E4
lecture.hours = Kesto tunteina
lecture.maxParticipantsCount = Osallistujia enint.
......@@ -577,6 +575,8 @@ lecture.multicreate = Luo monta putkeen
lecture.name = Nimi
lecture.participants = Osallistujia
lecture.participate = Ilmoittaudu
lecture.participateNotActive.message = Voit ilmoittautua kursseille vasta kun olet ostanut lipun tapahtumaan. Osta lippu valitsemalla vasemmalta Kauppa -> Osta tuotteita.
lecture.participateNotActive.title = Aloita ostamalla lippu tapahtumaan
lecture.participatedLectures = Ilmoittautumisesi
lecture.roles = Roolit
lecture.saveLecture = Muokkaa
......@@ -696,10 +696,8 @@ newsgroup.writerRole = Kirjoittajaryhm\u00E4
newslist.header = Uutisryhm\u00E4t
off = Poissa
on = P\u00E4\u00E4ll\u00E4
org.hibernate.validator.constraints.Email.message = V\u00E4\u00E4rin muotoiltu s\u00E4hk\u00F6postiosoite
......@@ -928,6 +926,8 @@ readerevent.tagname = Tagi
readerview.cards = Kortit ( tulostuslkm )
refresh = P\u00E4ivit\u00E4
registerleaflet.title = Rekisteriseloste
rejectcard.body = Viestin sis\u00E4lt\u00F6
......@@ -963,8 +963,13 @@ role.name = Nimi
role.parents = Periytyy
role.permissionheader = Roolin oikeudet
role.savePermissions = Tallenna oikeudet
role.userSelectableRole = K\u00E4ytt\u00E4j\u00E4n valittavissaoleva rooli
roleView.adduser = Lis\u00E4\u00E4 k\u00E4ytt\u00E4j\u00E4
roleView.hidePermissioneditor = Piilota oikeusasetukset
roleView.members = K\u00E4ytt\u00E4j\u00E4t
roleView.save = Tallenna muutokset
roleView.showPermissioneditor = N\u00E4yt\u00E4 oikeusasetukset
salespoint.edit = Muokkaa
salespoint.name = Nimi
......@@ -1041,7 +1046,6 @@ sitepage.save = Tallenna
sitepagelist.header = Sivuston sis\u00E4ll\u00F6t
submenu.NotImplementedYet = Toteuttamatta
submenu.actionlog.messagelist = ActionLog
submenu.actionlog.taskview = N\u00E4yt\u00E4 toiminnat
......@@ -1076,6 +1080,9 @@ submenu.index = Etusivu
submenu.info.incoming = Sis\u00E4\u00E4ntulo
submenu.info.index = Infon\u00E4kym\u00E4
submenu.info.shop = Kauppa
submenu.lectureadmin.lectureParticipants = Kurssiosallistujat
submenu.lectureadmin.manageLectureGroups = Hallinnoi
submenu.lectures.viewLectures = Ilmoittaudu
submenu.license.manageCodes = Hallinnoi lisenssej\u00E4
submenu.license.viewCodes = N\u00E4yt\u00E4 koodit
submenu.map.create = Uusi kartta
......@@ -1136,11 +1143,6 @@ submenu.voting.create = Uusi kilpailu
submenu.voting.myEntries = Omat entryt
submenu.voting.submitEntry = L\u00E4het\u00E4 entry
submenu.lectureadmin.manageLectureGroups = Hallinnoi
submenu.lectures.viewLectures = Ilmoittaudu
subnavi.billing = Laskutus
subnavi.cards = Kortit
subnavi.info = Info
......@@ -1376,6 +1378,7 @@ user.roles = Roolit
user.rolesave = Tallenna roolit
user.save = Tallenna
user.saveRoles = Tallenna roolit
user.saveUserSelectableRoles = Tallenna
user.search = Hae
user.searchUser = Hae k\u00E4ytt\u00E4j\u00E4\u00E4
user.sendPicture = Kuvan l\u00E4hetys
......@@ -1390,6 +1393,7 @@ user.superadmin = Superadmin
user.thisIsCurrentImage = Nykyinen kuva
user.town = Kaupunki
user.uploadimage = L\u00E4het\u00E4 kuva
user.userSelectableRoles = Valitse yksi
user.username = K\u00E4ytt\u00E4j\u00E4tunnus
user.validate.notUniqueUsername = K\u00E4ytt\u00E4j\u00E4tunnus on jo olemassa. Ole hyv\u00E4 ja valitse toinen tunnus
user.validateUser.commit = L\u00E4het\u00E4
......
......@@ -121,6 +121,7 @@ public class AuthView extends GenericCDIView {
HttpServletRequest request = getRequest();
if (request.getUserPrincipal() != null) {
logger.info("Principal not empty. need to logout first");
try {
......
......@@ -54,4 +54,8 @@ public class RoleDataView extends GenericCDIView {
}
return roles;
}
public List<Role> getUserSelectableRoles() {
return rolebean.listUserSelectableRoles();
}
}
......@@ -94,6 +94,9 @@ public class UserView extends GenericCDIView {
private transient CardTemplateBeanLocal cardBean;
private List<Role> usersRoles;
private List<Role> userSelectableRoles = null;
@EJB
private transient RoleBeanLocal rolebean;
@EJB
......@@ -161,7 +164,7 @@ public class UserView extends GenericCDIView {
/**
* This is the user we are currently editing, if that is not found we user
* This is the user we are currently editing, if that is not found we use
* current user
*
* @return
......@@ -188,6 +191,17 @@ public class UserView extends GenericCDIView {
return null;
}
public List<Role> getUserSelectableRoles() {
if (userSelectableRoles == null && user != null)
{
userSelectableRoles = rolebean.getRoles(getSelectedUser());
}
return userSelectableRoles;
}
public List<Role> getUsersRoles() {
if (usersRoles == null && user != null)
{
......@@ -327,6 +341,12 @@ public class UserView extends GenericCDIView {
}
public String saveUser() {
if(userSelectableRoles != null) {
saveUserSelectableRoles();
}
logger.info("Saving user");
if (permbean.getCurrentUser().equals(user) || permbean.hasPermission(UserPermission.MODIFY)) {
......@@ -482,6 +502,10 @@ public class UserView extends GenericCDIView {
this.usersRoles = usersRoles;
}
public void setUserSelectableRoles(List<Role> usersRoles) {
this.userSelectableRoles = usersRoles;
}
public String getUsername() {
return username;
}
......@@ -532,4 +556,25 @@ public class UserView extends GenericCDIView {
public void setLayoutview(LayoutView layoutview) {
this.layoutview = layoutview;
}
public String saveUserSelectableRoles()
{
rolebean.saveUserSelectableRoles(user, userSelectableRoles);
userSelectableRoles = null;
return null;
}
public boolean isShowUserSelectableRoles() {
return (rolebean.listUserSelectableRoles().size() >= 1);
}
}
package fi.codecrew.moya.web.lecture;
import java.util.List;
import javax.ejb.EJB;
import javax.enterprise.context.ConversationScoped;
import javax.faces.model.ListDataModel;
import javax.inject.Inject;
import javax.inject.Named;
import fi.codecrew.moya.beans.EventBeanLocal;
import fi.codecrew.moya.beans.LectureBeanLocal;
import fi.codecrew.moya.enums.apps.LecturePermission;
import fi.codecrew.moya.model.Lecture;
import fi.codecrew.moya.model.LectureGroup;
import fi.codecrew.moya.web.cdiview.GenericCDIView;
import fi.codecrew.moya.web.cdiview.user.UserView;
@Named
@ConversationScoped
public class LectureReportsView extends GenericCDIView {
private static final long serialVersionUID = 1L;
@Inject
UserView userView;
@EJB
LectureBeanLocal lectureBean;
@EJB
EventBeanLocal eventBean;
ListDataModel<LectureGroup> lectureGroups = null;
ListDataModel<Lecture> lectures = null;
ListDataModel<Lecture> participatedLectures = null;
LectureGroup currentLectureGroup;
public void initView() {
if (super.requirePermissions(LecturePermission.MANAGE)) {
super.beginConversation();
}
}
public void refresh() {
this.lectures = null;
}
public boolean isLectureGroupsVisible() {
if(lectureBean.getLectureGroups().size() <= 1)
return false;
return true;
}
public ListDataModel<LectureGroup> getLectureGroups() {
lectureGroups = new ListDataModel<LectureGroup>(lectureBean.getLectureGroups());
return lectureGroups;
}
public void selectCurrentLectureGroup() {
if (lectureGroups != null && lectureGroups.isRowAvailable()) {
currentLectureGroup = lectureGroups.getRowData();
lectures = null;
}
}
public LectureGroup getCurrentLectureGroup() {
List<LectureGroup> groups = lectureBean.getLectureGroups();
if (currentLectureGroup == null && groups.size() > 0) {
currentLectureGroup = groups.get(0);
}
return currentLectureGroup;
}
public ListDataModel<Lecture> getLectures() {
if (currentLectureGroup == null)
return new ListDataModel<Lecture>();
if(lectures == null)
lectures = new ListDataModel<Lecture>(lectureBean.getLecturesByLectureGroup(getCurrentLectureGroup()));
return lectures;
}
public int getCurrentGroupParticipateCount() {
return lectureBean.userLectureSelects(getCurrentLectureGroup(), userView.getCurrentUser());
}
}
......@@ -10,6 +10,7 @@ import javax.inject.Named;
import fi.codecrew.moya.beans.EventBeanLocal;
import fi.codecrew.moya.beans.LectureBeanLocal;
import fi.codecrew.moya.beans.UserBeanLocal;
import fi.codecrew.moya.enums.apps.LecturePermission;
import fi.codecrew.moya.model.Lecture;
import fi.codecrew.moya.model.LectureGroup;
......@@ -31,6 +32,7 @@ public class LectureUserView extends GenericCDIView {
@EJB
EventBeanLocal eventBean;
ListDataModel<LectureGroup> lectureGroups = null;
ListDataModel<Lecture> lectures = null;
ListDataModel<Lecture> participatedLectures = null;
......@@ -50,6 +52,10 @@ public class LectureUserView extends GenericCDIView {
return true;
}
public boolean isParticipateActive() {
return lectureBean.isUserCanParticipate(userView.getCurrentUser());
}
public ListDataModel<LectureGroup> getLectureGroups() {
lectureGroups = new ListDataModel<LectureGroup>(lectureBean.getLectureGroups());
......@@ -78,6 +84,7 @@ public class LectureUserView extends GenericCDIView {
if (currentLectureGroup == null)
return new ListDataModel<Lecture>();
if(lectures == null)
lectures = new ListDataModel<Lecture>(lectureBean.findAvailableLectures(getCurrentLectureGroup(), userView.getCurrentUser()));
return lectures;
......@@ -90,6 +97,9 @@ public class LectureUserView extends GenericCDIView {
}
public void participateCurrent() {
if(!isParticipateActive()) {
return;
}
if (lectures != null && lectures.isRowAvailable()) {
Lecture lecture = lectures.getRowData();
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!