Commit 45ffea81 by Tuomas Riihimäki

Add ui for event features

1 parent 3239b824
Pipeline #103 failed
in 0 seconds
...@@ -23,6 +23,15 @@ public class EventFeature extends GenericEntity { ...@@ -23,6 +23,15 @@ public class EventFeature extends GenericEntity {
@Column(name = FEATURE_COLUMN, nullable = false) @Column(name = FEATURE_COLUMN, nullable = false)
private MoyaFeature feature; private MoyaFeature feature;
public EventFeature(){
super();
}
public EventFeature(LanEvent event, MoyaFeature moyaFeature) {
super();
this.event = event;
this.feature = moyaFeature;
}
public LanEvent getEvent() { public LanEvent getEvent() {
return event; return event;
} }
......
...@@ -29,6 +29,16 @@ public class EventRoleFeature extends GenericEntity { ...@@ -29,6 +29,16 @@ public class EventRoleFeature extends GenericEntity {
@Column(nullable = false, name = "admin_permission") @Column(nullable = false, name = "admin_permission")
private boolean admin = false; private boolean admin = false;
public EventRoleFeature() {
super();
}
public EventRoleFeature(Role role, MoyaFeature f) {
super();
this.role = role;
this.feature = f;
}
public LocalDateTime getCreated() { public LocalDateTime getCreated() {
return created; return created;
......
...@@ -22,6 +22,7 @@ import java.beans.Transient; ...@@ -22,6 +22,7 @@ import java.beans.Transient;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
import java.util.stream.Collectors;
import javax.persistence.CascadeType; import javax.persistence.CascadeType;
import javax.persistence.Column; import javax.persistence.Column;
...@@ -400,6 +401,15 @@ public class LanEvent extends GenericEntity { ...@@ -400,6 +401,15 @@ public class LanEvent extends GenericEntity {
this.features = features; 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() { // public List<Vip> getVips() {
// return vips; // return vips;
// } // }
......
...@@ -49,12 +49,16 @@ public enum MoyaFeature { ...@@ -49,12 +49,16 @@ public enum MoyaFeature {
*/ */
POLLS, POLLS,
FOODWAVES, FOODWAVES,
BBADGES, BADGES,
/** /**
* Most events have some content added on the pages * Most events have some content added on the pages
* - User: View content * - User: View content
* - Org: No special permissions * - Org: No special permissions
* - Admin: Manage and create content * - Admin: Manage and create content
*/ */
SITE SITE;
public String getI18nKey() {
return "moyaFeature." + name();
}
} }
...@@ -105,7 +105,7 @@ public class Role extends GenericEntity { ...@@ -105,7 +105,7 @@ public class Role extends GenericEntity {
@ManyToMany(mappedBy = "openForRoles") @ManyToMany(mappedBy = "openForRoles")
private List<Lecture> lectures = new ArrayList<Lecture>(); private List<Lecture> lectures = new ArrayList<Lecture>();
@OneToMany(mappedBy="role") @OneToMany(mappedBy="role", cascade = CascadeType.ALL)
@PrivateOwned @PrivateOwned
private List<EventRoleFeature> features = new ArrayList<>(); private List<EventRoleFeature> features = new ArrayList<>();
......
...@@ -71,6 +71,13 @@ ...@@ -71,6 +71,13 @@
</p:selectOneMenu> </p:selectOneMenu>
<p:message for="defaultrole" /> <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:panelGrid>
<p:commandButton id="commitbtn" actionListener="#{eventorgView.saveEvent()}" value="#{i18n['event.save']}" ajax="false" /> <p:commandButton id="commitbtn" actionListener="#{eventorgView.saveEvent()}" value="#{i18n['event.save']}" ajax="false" />
</p:fieldset> </p:fieldset>
......
<?xml version='1.0' encoding='UTF-8' ?> <?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> "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: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"> 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">
<composite:interface> <composite:interface>
...@@ -14,18 +15,56 @@ ...@@ -14,18 +15,56 @@
<p> <p>
<h:form id="roleform"> <h:form id="roleform">
<f:facet name="errorMessage"> <f:facet name="errorMessage">
<h:outputText value="#{i18n['nasty.user']}" /> <h:outputText value="#{i18n['nasty.user']}"/>
</f:facet> </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> </h:form>
</p> </p>
<h:form id="addmember"> <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:autoComplete id="useradder" value="#{roleView.addableUser}" completeMethod="#{roleView.searchUser}" converter="#{userConverter}" var="usr" itemValue="#{usr}"
<p:ajax onerror="location.reload(true);" update=":editor:addmember,:editor:memberlist" event="itemSelect" listener="#{roleView.addUser}" /> itemLabel="#{usr.shortUserDescriptor}">
<p:ajax onerror="location.reload(true);" update=":editor:addmember,:editor:memberlist" event="itemSelect" listener="#{roleView.addUser}"/>
</p:autoComplete> </p:autoComplete>
</h:form> </h:form>
...@@ -35,44 +74,45 @@ ...@@ -35,44 +74,45 @@
<p:dataTable id="memberlist" value="#{roleView.role.users}" var="usr"> <p:dataTable id="memberlist" value="#{roleView.role.users}" var="usr">
<p:column> <p:column>
<h:outputText value="#{usr.login}" /> <h:outputText value="#{usr.login}"/>
</p:column> </p:column>
<p:column> <p:column>
<h:outputText value="#{usr.nick}" /> <h:outputText value="#{usr.nick}"/>
</p:column> </p:column>
<p:column> <p:column>
<h:outputText value="#{usr.wholeName}" /> <h:outputText value="#{usr.wholeName}"/>
</p:column> </p:column>
<p:column> <p:column>
<h:outputText value="#{usr.email}" /> <h:outputText value="#{usr.email}"/>
</p:column> </p:column>
</p:dataTable> </p:dataTable>
</p:fieldset> </p:fieldset>
<h2>Old permissions</h2>
<p:fieldset legend="#{i18n['role.permissionheader']}" toggleable="true" collapsed="true"> <p:fieldset legend="#{i18n['role.permissionheader']}" toggleable="true" collapsed="true">
<h:form id="permissionform"> <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:dataTable border="1" id="bortalApps" value="#{roleView.rolePermissions}" var="bapp">
<h:column> <h:column>
<f:facet name="header"> <f:facet name="header">
<h:outputText value="#{i18n['applicationPermission.name']}" /> <h:outputText value="#{i18n['applicationPermission.name']}"/>
</f:facet> </f:facet>
<h:outputText value="#{bapp.name}" /> <h:outputText value="#{bapp.name}"/>
</h:column> </h:column>
<h:column> <h:column>
<f:facet name="header"> <f:facet name="header">
<h:outputText value="#{i18n['applicationPermission.description']}" /> <h:outputText value="#{i18n['applicationPermission.description']}"/>
</f:facet> </f:facet>
<h:outputText value="#{i18n[bapp.key]}" /> <h:outputText value="#{i18n[bapp.key]}"/>
</h:column> </h:column>
<h:column> <h:column>
<h:selectManyCheckbox id="permissions" layout="pageDirection" value="#{bapp.selected}"> <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:selectManyCheckbox>
</h:column> </h:column>
</h:dataTable> </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> </h:form>
</p:fieldset> </p:fieldset>
......
...@@ -19,6 +19,7 @@ ...@@ -19,6 +19,7 @@
package fi.codecrew.moya.web.cdiview.organisation; package fi.codecrew.moya.web.cdiview.organisation;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays;
import java.util.List; import java.util.List;
import javax.ejb.EJB; import javax.ejb.EJB;
...@@ -329,5 +330,10 @@ public class EventOrgView extends GenericCDIView { ...@@ -329,5 +330,10 @@ public class EventOrgView extends GenericCDIView {
return permbean.getCurrentUser().isSuperadmin(); return permbean.getCurrentUser().isSuperadmin();
} }
public List<MoyaFeature> getAllFeatures() {
return Arrays.asList(MoyaFeature.values());
}
} }
...@@ -122,6 +122,16 @@ public class RoleView extends GenericCDIView { ...@@ -122,6 +122,16 @@ public class RoleView extends GenericCDIView {
private void initPermissions() { 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); logger.info("Initializing permissions for role {}", role);
EnumMap<BortalApplication, Set<IAppPermission>> rolePermissionMap = new EnumMap<BortalApplication, Set<IAppPermission>>(BortalApplication.class); EnumMap<BortalApplication, Set<IAppPermission>> rolePermissionMap = new EnumMap<BortalApplication, Set<IAppPermission>>(BortalApplication.class);
if (role.getPermissions() == null) { 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!