diff --git a/ccm-cms/src/main/java/org/librecms/ui/contentsections/ConfigurationDocumentTypesController.java b/ccm-cms/src/main/java/org/librecms/ui/contentsections/ConfigurationDocumentTypesController.java new file mode 100644 index 000000000..871ece71a --- /dev/null +++ b/ccm-cms/src/main/java/org/librecms/ui/contentsections/ConfigurationDocumentTypesController.java @@ -0,0 +1,836 @@ +/* + * 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.l10n.GlobalizationHelper; +import org.libreccm.l10n.LocalizedTextsUtil; +import org.libreccm.security.AuthorizationRequired; +import org.libreccm.security.PermissionChecker; +import org.libreccm.security.PermissionManager; +import org.libreccm.security.Role; +import org.libreccm.workflow.Workflow; +import org.librecms.contentsection.ContentSection; +import org.librecms.contentsection.ContentSectionManager; +import org.librecms.contentsection.ContentSectionRepository; +import org.librecms.contentsection.ContentType; +import org.librecms.contentsection.ContentTypeManager; +import org.librecms.contentsection.ContentTypeMode; +import org.librecms.contentsection.privileges.AdminPrivileges; +import org.librecms.contentsection.privileges.TypePrivileges; +import org.librecms.contenttypes.ContentTypeInfo; +import org.librecms.contenttypes.ContentTypesManager; +import org.librecms.lifecycle.LifecycleDefinition; +import org.librecms.ui.CmsAdminMessages; + +import java.util.Arrays; +import java.util.Collections; +import java.util.Optional; +import java.util.Set; +import java.util.stream.Collectors; + +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.FormParam; +import javax.ws.rs.GET; +import javax.ws.rs.POST; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; + +/** + * + * @author Jens Pelzetter + */ +@RequestScoped +@Controller +@Path("/{sectionIdentifier}/configuration/documenttypes") +public class ConfigurationDocumentTypesController { + + @Inject + private CmsAdminMessages cmsAdminMessages; + + @Inject + private ContentSectionModel sectionModel; + + @Inject + private ContentSectionManager sectionManager; + + @Inject + private ContentSectionRepository sectionRepo; + + @Inject + private ContentTypeManager typeManager; + + @Inject + private ContentTypesManager typesManager; + + @Inject + private DocumentTypeModel documentTypeModel; + + @Inject + private DocumentTypesModel documentTypesModel; + + @Inject + private GlobalizationHelper globalizationHelper; + + @Inject + private IdentifierParser identifierParser; + + @Inject + private Models models; + + @Inject + private PermissionChecker permissionChecker; + + @Inject + private PermissionManager permissionManager; + + @GET + @Path("/") + @AuthorizationRequired + @Transactional(Transactional.TxType.REQUIRED) + public String listDocumentTypes( + @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_CONTENT_TYPES, section + )) { + models.put("sectionIdentifier", sectionIdentifier); + return "org/librecms/ui/contentsection/access-denied.xhtml"; + } + + documentTypesModel.setAssignedTypes( + section + .getContentTypes() + .stream() + .map(this::buildDocumentTypesTableRowModel) + .collect(Collectors.toList()) + ); + documentTypesModel.setAvailableTypes( + typesManager + .getAvailableContentTypes() + .stream() + .filter( + type -> !sectionManager.hasContentType( + type.getContentItemClass(), section + ) + ) + .map(this::buildDocumentTypeInfoModel) + .collect( + Collectors.toMap( + model -> model.getContentItemClass(), + model -> model + ) + ) + ); + + documentTypesModel.setAvailableLifecycles( + section + .getLifecycleDefinitions() + .stream() + .map(def -> buildLifecycleModel(def, false)) + .collect( + Collectors.toMap( + model -> model.getUuid(), + model -> model.getLabel() + ) + ) + ); + documentTypesModel.setAvailableWorkflows( + section + .getWorkflowTemplates() + .stream() + .map(workflow -> buildWorkflowModel(workflow, false)) + .collect( + Collectors.toMap( + model -> model.getUuid(), + model -> model.getName() + ) + ) + ); + + return "org/librecms/ui/contentsection/configuration/documenttypes.xhtml"; + } + + @POST + @Path("/") + @AuthorizationRequired + @Transactional(Transactional.TxType.REQUIRED) + public String addDocumentType( + @PathParam("sectionIdentifier") final String sectionIdentifierParam, + @FormParam("contentItemClass") final String contentItemClass, + @FormParam("defaultLifecycleUuid") final String defaultLifecycleUuid, + @FormParam("defaultWorkflowUuid") final String defaultWorkflowUuid + ) { + 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_CONTENT_TYPES, section + )) { + models.put("sectionIdentifier", sectionIdentifier); + return "org/librecms/ui/contentsection/access-denied.xhtml"; + } + + final Optional typeInfo = typesManager + .getAvailableContentTypes() + .stream() + .filter( + type -> type.getContentItemClass().getName().equals( + contentItemClass + ) + ).findAny(); + + if (!typeInfo.isPresent()) { + models.put( + "errors", + cmsAdminMessages.getMessage( + "contentsection.configuration.documenttypes.type_not_available", + new String[]{sectionIdentifierParam, contentItemClass} + ) + ); + + return listDocumentTypes(sectionIdentifierParam); + } + + final Optional defaultLifecycle = section + .getLifecycleDefinitions() + .stream() + .filter(def -> def.getUuid().equals(defaultLifecycleUuid)) + .findAny(); + + if (!defaultLifecycle.isPresent()) { + models.put( + "errors", + cmsAdminMessages.getMessage( + "contentsection.configuration.documenttypes.selected_lifecycle_not_available", + new String[]{sectionIdentifierParam, defaultLifecycleUuid} + ) + ); + + return listDocumentTypes(sectionIdentifierParam); + } + + final Optional defaultWorkflow = section + .getWorkflowTemplates() + .stream() + .filter(def -> def.getUuid().equals(defaultWorkflowUuid)) + .findAny(); + + if (!defaultWorkflow.isPresent()) { + models.put( + "errors", + cmsAdminMessages.getMessage( + "contentsection.configuration.documenttypes.selected_workflow_not_available", + new String[]{sectionIdentifierParam, defaultWorkflowUuid} + ) + ); + + return listDocumentTypes(sectionIdentifierParam); + } + + sectionManager.addContentTypeToSection( + typeInfo.get().getContentItemClass(), + section, + defaultLifecycle.get(), + defaultWorkflow.get() + ); + + return String.format( + "redirect:%s/configuration/documenttypes", sectionIdentifierParam + ); + } + +// @GET +// @Path("/{documentType}") +// public String showDocumentType( +// @PathParam("sectionIdentifier") final String sectionIdentifierParam, +// @PathParam("documentType") final String documentTypeParam +// ) { +// 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_CONTENT_TYPES, section +// )) { +// models.put("sectionIdentifier", sectionIdentifier); +// return "org/librecms/ui/contentsection/access-denied.xhtml"; +// } +// +// final Optional typeResult = section +// .getContentTypes() +// .stream() +// .filter(type -> type.getContentItemClass().equals(documentTypeParam)) +// .findAny(); +// +// if (!typeResult.isPresent()) { +// return "org/librecms/ui/contentsection/configuration/documenttype-not-found.xhtml"; +// } +// +// final ContentType type = typeResult.get(); +// +// documentTypeModel.setContentItemClass(sectionIdentifierParam); +// documentTypeModel.setDescriptions( +// type +// .getDescription() +// .getValues() +// .entrySet() +// .stream() +// .collect(Collectors.toMap( +// entry -> entry.getKey().toString(), +// entry -> entry.getValue() +// )) +// ); +// documentTypeModel.setLabels( +// type +// .getLabel() +// .getValues() +// .entrySet() +// .stream() +// .collect(Collectors.toMap( +// entry -> entry.getKey().toString(), +// entry -> entry.getValue() +// )) +// ); +// +// final LifecycleDefinition defaultLifecycle = type.getDefaultLifecycle(); +// documentTypeModel.setLifecycles( +// section +// .getLifecycleDefinitions() +// .stream() +// .map( +// def -> buildLifecycleModel( +// def, def.equals(defaultLifecycle) +// ) +// ).collect(Collectors.toList()) +// ); +// +// final Workflow defaultWorkflow = type.getDefaultWorkflow(); +// documentTypeModel.setWorkflows( +// section +// .getWorkflowTemplates() +// .stream() +// .map( +// template -> buildWorkflowModel( +// template, template.equals(defaultWorkflow) +// ) +// ).collect(Collectors.toList()) +// ); +// +// return "org/librecms/ui/contentsection/configuration/documenttype.xhtml"; +// } + @POST + @Path("/{documentType}") + @AuthorizationRequired + @Transactional(Transactional.TxType.REQUIRED) + public String updateDocumentType( + @PathParam("sectionIdentifier") final String sectionIdentifierParam, + @PathParam("documentType") final String documentTypeParam, + @FormParam("defaultLifecycleUuid") final String defaultLifecycleUuid, + @FormParam("defaultWorkflowUuid") final String defaultWorkflowUuid, + @FormParam("roleUuids") final Set roleUuids + ) { + 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_CONTENT_TYPES, section + )) { + models.put("sectionIdentifier", sectionIdentifier); + return "org/librecms/ui/contentsection/access-denied.xhtml"; + } + + final Optional typeResult = section + .getContentTypes() + .stream() + .filter(type -> type.getContentItemClass().equals(documentTypeParam)) + .findAny(); + + if (!typeResult.isPresent()) { + return "org/librecms/ui/contentsection/configuration/documenttype-not-found.xhtml"; + } + final ContentType type = typeResult.get(); + + final Optional defaultLifecycle = section + .getLifecycleDefinitions() + .stream() + .filter(def -> def.getUuid().equals(defaultLifecycleUuid)) + .findAny(); + + if (!defaultLifecycle.isPresent()) { + models.put( + "errors", + cmsAdminMessages.getMessage( + "contentsection.configuration.documenttypes.selected_lifecycle_not_available", + new String[]{defaultLifecycleUuid} + ) + ); + + return listDocumentTypes(sectionIdentifierParam); + } + + final Optional defaultWorkflow = section + .getWorkflowTemplates() + .stream() + .filter(def -> def.getUuid().equals(defaultWorkflowUuid)) + .findAny(); + + if (!defaultWorkflow.isPresent()) { + models.put( + "errors", + cmsAdminMessages.getMessage( + "contentsection.configuration.documenttypes.selected_workflow_not_available", + new String[]{defaultWorkflowUuid} + ) + ); + + return listDocumentTypes(sectionIdentifierParam); + } + + typeManager + .setDefaultLifecycle(type, defaultLifecycle.get()); + typeManager.setDefaultWorkflow( + type, defaultWorkflow.get() + ); + + for (final Role role : section.getRoles()) { + if (roleUuids.contains(role.getUuid())) { + typeManager.grantUsageOfType(type, role); + } else { + typeManager.denyUsageOnType(type, role); + } + } + + return String.format( + "redirect:%s/configuration/documenttypes/", + sectionIdentifierParam + ); + } + +// @POST +// @Path("/{documentType}/default-workflow") +// public String setDefaultWorkflow( +// @PathParam("sectionIdentifier") final String sectionIdentifierParam, +// @PathParam("documentType") final String documentTypeParam, +// @FormParam("defaultWorkflowUuid") final String defaultWorkflowUuid +// ) { +// 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_CONTENT_TYPES, section +// )) { +// models.put("sectionIdentifier", sectionIdentifier); +// return "org/librecms/ui/contentsection/access-denied.xhtml"; +// } +// +// final Optional typeResult = section +// .getContentTypes() +// .stream() +// .filter(type -> type.getContentItemClass().equals(documentTypeParam)) +// .findAny(); +// +// if (!typeResult.isPresent()) { +// return "org/librecms/ui/contentsection/configuration/documenttype-not-found.xhtml"; +// } +// +// final Optional defaultWorkflow = section +// .getWorkflowTemplates() +// .stream() +// .filter(def -> def.getUuid().equals(defaultWorkflowUuid)) +// .findAny(); +// +// if (!defaultWorkflow.isPresent()) { +// models.put( +// "errors", +// cmsAdminMessages.getMessage( +// "contentsection.configuration.documenttypes.selected_workflow_not_available", +// new String[]{defaultWorkflowUuid} +// ) +// ); +// +// return listDocumentTypes(sectionIdentifierParam); +// } +// +// typeManager.setDefaultWorkflow( +// typeResult.get(), defaultWorkflow.get() +// ); +// +// return String.format( +// "redirect:%s/configuration/documenttypes/%s", +// sectionIdentifierParam, +// documentTypeParam +// ); +// } + @POST + @Path("/{documentType}/@remove") + @AuthorizationRequired + @Transactional(Transactional.TxType.REQUIRED) + public String removeDocumentType( + @PathParam("sectionIdentifier") final String sectionIdentifierParam, + @PathParam("documentType") final String documentTypeParam + ) { + 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_CONTENT_TYPES, section + )) { + models.put("sectionIdentifier", sectionIdentifier); + return "org/librecms/ui/contentsection/access-denied.xhtml"; + } + + final Optional typeResult = section + .getContentTypes() + .stream() + .filter(type -> type.getContentItemClass().equals(documentTypeParam)) + .findAny(); + + if (!typeResult.isPresent()) { + return "org/librecms/ui/contentsection/configuration/documenttype-not-found.xhtml"; + } + + final ContentTypeInfo typeInfo = typesManager.getContentTypeInfo( + typeResult.get() + ); + + sectionManager.removeContentTypeFromSection( + typeInfo.getContentItemClass(), section + ); + + return String.format( + "redirect:%s/configuration/documenttypes/", + sectionIdentifierParam + ); + } + + private DocumentTypesTableRowModel buildDocumentTypesTableRowModel( + final ContentType type + ) { + final ContentTypeInfo typeInfo = typesManager + .getContentTypeInfo(type); + + final DocumentTypesTableRowModel model + = new DocumentTypesTableRowModel(); + model.setDisplayName(type.getDisplayName()); + model.setUuid(type.getUuid()); + + model.setContentItemClass(type.getContentItemClass()); + + model.setDefaultLifecycleLabel( + Optional + .ofNullable(type.getDefaultLifecycle()) + .map( + lifecycle -> globalizationHelper + .getValueFromLocalizedString( + lifecycle.getLabel() + ) + ).orElse("") + ); + model.setDefaultLifecycleUuid( + Optional + .ofNullable(type.getDefaultLifecycle()) + .map(LifecycleDefinition::getUuid) + .map(uuid -> Arrays.asList(new String[]{uuid})) + .orElse(Collections.emptyList()) + ); + model.setDefaultWorkflowLabel( + Optional + .ofNullable(type.getDefaultWorkflow()) + .map( + workflow -> globalizationHelper.getValueFromLocalizedString( + workflow.getName() + ) + ).orElse("") + ); + model.setDefaultWorkflowUuid( + Optional + .ofNullable(type.getDefaultWorkflow()) + .map(Workflow::getUuid) + .map(uuid -> Arrays.asList(new String[]{uuid})) + .orElse(Collections.emptyList()) + ); + final LocalizedTextsUtil labelUtil = globalizationHelper + .getLocalizedTextsUtil(typeInfo.getLabelBundle()); + model.setLabel(labelUtil.getText(typeInfo.getLabelKey())); + + final LocalizedTextsUtil descUtil = globalizationHelper + .getLocalizedTextsUtil(typeInfo.getDescriptionBundle()); + model.setDescription(descUtil.getText(typeInfo.getDescriptionKey())); + model.setMode( + Optional + .ofNullable(type.getMode()) + .map(ContentTypeMode::toString) + .orElse("") + ); + + model.setPermissions( + type + .getContentSection() + .getRoles() + .stream() + .map(role -> buildDocumentTypePermissionModel(type, role)) + .collect(Collectors.toList()) + ); + + return model; + } + + private DocumentTypeInfoModel buildDocumentTypeInfoModel( + final ContentTypeInfo typeInfo + ) { + final DocumentTypeInfoModel model = new DocumentTypeInfoModel(); + model.setContentItemClass(typeInfo.getContentItemClass().getName()); + + final LocalizedTextsUtil labelUtil = globalizationHelper + .getLocalizedTextsUtil(typeInfo.getLabelBundle()); + model.setLabel(labelUtil.getText(typeInfo.getLabelKey())); + + final LocalizedTextsUtil descUtil = globalizationHelper + .getLocalizedTextsUtil(typeInfo.getDescriptionBundle()); + model.setDescription(descUtil.getText(typeInfo.getDescriptionKey())); + + return model; + } + + private DocumentTypeLifecycleModel buildLifecycleModel( + final LifecycleDefinition definition, + final boolean defaultLifecycle + ) { + final DocumentTypeLifecycleModel model + = new DocumentTypeLifecycleModel(); + model.setDefaultLifecycle(defaultLifecycle); + model.setDefinitionId(definition.getDefinitionId()); + model.setDescription( + globalizationHelper.getValueFromLocalizedString( + definition.getDescription() + ) + ); + model.setLabel( + globalizationHelper.getValueFromLocalizedString( + definition.getLabel() + ) + ); + model.setUuid(definition.getUuid()); + + return model; + } + + private DocumentTypeWorkflowModel buildWorkflowModel( + final Workflow workflow, final boolean defaultWorkflow + ) { + final DocumentTypeWorkflowModel model = new DocumentTypeWorkflowModel(); + model.setDefaultWorkflow(defaultWorkflow); + model.setDescription( + globalizationHelper.getValueFromLocalizedString( + workflow.getDescription() + ) + ); + model.setName( + globalizationHelper.getValueFromLocalizedString( + workflow.getName() + ) + ); + model.setUuid(workflow.getUuid()); + model.setWorkflowId(workflow.getWorkflowId()); + return model; + } + + private DocumentTypePermissionModel buildDocumentTypePermissionModel( + final ContentType type, final Role role + ) { + final DocumentTypePermissionModel model + = new DocumentTypePermissionModel(); + model.setRoleName(role.getName()); + model.setRoleUuid(role.getUuid()); + model.setCanUse( + permissionChecker.isPermitted(TypePrivileges.USE_TYPE, type, role) + ); + return model; + } + +} 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 26e586d89..56475f048 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 @@ -27,6 +27,7 @@ public class ContentSectionApplication extends Application { classes.add(AssetFolderController.class); classes.add(CategoriesController.class); classes.add(ConfigurationController.class); + classes.add(ConfigurationDocumentTypesController.class); classes.add(ConfigurationRolesController.class); classes.add(ContentSectionController.class); classes.add(DocumentFolderController.class); diff --git a/ccm-cms/src/main/java/org/librecms/ui/contentsections/DocumentTypeInfoModel.java b/ccm-cms/src/main/java/org/librecms/ui/contentsections/DocumentTypeInfoModel.java new file mode 100644 index 000000000..26bb46d8a --- /dev/null +++ b/ccm-cms/src/main/java/org/librecms/ui/contentsections/DocumentTypeInfoModel.java @@ -0,0 +1,44 @@ +/* + * 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 DocumentTypeInfoModel { + + private String label; + + private String description; + + private String contentItemClass; + + public String getLabel() { + return label; + } + + public void setLabel(final String label) { + this.label = label; + } + + public String getDescription() { + return description; + } + + public void setDescription(final String description) { + this.description = description; + } + + public String getContentItemClass() { + return contentItemClass; + } + + public void setContentItemClass(final String contentItemClass) { + this.contentItemClass = contentItemClass; + } + +} diff --git a/ccm-cms/src/main/java/org/librecms/ui/contentsections/DocumentTypeLifecycleModel.java b/ccm-cms/src/main/java/org/librecms/ui/contentsections/DocumentTypeLifecycleModel.java new file mode 100644 index 000000000..a74997141 --- /dev/null +++ b/ccm-cms/src/main/java/org/librecms/ui/contentsections/DocumentTypeLifecycleModel.java @@ -0,0 +1,64 @@ +/* + * 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 DocumentTypeLifecycleModel { + + private long definitionId; + + private String uuid; + + private String label; + + private String description; + + private boolean defaultLifecycle; + + public long getDefinitionId() { + return definitionId; + } + + public void setDefinitionId(final long definitionId) { + this.definitionId = definitionId; + } + + public String getUuid() { + return uuid; + } + + public void setUuid(final String uuid) { + this.uuid = uuid; + } + + public String getLabel() { + return label; + } + + public void setLabel(final String label) { + this.label = label; + } + + public String getDescription() { + return description; + } + + public void setDescription(final String description) { + this.description = description; + } + + public boolean isDefaultLifecycle() { + return defaultLifecycle; + } + + public void setDefaultLifecycle(final boolean defaultLifecycle) { + this.defaultLifecycle = defaultLifecycle; + } + +} diff --git a/ccm-cms/src/main/java/org/librecms/ui/contentsections/DocumentTypeModel.java b/ccm-cms/src/main/java/org/librecms/ui/contentsections/DocumentTypeModel.java new file mode 100644 index 000000000..e9f68db52 --- /dev/null +++ b/ccm-cms/src/main/java/org/librecms/ui/contentsections/DocumentTypeModel.java @@ -0,0 +1,89 @@ +/* + * 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("CmsDocumentTypeModel") +public class DocumentTypeModel { + + private String displayName; + + private String contentItemClass; + + private Map labels; + + private Map descriptions; + + private List lifecycles; + + private List workflows; + + public String getContentItemClass() { + return contentItemClass; + } + + public void setContentItemClass(final String contentItemClass) { + this.contentItemClass = contentItemClass; + } + + public Map getLabels() { + return Collections.unmodifiableMap(labels); + } + + public void setLabels(final Map labels) { + this.labels = new HashMap<>(labels); + } + + public Map getDescriptions() { + return Collections.unmodifiableMap(descriptions); + } + + public void setDescriptions(final Map descriptions) { + this.descriptions = new HashMap<>(descriptions); + } + + public List getLifecycles() { + return Collections.unmodifiableList(lifecycles); + } + + public void setLifecycles( + final List lifecyles + ) { + this.lifecycles = new ArrayList<>(lifecyles); + } + + public List getWorkflows() { + return Collections.unmodifiableList(workflows); + } + + public void setWorkflows(final List workflows) { + this.workflows = new ArrayList<>(workflows); + } + + public String getDisplayName() { + return displayName; + } + + public void setDisplayName(String displayName) { + this.displayName = displayName; + } + + + +} diff --git a/ccm-cms/src/main/java/org/librecms/ui/contentsections/DocumentTypePermissionModel.java b/ccm-cms/src/main/java/org/librecms/ui/contentsections/DocumentTypePermissionModel.java new file mode 100644 index 000000000..e2083c916 --- /dev/null +++ b/ccm-cms/src/main/java/org/librecms/ui/contentsections/DocumentTypePermissionModel.java @@ -0,0 +1,44 @@ +/* + * 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 DocumentTypePermissionModel { + + private String roleUuid; + + private String roleName; + + private boolean canUse; + + public String getRoleUuid() { + return roleUuid; + } + + public void setRoleUuid(final String roleUuid) { + this.roleUuid = roleUuid; + } + + public String getRoleName() { + return roleName; + } + + public void setRoleName(final String roleName) { + this.roleName = roleName; + } + + public boolean isCanUse() { + return canUse; + } + + public void setCanUse(final boolean canUse) { + this.canUse = canUse; + } + +} diff --git a/ccm-cms/src/main/java/org/librecms/ui/contentsections/DocumentTypeWorkflowModel.java b/ccm-cms/src/main/java/org/librecms/ui/contentsections/DocumentTypeWorkflowModel.java new file mode 100644 index 000000000..99a89d93d --- /dev/null +++ b/ccm-cms/src/main/java/org/librecms/ui/contentsections/DocumentTypeWorkflowModel.java @@ -0,0 +1,64 @@ +/* + * 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 DocumentTypeWorkflowModel { + + private long workflowId; + + private String uuid; + + private String name; + + private String description; + + private boolean defaultWorkflow; + + public long getWorkflowId() { + return workflowId; + } + + public void setWorkflowId(final long workflowId) { + this.workflowId = workflowId; + } + + 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; + } + + public boolean isDefaultWorkflow() { + return defaultWorkflow; + } + + public void setDefaultWorkflow(final boolean defaultWorkflow) { + this.defaultWorkflow = defaultWorkflow; + } + +} diff --git a/ccm-cms/src/main/java/org/librecms/ui/contentsections/DocumentTypesModel.java b/ccm-cms/src/main/java/org/librecms/ui/contentsections/DocumentTypesModel.java new file mode 100644 index 000000000..c0f7a22bc --- /dev/null +++ b/ccm-cms/src/main/java/org/librecms/ui/contentsections/DocumentTypesModel.java @@ -0,0 +1,73 @@ +/* + * 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("CmsDocumentTypesModel") +public class DocumentTypesModel { + + private List assignedTypes; + + private Map availableTypes; + + private Map availableLifecycles; + + private Map availableWorkflows; + + public List getAssignedTypes() { + return Collections.unmodifiableList(assignedTypes); + } + + protected void setAssignedTypes( + final List assignedTypes + ) { + this.assignedTypes = new ArrayList<>(assignedTypes); + } + + public Map getAvailableTypes() { + return Collections.unmodifiableMap(availableTypes); + } + + public void setAvailableTypes( + final Map availableTypes + ) { + this.availableTypes = new HashMap<>(availableTypes); + } + + public Map getAvailableLifecycles() { + return Collections.unmodifiableMap(availableLifecycles); + } + + public void setAvailableLifecycles( + final Map availableLifecycles + ) { + this.availableLifecycles = new HashMap<>(availableLifecycles); + } + + public Map getAvailableWorkflows() { + return Collections.unmodifiableMap(availableWorkflows); + } + + public void setAvailableWorkflows( + final Map availableWorkflows + ) { + this.availableWorkflows = new HashMap<>(availableWorkflows); + } + +} diff --git a/ccm-cms/src/main/java/org/librecms/ui/contentsections/DocumentTypesTableRowModel.java b/ccm-cms/src/main/java/org/librecms/ui/contentsections/DocumentTypesTableRowModel.java new file mode 100644 index 000000000..4c0cd926e --- /dev/null +++ b/ccm-cms/src/main/java/org/librecms/ui/contentsections/DocumentTypesTableRowModel.java @@ -0,0 +1,129 @@ +/* + * 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.List; + +/** + * + * @author Jens Pelzetter + */ +public class DocumentTypesTableRowModel { + + private String displayName; + + private String contentItemClass; + + private String label; + + private String description; + + private String mode; + + private String defaultLifecycleLabel; + + private List defaultLifecycleUuid; + + private String defaultWorkflowLabel; + + private List defaultWorkflowUuid; + + private String uuid; + + private List permissions; + + public String getContentItemClass() { + return contentItemClass; + } + + public void setContentItemClass(final String contentItemClass) { + this.contentItemClass = contentItemClass; + } + + public String getLabel() { + return label; + } + + public void setLabel(final String label) { + this.label = label; + } + + public String getDescription() { + return description; + } + + public void setDescription(final String description) { + this.description = description; + } + + public String getMode() { + return mode; + } + + public void setMode(final String mode) { + this.mode = mode; + } + + public String getDefaultLifecycleLabel() { + return defaultLifecycleLabel; + } + + public void setDefaultLifecycleLabel(final String defaultLifecycleLabel) { + this.defaultLifecycleLabel = defaultLifecycleLabel; + } + + public String getDefaultWorkflowLabel() { + return defaultWorkflowLabel; + } + + public void setDefaultWorkflowLabel(final String defaultWorkflowLabel) { + this.defaultWorkflowLabel = defaultWorkflowLabel; + } + + public String getDisplayName() { + return displayName; + } + + public void setDisplayName(final String displayName) { + this.displayName = displayName; + } + + public String getUuid() { + return uuid; + } + + public void setUuid(final String uuid) { + this.uuid = uuid; + } + + public List getDefaultLifecycleUuid() { + return Collections.unmodifiableList(defaultLifecycleUuid); + } + + public void setDefaultLifecycleUuid(final List defaultLifecycleUuid) { + this.defaultLifecycleUuid = new ArrayList<>(defaultLifecycleUuid); + } + + public List getDefaultWorkflowUuid() { + return Collections.unmodifiableList(defaultWorkflowUuid); + } + + public void setDefaultWorkflowUuid(final List defaultWorkflowUuid) { + this.defaultWorkflowUuid = new ArrayList<>(defaultWorkflowUuid); + } + + public List getPermissions() { + return Collections.unmodifiableList(permissions); + } + + public void setPermissions( + final List permissions) { + this.permissions = new ArrayList<>(permissions); + } + +} 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 index 48e885d77..df93554c0 100644 --- 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 @@ -14,9 +14,9 @@ + + + + +
+ + + + +

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

