From f687a2c875c1220e8cc2cb935993a076f0c22bfe Mon Sep 17 00:00:00 2001 From: Jens Pelzetter Date: Sat, 20 Feb 2021 19:01:45 +0100 Subject: [PATCH] Role management for content sections Former-commit-id: 5cf55c6de7f02399e7680010babdd93961003038 --- .../ConfigurationController.java | 113 ++++++++ .../ConfigurationRolesController.java | 269 ++++++++++++++++++ .../ContentSectionApplication.java | 11 +- .../ui/contentsections/RoleListItemModel.java | 54 ++++ .../contentsections/RoleMembershipModel.java | 34 +++ .../ui/contentsections/SelectedRoleModel.java | 87 ++++++ .../configuration/configuration-tabs.xhtml | 36 +++ .../contentsection/configuration/index.xhtml | 122 ++++++++ .../contentsection/configuration/role.xhtml | 56 ++++ .../contentsection/configuration/roles.xhtml | 90 ++++++ .../org/librecms/CmsAdminMessages.properties | 19 ++ .../librecms/CmsAdminMessages_de.properties | 19 ++ .../main/scss/content-sections/_custom.scss | 10 + .../org/libreccm/ui/admin/dashboard.xhtml | 2 +- 14 files changed, 915 insertions(+), 7 deletions(-) create mode 100644 ccm-cms/src/main/java/org/librecms/ui/contentsections/ConfigurationController.java create mode 100644 ccm-cms/src/main/java/org/librecms/ui/contentsections/ConfigurationRolesController.java create mode 100644 ccm-cms/src/main/java/org/librecms/ui/contentsections/RoleListItemModel.java create mode 100644 ccm-cms/src/main/java/org/librecms/ui/contentsections/RoleMembershipModel.java create mode 100644 ccm-cms/src/main/java/org/librecms/ui/contentsections/SelectedRoleModel.java create mode 100644 ccm-cms/src/main/resources/WEB-INF/views/org/librecms/ui/contentsection/configuration/configuration-tabs.xhtml create mode 100644 ccm-cms/src/main/resources/WEB-INF/views/org/librecms/ui/contentsection/configuration/index.xhtml create mode 100644 ccm-cms/src/main/resources/WEB-INF/views/org/librecms/ui/contentsection/configuration/role.xhtml create mode 100644 ccm-cms/src/main/resources/WEB-INF/views/org/librecms/ui/contentsection/configuration/roles.xhtml diff --git a/ccm-cms/src/main/java/org/librecms/ui/contentsections/ConfigurationController.java b/ccm-cms/src/main/java/org/librecms/ui/contentsections/ConfigurationController.java new file mode 100644 index 000000000..04d134b3f --- /dev/null +++ b/ccm-cms/src/main/java/org/librecms/ui/contentsections/ConfigurationController.java @@ -0,0 +1,113 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package org.librecms.ui.contentsections; + +import org.libreccm.api.Identifier; +import org.libreccm.api.IdentifierParser; +import org.libreccm.security.AuthorizationRequired; +import org.libreccm.security.PermissionChecker; +import org.librecms.contentsection.ContentSection; +import org.librecms.contentsection.ContentSectionRepository; +import org.librecms.contentsection.privileges.AdminPrivileges; + +import java.util.Optional; + +import javax.enterprise.context.RequestScoped; +import javax.inject.Inject; +import javax.mvc.Controller; +import javax.mvc.Models; +import javax.transaction.Transactional; +import javax.ws.rs.GET; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; + +/** + * + * @author Jens Pelzetter + */ +@RequestScoped +@Controller +@Path("/{sectionIdentifier}/configuration") +public class ConfigurationController { + + @Inject + private ContentSectionModel sectionModel; + + @Inject + private ContentSectionRepository sectionRepo; + + @Inject + private IdentifierParser identifierParser; + + @Inject + private Models models; + + @Inject + private PermissionChecker permissionChecker; + + @GET + @Path("/") + @AuthorizationRequired + @Transactional(Transactional.TxType.REQUIRED) + public String showConfigurationIndexPage( + @PathParam("sectionIdentifier") final String sectionIdentifierParam + ) { + final Identifier sectionIdentifier = identifierParser.parseIdentifier( + sectionIdentifierParam + ); + + final Optional sectionResult; + switch (sectionIdentifier.getType()) { + case ID: + sectionResult = sectionRepo.findById( + Long.parseLong( + sectionIdentifier.getIdentifier() + ) + ); + break; + case UUID: + sectionResult = sectionRepo.findByUuid( + sectionIdentifier.getIdentifier() + ); + break; + default: + sectionResult = sectionRepo.findByLabel( + sectionIdentifier.getIdentifier() + ); + break; + } + + if (!sectionResult.isPresent()) { + models.put("sectionIdentifier", sectionIdentifier); + return "org/librecms/ui/contentsection/contentsection-not-found.xhtml"; + } + final ContentSection section = sectionResult.get(); + sectionModel.setSection(section); + + if (!hasRequiredPermission(section)) { + models.put("sectionIdentifier", sectionIdentifier); + return "org/librecms/ui/contentsection/access-denied.xhtml"; + } + + return "org/librecms/ui/contentsection/configuration/index.xhtml"; + } + + private boolean hasRequiredPermission(final ContentSection section) { + return permissionChecker.isPermitted( + AdminPrivileges.ADMINISTER_CONTENT_TYPES, section + ) + || permissionChecker.isPermitted( + AdminPrivileges.ADMINISTER_LIFECYLES, section + ) + || permissionChecker.isPermitted( + AdminPrivileges.ADMINISTER_ROLES, section + ) + || permissionChecker.isPermitted( + AdminPrivileges.ADMINISTER_WORKFLOW, section + ); + } + +} diff --git a/ccm-cms/src/main/java/org/librecms/ui/contentsections/ConfigurationRolesController.java b/ccm-cms/src/main/java/org/librecms/ui/contentsections/ConfigurationRolesController.java new file mode 100644 index 000000000..37b0e9da2 --- /dev/null +++ b/ccm-cms/src/main/java/org/librecms/ui/contentsections/ConfigurationRolesController.java @@ -0,0 +1,269 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package org.librecms.ui.contentsections; + +import org.libreccm.api.Identifier; +import org.libreccm.api.IdentifierParser; +import org.libreccm.core.CcmObject; +import org.libreccm.l10n.GlobalizationHelper; +import org.libreccm.security.AuthorizationRequired; +import org.libreccm.security.Permission; +import org.libreccm.security.PermissionChecker; +import org.libreccm.security.Role; +import org.libreccm.security.RoleMembership; + +import java.util.Optional; + +import javax.enterprise.context.RequestScoped; +import javax.inject.Inject; +import javax.mvc.Controller; +import javax.mvc.Models; +import javax.transaction.Transactional; +import javax.ws.rs.GET; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; + +import org.librecms.contentsection.ContentSection; +import org.librecms.contentsection.ContentSectionRepository; +import org.librecms.contentsection.Folder; +import org.librecms.contentsection.privileges.AdminPrivileges; + +import java.util.List; +import java.util.Locale; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * + * @author Jens Pelzetter + */ +@RequestScoped +@Controller +@Path("/{sectionIdentifier}/configuration/roles") +public class ConfigurationRolesController { + + @Inject + private ContentSectionModel sectionModel; + + @Inject + private ContentSectionRepository sectionRepo; + + @Inject + private GlobalizationHelper globalizationHelper; + + @Inject + private IdentifierParser identifierParser; + + @Inject + private Models models; + + @Inject + private PermissionChecker permissionChecker; + + @Inject + private SelectedRoleModel selectedRoleModel; + + @GET + @Path("/") + @AuthorizationRequired + @Transactional(Transactional.TxType.REQUIRED) + public String listRoles( + @PathParam("sectionIdentifier") final String sectionIdentifierParam + ) { + final Identifier sectionIdentifier = identifierParser.parseIdentifier( + sectionIdentifierParam + ); + + final Optional sectionResult; + switch (sectionIdentifier.getType()) { + case ID: + sectionResult = sectionRepo.findById( + Long.parseLong( + sectionIdentifier.getIdentifier() + ) + ); + break; + case UUID: + sectionResult = sectionRepo.findByUuid( + sectionIdentifier.getIdentifier() + ); + break; + default: + sectionResult = sectionRepo.findByLabel( + sectionIdentifier.getIdentifier() + ); + break; + } + + if (!sectionResult.isPresent()) { + models.put("sectionIdentifier", sectionIdentifier); + return "org/librecms/ui/contentsection/contentsection-not-found.xhtml"; + } + final ContentSection section = sectionResult.get(); + sectionModel.setSection(section); + + if (!permissionChecker.isPermitted( + AdminPrivileges.ADMINISTER_ROLES, section + )) { + models.put("sectionIdentifier", sectionIdentifier); + return "org/librecms/ui/contentsection/access-denied.xhtml"; + } + + final List roles = section + .getRoles() + .stream() + .map(this::buildRoleListModel) + .collect(Collectors.toList()); + models.put("roles", roles); + + return "org/librecms/ui/contentsection/configuration/roles.xhtml"; + } + + @GET + @Path("/{roleName}") + @AuthorizationRequired + @Transactional(Transactional.TxType.REQUIRED) + public String showRole( + @PathParam("sectionIdentifier") final String sectionIdentifierParam, + @PathParam("roleName") final String roleName + ) { + final Identifier sectionIdentifier = identifierParser.parseIdentifier( + sectionIdentifierParam + ); + + final Optional sectionResult; + switch (sectionIdentifier.getType()) { + case ID: + sectionResult = sectionRepo.findById( + Long.parseLong( + sectionIdentifier.getIdentifier() + ) + ); + break; + case UUID: + sectionResult = sectionRepo.findByUuid( + sectionIdentifier.getIdentifier() + ); + break; + default: + sectionResult = sectionRepo.findByLabel( + sectionIdentifier.getIdentifier() + ); + break; + } + + if (!sectionResult.isPresent()) { + models.put("sectionIdentifier", sectionIdentifier); + return "org/librecms/ui/contentsection/contentsection-not-found.xhtml"; + } + final ContentSection section = sectionResult.get(); + sectionModel.setSection(section); + + if (!permissionChecker.isPermitted( + AdminPrivileges.ADMINISTER_ROLES, section + )) { + models.put("sectionIdentifier", sectionIdentifier); + return "org/librecms/ui/contentsection/access-denied.xhtml"; + } + + final Optional result = section + .getRoles() + .stream() + .filter(role -> roleName.equals(role.getName())) + .findAny(); + + if (!result.isPresent()) { + models.put("sectionIdentifier", sectionIdentifier); + models.put("roleName", roleName); + return "org/librecms/ui/contentsection/configuration/role-not-found.xhtml"; + } + + final Role role = result.get(); + selectedRoleModel.setDescription( + role + .getDescription() + .getValues() + .entrySet() + .stream() + .collect( + Collectors.toMap( + entry -> entry.getKey().toString(), + entry -> entry.getValue() + ) + ) + ); + selectedRoleModel.setMembers( + role + .getMemberships() + .stream() + .map(this::buildRoleMembershipModel) + .collect(Collectors.toList()) + ); + selectedRoleModel.setName(role.getName()); + selectedRoleModel.setPermissions( + role + .getPermissions() + .stream() + .filter( + permission -> onlyContentSectionPermissions( + permission, section + ) + ) + .map(permission -> permission.getGrantedPrivilege()) + .collect(Collectors.toList()) + ); + final Set descriptionLocales = role + .getDescription() + .getAvailableLocales(); + final List availableLocales = globalizationHelper + .getAvailableLocales(); + selectedRoleModel.setUnusedDescriptionLocales( + availableLocales + .stream() + .filter(locale -> !descriptionLocales.contains(locale)) + .map(Locale::toString) + .collect(Collectors.toList()) + ); + + return "org/librecms/ui/contentsection/configuration/role.xhtml"; + } + + private RoleListItemModel buildRoleListModel(final Role role) { + final RoleListItemModel model = new RoleListItemModel(); + model.setRoleId(role.getRoleId()); + model.setUuid(role.getUuid()); + model.setName(role.getName()); + model.setDescription( + globalizationHelper.getValueFromLocalizedString( + role.getDescription() + ) + ); + return model; + } + + private RoleMembershipModel buildRoleMembershipModel( + final RoleMembership membership + ) { + final RoleMembershipModel model = new RoleMembershipModel(); + model.setMemberName(membership.getMember().getName()); + model.setMemberUuid(membership.getMember().getUuid()); + + return model; + } + + private boolean onlyContentSectionPermissions( + final Permission permission, final ContentSection section + ) { + final Folder rootDocumentsFolder = section.getRootDocumentsFolder(); + final Folder rootAssetsFolder = section.getRootAssetsFolder(); + + final CcmObject object = permission.getObject(); + return section.equals(object) + || rootDocumentsFolder.equals(object) + || rootAssetsFolder.equals(object); + } + +} diff --git a/ccm-cms/src/main/java/org/librecms/ui/contentsections/ContentSectionApplication.java b/ccm-cms/src/main/java/org/librecms/ui/contentsections/ContentSectionApplication.java index 8148cfcb1..26e586d89 100644 --- a/ccm-cms/src/main/java/org/librecms/ui/contentsections/ContentSectionApplication.java +++ b/ccm-cms/src/main/java/org/librecms/ui/contentsections/ContentSectionApplication.java @@ -23,17 +23,16 @@ public class ContentSectionApplication extends Application { @Override public Set> getClasses() { final Set> classes = new HashSet<>(); - + classes.add(AssetFolderController.class); classes.add(CategoriesController.class); + classes.add(ConfigurationController.class); + classes.add(ConfigurationRolesController.class); classes.add(ContentSectionController.class); classes.add(DocumentFolderController.class); classes.add(IsAuthenticatedFilter.class); - - + return classes; } - - - + } diff --git a/ccm-cms/src/main/java/org/librecms/ui/contentsections/RoleListItemModel.java b/ccm-cms/src/main/java/org/librecms/ui/contentsections/RoleListItemModel.java new file mode 100644 index 000000000..c7739d6a3 --- /dev/null +++ b/ccm-cms/src/main/java/org/librecms/ui/contentsections/RoleListItemModel.java @@ -0,0 +1,54 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package org.librecms.ui.contentsections; + +/** + * + * @author Jens Pelzetter + */ +public class RoleListItemModel { + + private long roleId; + + private String uuid; + + private String name; + + private String description; + + public long getRoleId() { + return roleId; + } + + public void setRoleId(final long roleId) { + this.roleId = roleId; + } + + public String getUuid() { + return uuid; + } + + public void setUuid(final String uuid) { + this.uuid = uuid; + } + + public String getName() { + return name; + } + + public void setName(final String name) { + this.name = name; + } + + public String getDescription() { + return description; + } + + public void setDescription(final String description) { + this.description = description; + } + +} diff --git a/ccm-cms/src/main/java/org/librecms/ui/contentsections/RoleMembershipModel.java b/ccm-cms/src/main/java/org/librecms/ui/contentsections/RoleMembershipModel.java new file mode 100644 index 000000000..a3b148e9d --- /dev/null +++ b/ccm-cms/src/main/java/org/librecms/ui/contentsections/RoleMembershipModel.java @@ -0,0 +1,34 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package org.librecms.ui.contentsections; + +/** + * + * @author Jens Pelzetter + */ +public class RoleMembershipModel { + + private String memberName; + + private String memberUuid; + + public String getMemberName() { + return memberName; + } + + public void setMemberName(final String memberName) { + this.memberName = memberName; + } + + public String getMemberUuid() { + return memberUuid; + } + + public void setMemberUuid(final String memberUuid) { + this.memberUuid = memberUuid; + } + +} diff --git a/ccm-cms/src/main/java/org/librecms/ui/contentsections/SelectedRoleModel.java b/ccm-cms/src/main/java/org/librecms/ui/contentsections/SelectedRoleModel.java new file mode 100644 index 000000000..6d5e440ce --- /dev/null +++ b/ccm-cms/src/main/java/org/librecms/ui/contentsections/SelectedRoleModel.java @@ -0,0 +1,87 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package org.librecms.ui.contentsections; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.enterprise.context.RequestScoped; +import javax.inject.Named; + +/** + * + * @author Jens Pelzetter + */ +@RequestScoped +@Named("SelectedRoleModel") +public class SelectedRoleModel { + + private String name; + + private Map description; + + + + private List unusedDescriptionLocales; + + private List members; + + /** + * Permissions of the role for the content section. + */ + private List permissions; + + public String getName() { + return name; + } + + public void setName(final String name) { + this.name = name; + } + + public Map getDescription() { + return Collections.unmodifiableMap(description); + } + + public void setDescription(final Map description) { + this.description = new HashMap<>(description); + } + + public List getMembers() { + return Collections.unmodifiableList(members); + } + + public void setMembers(final List members) { + this.members = new ArrayList<>(members); + } + + public List getPermissions() { + return Collections.unmodifiableList(permissions); + } + + public void setPermissions(final List permissions) { + this.permissions = new ArrayList<>(permissions); + } + + public List getUnusedDescriptionLocales() { + return Collections.unmodifiableList(unusedDescriptionLocales); + } + + public void setUnusedDescriptionLocales( + final List unusedDescriptionLocales + ) { + this.unusedDescriptionLocales + = new ArrayList<>(unusedDescriptionLocales); + } + + public boolean getHasUnusedDescriptionLocales() { + return !unusedDescriptionLocales.isEmpty(); + } + +} diff --git a/ccm-cms/src/main/resources/WEB-INF/views/org/librecms/ui/contentsection/configuration/configuration-tabs.xhtml b/ccm-cms/src/main/resources/WEB-INF/views/org/librecms/ui/contentsection/configuration/configuration-tabs.xhtml new file mode 100644 index 000000000..48e885d77 --- /dev/null +++ b/ccm-cms/src/main/resources/WEB-INF/views/org/librecms/ui/contentsection/configuration/configuration-tabs.xhtml @@ -0,0 +1,36 @@ +]> + + + + + diff --git a/ccm-cms/src/main/resources/WEB-INF/views/org/librecms/ui/contentsection/configuration/index.xhtml b/ccm-cms/src/main/resources/WEB-INF/views/org/librecms/ui/contentsection/configuration/index.xhtml new file mode 100644 index 000000000..c97db962b --- /dev/null +++ b/ccm-cms/src/main/resources/WEB-INF/views/org/librecms/ui/contentsection/configuration/index.xhtml @@ -0,0 +1,122 @@ +]> + + + + + + + + + + + +
+

