Commit 47fe7561 by Tuukka Kivilahti

Merge branch 'feature-permissions' into 'master'

Add ui for event features

See merge request !420
2 parents 9edc31eb 45ffea81
......@@ -23,6 +23,15 @@ public class EventFeature extends GenericEntity {
@Column(name = FEATURE_COLUMN, nullable = false)
private MoyaFeature feature;
public EventFeature(){
super();
}
public EventFeature(LanEvent event, MoyaFeature moyaFeature) {
super();
this.event = event;
this.feature = moyaFeature;
}
public LanEvent getEvent() {
return event;
}
......
......@@ -29,6 +29,16 @@ public class EventRoleFeature extends GenericEntity {
@Column(nullable = false, name = "admin_permission")
private boolean admin = false;
public EventRoleFeature() {
super();
}
public EventRoleFeature(Role role, MoyaFeature f) {
super();
this.role = role;
this.feature = f;
}
public LocalDateTime getCreated() {
return created;
......
......@@ -22,6 +22,7 @@ import java.beans.Transient;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;
import javax.persistence.CascadeType;
import javax.persistence.Column;
......@@ -400,6 +401,15 @@ public class LanEvent extends GenericEntity {
this.features = features;
}
// Helper for storing and fetching features, as enum strings
public List<String> getStringFeatures(){
return features.stream().map(f -> f.getFeature().name()).collect(Collectors.toList());
}
public void setStringFeatures(List<String> strings){
features = strings.stream().map(str -> features.stream().filter(f -> f.getFeature().name().equals(str)).findFirst().orElse(new EventFeature(this, MoyaFeature.valueOf(str)))).collect(Collectors.toList());
}
// public List<Vip> getVips() {
// return vips;
// }
......
......@@ -49,12 +49,16 @@ public enum MoyaFeature {
*/
POLLS,
FOODWAVES,
BBADGES,
BADGES,
/**
* Most events have some content added on the pages
* - User: View content
* - Org: No special permissions
* - Admin: Manage and create content
*/
SITE
SITE;
public String getI18nKey() {
return "moyaFeature." + name();
}
}
......@@ -105,7 +105,7 @@ public class Role extends GenericEntity {
@ManyToMany(mappedBy = "openForRoles")
private List<Lecture> lectures = new ArrayList<Lecture>();
@OneToMany(mappedBy="role")
@OneToMany(mappedBy="role", cascade = CascadeType.ALL)
@PrivateOwned
private List<EventRoleFeature> features = new ArrayList<>();
......
......@@ -71,6 +71,13 @@
</p:selectOneMenu>
<p:message for="defaultrole" />
<p:outputLabel for="eventFeatures" value="#{i18n['event.features']}"/>
<p:selectManyCheckbox layout="pageDirection" id="eventFeatures" value="#{eventorgView.event.stringFeatures}">
<f:selectItems value="#{eventorgView.allFeatures}" var="feature" itemValue="#{feature.name()}" itemLabel="#{i18n[feature.i18nKey]}" />
</p:selectManyCheckbox>
<p:message for="eventFeatures" />
</p:panelGrid>
<p:commandButton id="commitbtn" actionListener="#{eventorgView.saveEvent()}" value="#{i18n['event.save']}" ajax="false" />
</p:fieldset>
......
<?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"
<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">
......@@ -14,18 +15,56 @@
<p>
<h:form id="roleform">
<f:facet name="errorMessage">
<h:outputText value="#{i18n['nasty.user']}" />
<h:outputText value="#{i18n['nasty.user']}"/>
</f:facet>
<ui:include src="form.xhtml" />
<h:commandButton rendered="#{roleView.canWriteRoles}" id="saverole" value="#{i18n['roleView.save']}" action="#{roleView.save}" />
<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"
value="#{roleView.role.parents}">
<f:selectItems var="par" itemLabel="#{par.name}" value="#{roleView.possibleParents}"/>
</h:selectManyCheckbox>
<h:outputLabel value="#{i18n['role.cardtemplate']}"/>
<h:selectOneMenu converter="#{cardTemplateConverter}" value="#{roleView.role.cardTemplate}">
<f:selectItems var="role" itemLabel="#{role.name}" value="#{cardView.templatesWithNull}"/>
</h:selectOneMenu>
<h:outputText value="#{i18n['role.permissions']}"></h:outputText>
<p:dataTable style="width: auto" value="#{roleView.role.features}" var="feature">
<p:column headerText="#{i18n['feature.name']}">
<h:outputText value="#{feature.feature.name()}"/>
</p:column>
<p:column headerText="#{i18n['feature.user_permission']}">
<p:selectBooleanCheckbox value="#{feature.user}" />
</p:column>
<p:column headerText="#{i18n['feature.info_permission']}">
<p:selectBooleanCheckbox value="#{feature.info}" />
</p:column>
<p:column headerText="#{i18n['feature.admin_permission']}">
<p:selectBooleanCheckbox value="#{feature.admin}" />
</p:column>
</p:dataTable>
</h:panelGrid>
<h:commandButton rendered="#{roleView.canWriteRoles}" id="saverole" value="#{i18n['roleView.save']}" action="#{roleView.save}"/>
</h:form>
</p>
<h:form id="addmember">
<h:outputText value="#{i18n['roleView.adduser']}" />
<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:ajax onerror="location.reload(true);" update=":editor:addmember,:editor:memberlist" event="itemSelect" listener="#{roleView.addUser}" />
<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>
......@@ -35,44 +74,45 @@
<p:dataTable id="memberlist" value="#{roleView.role.users}" var="usr">
<p:column>
<h:outputText value="#{usr.login}" />
<h:outputText value="#{usr.login}"/>
</p:column>
<p:column>
<h:outputText value="#{usr.nick}" />
<h:outputText value="#{usr.nick}"/>
</p:column>
<p:column>
<h:outputText value="#{usr.wholeName}" />
<h:outputText value="#{usr.wholeName}"/>
</p:column>
<p:column>
<h:outputText value="#{usr.email}" />
<h:outputText value="#{usr.email}"/>
</p:column>
</p:dataTable>
</p:fieldset>
<h2>Old permissions</h2>
<p:fieldset legend="#{i18n['role.permissionheader']}" toggleable="true" collapsed="true">
<h:form id="permissionform">
<h:commandButton id="save1" value="#{i18n['role.savePermissions']}" action="#{roleView.savePermissions}" />
<h:commandButton id="save1" value="#{i18n['role.savePermissions']}" action="#{roleView.savePermissions}"/>
<h:dataTable border="1" id="bortalApps" value="#{roleView.rolePermissions}" var="bapp">
<h:column>
<f:facet name="header">
<h:outputText value="#{i18n['applicationPermission.name']}" />
<h:outputText value="#{i18n['applicationPermission.name']}"/>
</f:facet>
<h:outputText value="#{bapp.name}" />
<h:outputText value="#{bapp.name}"/>
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="#{i18n['applicationPermission.description']}" />
<h:outputText value="#{i18n['applicationPermission.description']}"/>
</f:facet>
<h:outputText value="#{i18n[bapp.key]}" />
<h:outputText value="#{i18n[bapp.key]}"/>
</h:column>
<h:column>
<h:selectManyCheckbox id="permissions" layout="pageDirection" value="#{bapp.selected}">
<f:selectItems value="#{bapp.permissions}" var="per" itemLabel="#{i18n[per.i18nKey]}" />
<f:selectItems value="#{bapp.permissions}" var="per" itemLabel="#{i18n[per.i18nKey]}"/>
</h:selectManyCheckbox>
</h:column>
</h:dataTable>
<h:commandButton id="save2" value="#{i18n['role.savePermissions']}" action="#{roleView.savePermissions}" />
<h:commandButton id="save2" value="#{i18n['role.savePermissions']}" action="#{roleView.savePermissions}"/>
</h:form>
</p:fieldset>
......
......@@ -19,6 +19,7 @@
package fi.codecrew.moya.web.cdiview.organisation;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import javax.ejb.EJB;
......@@ -329,5 +330,10 @@ public class EventOrgView extends GenericCDIView {
return permbean.getCurrentUser().isSuperadmin();
}
public List<MoyaFeature> getAllFeatures() {
return Arrays.asList(MoyaFeature.values());
}
}
......@@ -122,6 +122,16 @@ public class RoleView extends GenericCDIView {
private void initPermissions() {
// New way
role.setFeatures(Arrays.asList(MoyaFeature.values()).stream()
.map(f -> role.getFeatures().stream()
.filter(rf -> rf.getFeature().equals(f))
.findFirst()
.orElse(new EventRoleFeature(role, f)))
.sorted(Comparator.comparing(EventRoleFeature::getFeature))
.collect(Collectors.toList()));
// Old way...
logger.info("Initializing permissions for role {}", role);
EnumMap<BortalApplication, Set<IAppPermission>> rolePermissionMap = new EnumMap<BortalApplication, Set<IAppPermission>>(BortalApplication.class);
if (role.getPermissions() == null) {
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!