+ + + + + + + +
+
+ +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + +
+ #{CmsAdminMessages['contentsection.configuration.documenttypes.table.cols.label']} + + #{CmsAdminMessages['contentsection.configuration.documenttypes.table.cols.item_class']} + + #{CmsAdminMessages['contentsection.configuration.documenttypes.table.cols.default_lifecycle']} + + #{CmsAdminMessages['contentsection.configuration.documenttypes.table.cols.default_workflow']} + + #{CmsAdminMessages['contentsection.configuration.documenttypes.table.cols.actions']} +
#{type.label}#{type.contentItemClass}#{type.defaultLifecycleLabel}#{type.defaultWorkflowLabel} + + + + + + + +
+
+
+ + + 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 index c97db962b..588ca7a11 100644 --- 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 @@ -59,7 +59,7 @@ id="configuration-contenttypes-body">

+ href="#{mvc.basePath}/#{ContentSectionModel.sectionName}/configuration/documenttypes"> #{CmsAdminMessages['contentsection.configuration.contenttypes.title']}

diff --git a/ccm-cms/src/main/resources/org/librecms/CmsAdminMessages.properties b/ccm-cms/src/main/resources/org/librecms/CmsAdminMessages.properties index 5b4c46c64..96554b109 100644 --- a/ccm-cms/src/main/resources/org/librecms/CmsAdminMessages.properties +++ b/ccm-cms/src/main/resources/org/librecms/CmsAdminMessages.properties @@ -278,7 +278,7 @@ 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.title=Document 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 @@ -382,3 +382,45 @@ contentsection.configuration.roles.role_details.description.value.label=Localize contentsection.configuration.roles.role_details.description.edit.value.label=Localized description contentsection.configuration.roles.role_details.description.remove.text=Are you sure to remove the following localized description contentsection.configuration.roles.role_details.description.remove.title=Remove localized description +contentsection.configuration.documenttypes.type_not_available=Document type {1} is not available for content section {0}. +contentsection.configuration.documenttypes.selected_lifecycle_not_available=Content Section {0} has no lifecycle {1}. +contentsection.configuration.documenttypes.selected_workflow_not_available=Content Section {0} has no workflow {1}. +contentsection.configuration.documenttypes.title=Document Types +contentsection.configuration.documenttypes.add=Add document type +contentsection.configuration.documentypes.add.dialog.title=Add document type to Content Section {0} +contentsection.configuration.documenttypes.add.dialog.cancel=Cancel +contentsection.configuration.documenttypes.add.dialog.type.help=Choose the document Type to add +contentsection.configuration.documenttypes.add.dialog.type.label=Document type +contentsection.configuration.documenttypes.add.dialog.default_lifecycle.help=Default Lifecycle for the document typ +contentsection.configuration.documenttypes.add.dialog.default_lifecycle.label=Default Lifecycle +contentsection.configuration.documenttypes.add.dialog.default_workflow.help=Default Workflow for the document typ +contentsection.configuration.documenttypes.add.dialog.default_workflow.label=Default Workflow +contentsection.configuration.documenttypes.add.dialog.submit=Add document type +contentsection.configuration.documenttypes.table.cols.label=Label +contentsection.configuration.documenttypes.table.cols.item_class=Content Item Class +contentsection.configuration.documenttypes.table.cols.default_lifecycle=Default Lifecycle +contentsection.configuration.documenttypes.table.cols.default_workflow=Default Workflow +contentsection.configuration.documenttypes.table.cols.actions=Actions +contentsection.configuration.documenttypes.table.info_button.label=Show details of the document type +contentsection.configuration.documenttypes.info.dialog.title=Details Document Type {0} +contentsection.configuration.documenttypes.info.dialog.description=Description +contentsection.configuration.documenttypes.info.dialog.permissions=Permissions +contentsection.configuration.documenttypes.info.dialog.permissions.role=Role +contentsection.configuration.documenttypes.info.dialog.permissions.canuse=Can use? +contentsection.configuration.documenttypes.info.dialog.permissions.canuse.yes=Yes +contentsection.configuration.documenttypes.info.dialog.permissions.canuse.no=No +contentsection.configuration.documenttypes.info.dialog.cancel=Close +contentsection.configuration.documenttypes.table.edit_button.label=Edit +contentsection.configuration.documentypes.edit.dialog.title=Edit Document Type {1} of Content Section {0} +contentsection.configuration.documenttypes.edit.dialog.cancel=Cancel +contentsection.configuration.documenttypes.edit.dialog.default_lifecycle.help=Default Lifecycle for the document typ +contentsection.configuration.documenttypes.edit.dialog.default_lifecycle.label=Default Lifecycle +contentsection.configuration.documenttypes.edit.dialog.default_workflow.help=Default Workflow for the document typ +contentsection.configuration.documenttypes.edit.dialog.default_workflow.label=Default Workflow +contentsection.configuration.documenttypes.info.edit_dialog.permissions=Permissions +contentsection.configuration.documenttypes.edit.dialog.submit=Apply +contentsection.configuration.documenttypes.remove_button.label=Remove +contentsection.configuration.documenttypes.remove_dialog.cancel=Cancel +contentsection.configuration.documenttypes.remove_dialog.confirm=Remove Document Type +contentsection.configuration.documenttypes.remove_dialog.title=Confirm Document Type removal +contentsection.configuration.documenttypes.remove_dialog.message=Are you sure to remove the document type {1} from content section {0}? 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 d8403f08b..5a56d96ba 100644 --- a/ccm-cms/src/main/resources/org/librecms/CmsAdminMessages_de.properties +++ b/ccm-cms/src/main/resources/org/librecms/CmsAdminMessages_de.properties @@ -383,3 +383,45 @@ contentsection.configuration.roles.role_details.description.value.label=Lokalisi contentsection.configuration.roles.role_details.description.edit.value.label=Lokalisierte Beschreibung contentsection.configuration.roles.role_details.description.remove.text=Sind Sie sicher, dass Sie die folgende lokalisierte Beschreibung entfernen wollen? contentsection.configuration.roles.role_details.description.remove.title=Lokalisierte Beschreibung entfernen +contentsection.configuration.documenttypes.type_not_available=Dokumententype{1} ist f\u00fcr Content Section {0} nicht verf\u00fcgbar. +contentsection.configuration.documenttypes.selected_lifecycle_not_available=Kein Lebenszyklus {1} f\u00fcr Content Section {0} gefunden. +contentsection.configuration.documenttypes.selected_workflow_not_available=Kein Arbeitsablauf {1} f\u00fcr Content Section {0} gefunden. +contentsection.configuration.documenttypes.title=Dokumenttypen +contentsection.configuration.documenttypes.add=Dokumenttyp hinzuf\u00fcgen +contentsection.configuration.documentypes.add.dialog.title=Dokumenttyp zur Content Section {0} hinzuf\u00fcgen +contentsection.configuration.documenttypes.add.dialog.cancel=Abbrechen +contentsection.configuration.documenttypes.add.dialog.type.help=W\u00e4hlen Sie die Dokumenttyp der hinzugef\u00fcgt werden soll +contentsection.configuration.documenttypes.add.dialog.type.label=Dokumententyp +contentsection.configuration.documenttypes.add.dialog.default_lifecycle.help=Voreingestellter Lebenszyklus f\u00fcr den Dokumenttyp +contentsection.configuration.documenttypes.add.dialog.default_lifecycle.label=Standard-Lebenszyklus +contentsection.configuration.documenttypes.add.dialog.default_workflow.help=Voreingestellter Arbeitsablauf f\u00fcr den Dokumenttyp +contentsection.configuration.documenttypes.add.dialog.default_workflow.label=Standard-Arbeitsablauf +contentsection.configuration.documenttypes.add.dialog.submit=Dokumenttyp hinzuf\u00fcgen +contentsection.configuration.documenttypes.table.cols.label=Bezeichnung +contentsection.configuration.documenttypes.table.cols.item_class=Content Item Klasse +contentsection.configuration.documenttypes.table.cols.default_lifecycle=Standard-Lebenszyklus +contentsection.configuration.documenttypes.table.cols.default_workflow=Standard-Arbeitablauf +contentsection.configuration.documenttypes.table.cols.actions=Aktionen +contentsection.configuration.documenttypes.table.info_button.label=Details des Dokumenttyps anzeigen +contentsection.configuration.documenttypes.info.dialog.title=Details Dokumenttyp {0} +contentsection.configuration.documenttypes.info.dialog.description=Beschreibung +contentsection.configuration.documenttypes.info.dialog.permissions=Berechtigungen +contentsection.configuration.documenttypes.info.dialog.permissions.role=Rolle +contentsection.configuration.documenttypes.info.dialog.permissions.canuse=Darf verwenden? +contentsection.configuration.documenttypes.info.dialog.permissions.canuse.yes=Ja +contentsection.configuration.documenttypes.info.dialog.permissions.canuse.no=Nein +contentsection.configuration.documenttypes.info.dialog.cancel=Schlie\u00dfen +contentsection.configuration.documenttypes.table.edit_button.label=Bearbeiten +contentsection.configuration.documentypes.edit.dialog.title=Dokument Typ {1} der Content Section {0} bearbeiten +contentsection.configuration.documenttypes.edit.dialog.cancel=Abbrechen +contentsection.configuration.documenttypes.edit.dialog.default_lifecycle.help=Voreingestellter Lebenszyklus f\u00fcr den Dokumenttyp +contentsection.configuration.documenttypes.edit.dialog.default_lifecycle.label=Standard-Lebenszyklus +contentsection.configuration.documenttypes.edit.dialog.default_workflow.help=Voreingestellter Arbeitsablauf f\u00fcr den Dokumenttyp +contentsection.configuration.documenttypes.edit.dialog.default_workflow.label=Standard-Arbeitsablauf +contentsection.configuration.documenttypes.info.edit_dialog.permissions=Berechtigungen +contentsection.configuration.documenttypes.edit.dialog.submit=Anwenden +contentsection.configuration.documenttypes.remove_button.label=Entfernen +contentsection.configuration.documenttypes.remove_dialog.cancel=Abbrechen +contentsection.configuration.documenttypes.remove_dialog.confirm=Dokumenttyp entfernen +contentsection.configuration.documenttypes.remove_dialog.title=Entfernen des Dokumenttyps best\u00e4tigen +contentsection.configuration.documenttypes.remove_dialog.message=Sind Sie sicher, dass Sie den Dokumenttyp {1} aus der Content Section {0} entfernen wollen? diff --git a/ccm-core/src/main/resources/META-INF/resources/components/bootstrap/formCheck.xhtml b/ccm-core/src/main/resources/META-INF/resources/components/bootstrap/formCheck.xhtml index 5c1d349b3..ad322fa2f 100644 --- a/ccm-core/src/main/resources/META-INF/resources/components/bootstrap/formCheck.xhtml +++ b/ccm-core/src/main/resources/META-INF/resources/components/bootstrap/formCheck.xhtml @@ -32,12 +32,12 @@
- + value="#{cc.attrs.value}" />