#{CmsAdminMessages.getMessage('contentsection.configuration.heading', [ContentSectionModel.sectionName])}

+
+
+
+ +
+
+

+ + #{CmsAdminMessages['contentsection.configuration.roles.title']} + +

+

+ #{CmsAdminMessages['contentsection.configuration.roles.description']} +

+
+
+
+
+ +
+
+

+ + #{CmsAdminMessages['contentsection.configuration.contenttypes.title']} + +

+

+ #{CmsAdminMessages['contentsection.configuration.contenttypes.description']} +

+
+
+
+
+ +
+
+

+ + #{CmsAdminMessages['contentsection.configuration.lifecycles.title']} + +

+

+ #{CmsAdminMessages['contentsection.configuration.lifecycles.description']} +

+
+
+
+
+ +
+
+

+ + #{CmsAdminMessages['contentsection.configuration.workflows.title']} + +

+

+ #{CmsAdminMessages['contentsection.configuration.workflows.description']} +

+
+
+
+
+
+ +
+ diff --git a/ccm-cms/src/main/resources/WEB-INF/views/org/librecms/ui/contentsection/configuration/role.xhtml b/ccm-cms/src/main/resources/WEB-INF/views/org/librecms/ui/contentsection/configuration/role.xhtml new file mode 100644 index 000000000..365450702 --- /dev/null +++ b/ccm-cms/src/main/resources/WEB-INF/views/org/librecms/ui/contentsection/configuration/role.xhtml @@ -0,0 +1,56 @@ +]> + + + + + + + + + + + + + +
+ + + +

