diff --git a/dmp-backend/core/src/main/java/eu/eudat/model/builder/filetransformer/DescriptionFieldFileTransformerBuilder.java b/dmp-backend/core/src/main/java/eu/eudat/model/builder/filetransformer/DescriptionFieldFileTransformerBuilder.java index 96ff65bc9..7561bb6bc 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/model/builder/filetransformer/DescriptionFieldFileTransformerBuilder.java +++ b/dmp-backend/core/src/main/java/eu/eudat/model/builder/filetransformer/DescriptionFieldFileTransformerBuilder.java @@ -10,10 +10,7 @@ import eu.eudat.convention.ConventionService; import eu.eudat.depositinterface.enums.FieldType; import eu.eudat.depositinterface.models.DescriptionFieldDepositModel; import eu.eudat.file.transformer.models.descriptiontemplate.DescriptionTemplateFileTransformerModel; -import eu.eudat.file.transformer.models.descriptiontemplate.definition.FieldFileTransformerModel; -import eu.eudat.file.transformer.models.descriptiontemplate.definition.FieldSetFileTransformerModel; -import eu.eudat.file.transformer.models.descriptiontemplate.definition.PageFileTransformerModel; -import eu.eudat.file.transformer.models.descriptiontemplate.definition.SectionFileTransformerModel; +import eu.eudat.file.transformer.models.descriptiontemplate.definition.*; import eu.eudat.service.fielddatahelper.FieldDataHelperServiceProvider; import gr.cite.tools.exception.MyApplicationException; import gr.cite.tools.logging.LoggerService; @@ -23,10 +20,7 @@ import org.springframework.beans.factory.config.ConfigurableBeanFactory; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; -import java.util.ArrayList; -import java.util.EnumSet; -import java.util.List; -import java.util.Optional; +import java.util.*; @Component @Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE) @@ -35,6 +29,7 @@ public class DescriptionFieldFileTransformerBuilder extends BaseFileTransformerB private EnumSet authorize = EnumSet.of(AuthorizationFlags.None); private DescriptionTemplateFileTransformerModel definition; private final FieldDataHelperServiceProvider fieldDataHelperServiceProvider; + @Autowired public DescriptionFieldFileTransformerBuilder( ConventionService conventionService, FieldDataHelperServiceProvider fieldDataHelperServiceProvider @@ -110,6 +105,10 @@ public class DescriptionFieldFileTransformerBuilder extends BaseFileTransformerB //models.add(new FileTransformerBuilderItemResponse<>(m, d)); } + for (PageFileTransformerModel page : definition.getDefinition().getPages()) { + page.setSections(calculateSectionVisibility(page.getSections())); + } + this.logger.debug("build {} items", Optional.of(models).map(List::size).orElse(0)); return List.of(new FileTransformerBuilderItemResponse<>(definition, data.get(0))); @@ -158,4 +157,112 @@ public class DescriptionFieldFileTransformerBuilder extends BaseFileTransformerB return result; } + private List calculateSectionVisibility(List sections) { + List result = new ArrayList<>(); + + for (SectionFileTransformerModel section : sections) { + if (section.getSections() != null && !section.getSections().isEmpty()) { + section.setSections(calculateSectionVisibility(section.getSections())); + } + + if (section.getFieldSets() != null && !section.getFieldSets().isEmpty()) { + section.setFieldSets(calculateFieldSetVisibility(section.getFieldSets())); + } + + if ((section.getSections() != null && !section.getSections().isEmpty()) || (section.getFieldSets() != null && !section.getFieldSets().isEmpty())) { + result.add(section); + } + } + + return result; + } + + private List calculateFieldSetVisibility(List fieldSets) { + List result = new ArrayList<>(); + for (FieldSetFileTransformerModel fieldSet : fieldSets) { + if (fieldSet.getFields() != null && !fieldSet.getFields().isEmpty()) { + fieldSet.setFields(calculateFieldVisibility(fieldSet.getFields())); + if (fieldSet.getFields() != null && !fieldSet.getFields().isEmpty()) { + result.add(fieldSet); + } + } + } + return result; + } + + private List calculateFieldVisibility(List fields) { + List result = new ArrayList<>(); + for (FieldFileTransformerModel field : fields) { + if (field.getVisibilityRules() != null && !field.getVisibilityRules().isEmpty()) { + Integer maxChecks = field.getVisibilityRules().size(); + Integer successfulChecks = 0; + for (RuleFileTransformerModel rule : field.getVisibilityRules()) { + FieldFileTransformerModel targetField = findFieldByPages(definition.getDefinition().getPages(), rule.getTarget()); + if (targetField.getData() != null ) { + successfulChecks = targetField.getData().getValue().equals(rule.getValue()) ? successfulChecks + 1 : successfulChecks; + } + } + if (successfulChecks.equals(maxChecks)) { + result.add(field); + } + } else { + result.add(field); + } + } + return result; + } + + private FieldFileTransformerModel findFieldByPages(List pages, String fieldId) { + FieldFileTransformerModel result = null; + for (PageFileTransformerModel page : pages) { + result = findFieldBySections(page.getSections(), fieldId); + if (result != null) { + break; + } + } + return result; + } + + private FieldFileTransformerModel findFieldBySections(List sections, String fieldId) { + FieldFileTransformerModel result = null; + for (SectionFileTransformerModel section : sections) { + if (section.getSections() != null && !section.getSections().isEmpty()) { + result = findFieldBySections(section.getSections(), fieldId); + if (result != null) { + break; + } + } + + if (section.getFieldSets() != null && !section.getFieldSets().isEmpty()) { + result = findFieldByFieldSets(section.getFieldSets(), fieldId); + if (result != null) { + break; + } + } + } + return result; + } + + private FieldFileTransformerModel findFieldByFieldSets(List fieldSets, String fieldId) { + FieldFileTransformerModel result = null; + for (FieldSetFileTransformerModel fieldSet: fieldSets) { + result = findField(fieldSet.getFields(), fieldId); + if (result != null) { + break; + } + } + return result; + } + + private FieldFileTransformerModel findField(List fields, String fieldId) { + FieldFileTransformerModel result = null; + for (FieldFileTransformerModel field: fields) { + if (field.getId().equals(fieldId)) { + result = field; + break; + } + } + return result; + } + } diff --git a/dmp-backend/core/src/main/java/eu/eudat/model/builder/filetransformer/DmpBlueprintFileTransformerBuilder.java b/dmp-backend/core/src/main/java/eu/eudat/model/builder/filetransformer/DmpBlueprintFileTransformerBuilder.java index 71e5de04f..9d85492d7 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/model/builder/filetransformer/DmpBlueprintFileTransformerBuilder.java +++ b/dmp-backend/core/src/main/java/eu/eudat/model/builder/filetransformer/DmpBlueprintFileTransformerBuilder.java @@ -92,6 +92,7 @@ public class DmpBlueprintFileTransformerBuilder extends BaseFileTransformerBuild SectionFileTransformerModel m = new SectionFileTransformerModel(); m.setId(section.getId()); m.setLabel(section.getLabel()); + m.setOrdinal(section.getOrdinal()); m.setDescription(section.getDescription()); m.setFields(mapFields(section.getFields())); m.setHasTemplates(section.getHasTemplates()); diff --git a/dmp-backend/core/src/main/java/eu/eudat/model/builder/filetransformer/DmpFileTransformerBuilder.java b/dmp-backend/core/src/main/java/eu/eudat/model/builder/filetransformer/DmpFileTransformerBuilder.java index 85f8093c1..79daf78c2 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/model/builder/filetransformer/DmpFileTransformerBuilder.java +++ b/dmp-backend/core/src/main/java/eu/eudat/model/builder/filetransformer/DmpFileTransformerBuilder.java @@ -12,6 +12,7 @@ import eu.eudat.file.transformer.models.dmp.DmpFileTransformerModel; import eu.eudat.file.transformer.models.dmp.DmpReferenceFileTransformerModel; import eu.eudat.file.transformer.models.dmp.DmpUserFileTransformerModel; import eu.eudat.file.transformer.models.dmpblueprint.DmpBlueprintFileTransformerModel; +import eu.eudat.file.transformer.models.dmpblueprint.definition.SectionFileTransformerModel; import eu.eudat.file.transformer.models.entitydoi.EntityDoiFileTransformerModel; import eu.eudat.file.transformer.models.user.UserFileTransformerModel; import eu.eudat.model.*; @@ -111,6 +112,11 @@ public class DmpFileTransformerBuilder extends BaseFileTransformerBuilder description.setSectionId(templateSection.getId())); + } + models.add(new FileTransformerBuilderItemResponse<>(m, d)); } this.logger.debug("build {} items", Optional.of(models).map(List::size).orElse(0));