#{CmsAdminMessages.getMessage('contentsection.configuration.roles.role_details.title', [SelectedRoleModel.name])}

+
+
+
#{CmsAdminMessages['contentsection.configuration.roles.role_details.name']}
+
#{SelectedRoleModel.name}
+
+
+ +
+
+
+ diff --git a/ccm-cms/src/main/resources/WEB-INF/views/org/librecms/ui/contentsection/configuration/roles.xhtml b/ccm-cms/src/main/resources/WEB-INF/views/org/librecms/ui/contentsection/configuration/roles.xhtml new file mode 100644 index 000000000..793b71ded --- /dev/null +++ b/ccm-cms/src/main/resources/WEB-INF/views/org/librecms/ui/contentsection/configuration/roles.xhtml @@ -0,0 +1,90 @@ +]> + + + + + + + + + + + + +
+ + + +

#{CmsAdminMessages['contentsection.configuration.roles.title']}

+ +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + +
+ #{CmsAdminMessages['contentsection.configuration.roles.table.name']} + + #{CmsAdminMessages['contentsection.configuration.roles.table.description']} + + #{CmsAdminMessages['contentsection.configuration.roles.table.actions']} +
#{role.name}#{role.description} + + + + #{CmsAdminMessages['contentsection.configuration.roles.table.actions.details']} + + + + +
+
+
+
+ + diff --git a/ccm-cms/src/main/resources/org/librecms/CmsAdminMessages.properties b/ccm-cms/src/main/resources/org/librecms/CmsAdminMessages.properties index d5fc89703..8c3a4e97c 100644 --- a/ccm-cms/src/main/resources/org/librecms/CmsAdminMessages.properties +++ b/ccm-cms/src/main/resources/org/librecms/CmsAdminMessages.properties @@ -275,3 +275,22 @@ contentsections.categorystems.category.objects.reorder.increase=Down contentsections.categorystems.category.objects.index_object.reset=Reset index object contentsections.categorystems.category.objects.index_object.set=Use as index object contentsections.categorystems.category.objects.none=No objects in this category +contentsection.configuration.heading=Configuration of Content Section {0} +contentsection.configuration.roles.title=Roles +contentsection.configuration.roles.description=Manage roles for this content section +contentsection.configuration.contenttypes.title=Content Types +contentsection.configuration.contenttypes.description=Manage the document types available in this content section +contentsection.configuration.lifecycles.title=Lifecycles +contentsection.configuration.lifecycles.description=Manage lifecycles for documents in this content section +contentsection.configuration.workflows.title=Workflows +contentsection.configuration.workflows.description=Manage workflows for documents in this content section +contentsection.configuration.roles.table.name=Name +contentsection.configuration.roles.table.description=Description +contentsection.configuration.roles.table.actions=Actions +contentsection.configuration.roles.table.actions.details=Details +contentsection.configuration.roles.table.actions.delete=Delete role +contentsection.configuration.roles.role_details.title=Details Role {0} +contentsection.configuration.roles.role_details.name=Name +contentsection.configuration.roles.role_details.description.title=Description +contentsection.configuration.roles.breadcrumbs=Role +contentsection.configuration.roles.add=Add role diff --git a/ccm-cms/src/main/resources/org/librecms/CmsAdminMessages_de.properties b/ccm-cms/src/main/resources/org/librecms/CmsAdminMessages_de.properties index 91035794f..780387bbe 100644 --- a/ccm-cms/src/main/resources/org/librecms/CmsAdminMessages_de.properties +++ b/ccm-cms/src/main/resources/org/librecms/CmsAdminMessages_de.properties @@ -276,3 +276,22 @@ contentsections.categorystems.category.objects.reorder.increase=Runter contentsections.categorystems.category.objects.index_object.reset=Index Objekt zur\u00fccksetzen contentsections.categorystems.category.objects.index_object.set=Als Index-Objekt nutzen contentsections.categorystems.category.objects.none=Dieser Kategorie sind keine Objekte zugeordnet +contentsection.configuration.heading=Konfiguration Content Section {0} +contentsection.configuration.roles.title=Rollen +contentsection.configuration.roles.description=Rollen dieser Content Section verwalten +contentsection.configuration.contenttypes.title=Dokumenttypen +contentsection.configuration.contenttypes.description=In dieser Content Section verf\u00fcgbare Dokumenttypes verwalten +contentsection.configuration.lifecycles.title=Lebenszyklen +contentsection.configuration.lifecycles.description=Lebenszyklen f\u00fcr Dokumente dieser Content Section verwalten +contentsection.configuration.workflows.title=Arbeitsabl\u00e4ufe +contentsection.configuration.workflows.description=Arbeitsabl\u00e4ufe f\u00fcr Dokumente in dieser Content Section verwalten +contentsection.configuration.roles.table.name=Name +contentsection.configuration.roles.table.description=Beschreibung +contentsection.configuration.roles.table.actions=Aktionen +contentsection.configuration.roles.table.actions.details=Details +contentsection.configuration.roles.table.actions.delete=Rolle l\u00f6schen +contentsection.configuration.roles.role_details.title=Details Rolle {0} +contentsection.configuration.roles.role_details.name=Name +contentsection.configuration.roles.role_details.description.title=Beschreibung +contentsection.configuration.roles.breadcrumbs=Rolle +contentsection.configuration.roles.add=Rolle hinzuf\u00fcgen diff --git a/ccm-cms/src/main/scss/content-sections/_custom.scss b/ccm-cms/src/main/scss/content-sections/_custom.scss index 4540a9177..36e95e15a 100644 --- a/ccm-cms/src/main/scss/content-sections/_custom.scss +++ b/ccm-cms/src/main/scss/content-sections/_custom.scss @@ -103,4 +103,14 @@ table.contentsections.categories-table { td.actions-setindex-col { width: 11em; } +} + +table.contentsection-roles-table { + td.actions-details-col { + width: 9em; + } + + td.actions-delete-col { + width: 11em; + } } \ No newline at end of file diff --git a/ccm-core/src/main/resources/WEB-INF/views/org/libreccm/ui/admin/dashboard.xhtml b/ccm-core/src/main/resources/WEB-INF/views/org/libreccm/ui/admin/dashboard.xhtml index 35055d075..1f47f9dc5 100644 --- a/ccm-core/src/main/resources/WEB-INF/views/org/libreccm/ui/admin/dashboard.xhtml +++ b/ccm-core/src/main/resources/WEB-INF/views/org/libreccm/ui/admin/dashboard.xhtml @@ -15,7 +15,7 @@

#{AdminMessages['dashboard.label']}

-
+