Skip to content

Commit 445a46f

Browse files
committed
♻️ Simplified survey display
1 parent c1f27a0 commit 445a46f

2 files changed

Lines changed: 31 additions & 17 deletions

File tree

sormas-backend/src/main/java/de/symeda/sormas/backend/patch/PatchFieldHelper.java

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,21 @@
11
package de.symeda.sormas.backend.patch;
22

33
import java.util.Arrays;
4+
import java.util.Optional;
45
import java.util.Set;
56
import java.util.stream.Collectors;
67
import java.util.stream.Stream;
78

89
import javax.annotation.Nullable;
10+
import javax.ejb.EJB;
911
import javax.enterprise.context.ApplicationScoped;
1012
import javax.inject.Inject;
1113
import javax.validation.constraints.NotNull;
1214

1315
import org.slf4j.Logger;
1416
import org.slf4j.LoggerFactory;
1517

18+
import de.symeda.sormas.api.systemconfiguration.SystemConfigurationValueFacade;
1619
import de.symeda.sormas.api.utils.Tuple;
1720
import de.symeda.sormas.backend.patch.alias.PathAliasHelper;
1821

@@ -30,13 +33,17 @@ public class PatchFieldHelper {
3033
private static final String CLOSING_PARENTHESIS = ")";
3134
private static final String PIPE = "|";
3235

33-
// might be more subtle: person.toto but also *.uuid (or uuid). includes approach ?
34-
// TODO: must be twofold: enforced default fields : technical: uuid, user ... + custom config by admin
35-
private Set<String> forbiddenFields = Set.of("Person.birthdate", "Person.birthdateDD", "Person.birthdateMM", "Person.birthdateYYYY");
36+
public static final String PATCH_FORBIDDEN_FIELDS_CONFIG_KEY = "PATCH_FORBIDDEN_FIELDS";
37+
38+
private static final Set<String> DEFAULT_FORBIDDEN_FIELDS =
39+
Set.of("Person.birthdate", "Person.birthdateDD", "Person.birthdateMM", "Person.birthdateYYYY");
3640

3741
@Inject
3842
private PathAliasHelper pathAliasHelper;
3943

44+
@EJB
45+
private SystemConfigurationValueFacade systemConfigurationValueFacade;
46+
4047
public PatchFieldHelper() {
4148
}
4249

@@ -78,7 +85,6 @@ public PathFailureCause checkIfPathIsInvalid(String path) {
7885
private PathFailureCause checkIfPathIsInvalidImpl(String path, Set<String> additionalSupportedPrefixes) {
7986
PathFailureCause dataPatchFailureCause = null;
8087

81-
// TODO: check it would be required to distinguish read / write: per example Immunization can be read and write but write does not reach this code.
8288
if (!path.contains(PATH_SEPARATOR)) {
8389
dataPatchFailureCause = PathFailureCause.INVALID_PATH_FORMAT;
8490
} else if (!(startsWithAllowedPrefix(path) || pathStartsWithAllowedPrefix(path, additionalSupportedPrefixes))) {
@@ -97,7 +103,18 @@ public Tuple<String, PathFailureCause> resolveAlias(String pathWithPotentialAlia
97103
}
98104

99105
private boolean fieldIsForbidden(String path) {
100-
return forbiddenFields.contains(path);
106+
Set<String> configured = resolveConfiguredForbiddenFields();
107+
return configured.contains(path);
108+
}
109+
110+
private Set<String> resolveConfiguredForbiddenFields() {
111+
String configValue = systemConfigurationValueFacade != null
112+
? systemConfigurationValueFacade.getValue(PATCH_FORBIDDEN_FIELDS_CONFIG_KEY)
113+
: null;
114+
return Optional.ofNullable(configValue)
115+
.filter(v -> !v.isBlank())
116+
.map(v -> Arrays.stream(v.split(",")).map(String::trim).filter(s -> !s.isEmpty()).collect(Collectors.toSet()))
117+
.orElse(DEFAULT_FORBIDDEN_FIELDS);
101118
}
102119

103120
private boolean startsWithAllowedPrefix(String path) {

sormas-ui/src/main/java/de/symeda/sormas/ui/survey/SurveyQuestionnaireWindow.java

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import de.symeda.sormas.api.survey.SurveyTokenReferenceDto;
2828
import de.symeda.sormas.api.survey.external.views.ExternalSurveyView;
2929
import de.symeda.sormas.api.survey.external.views.QuestionAnswersView;
30+
import org.apache.commons.lang3.StringUtils;
3031

3132
/**
3233
* Modal window displaying a survey questionnaire as a structured HTML view.
@@ -97,7 +98,7 @@ private void appendQuestion(StringBuilder sb, QuestionAnswersView q, int depth)
9798
.append(indent)
9899
.append(questionStyle)
99100
.append("\">")
100-
.append(escapeHtml(q.getQuestion()))
101+
.append(q.getQuestion())
101102
.append("</td>")
102103
.append("<td style=\"padding:5px 8px;color:#555;\">")
103104
.append(resolveAnswer(q))
@@ -113,19 +114,15 @@ private void appendQuestion(StringBuilder sb, QuestionAnswersView q, int depth)
113114

114115
private String resolveAnswer(QuestionAnswersView q) {
115116
// Prefer human-readable answerText, fall back to raw answer
116-
if (q.getAnswerText() != null && !q.getAnswerText().isEmpty()) {
117-
return escapeHtml(q.getAnswerText());
117+
String answerText = q.getAnswerText();
118+
if (StringUtils.isNotBlank(answerText)) {
119+
return answerText;
118120
}
119-
if (q.getAnswer() != null && !q.getAnswer().isEmpty()) {
120-
return escapeHtml(q.getAnswer());
121+
String answer = q.getAnswer();
122+
if (StringUtils.isNotBlank(answer)) {
123+
return answer;
121124
}
122-
return "<span style=\"color:#bbb;\">—</span>";
125+
return "<span>—</span>";
123126
}
124127

125-
private String escapeHtml(String text) {
126-
if (text == null) {
127-
return "";
128-
}
129-
return text.replace("&", "&amp;").replace("<", "&lt;").replace(">", "&gt;").replace("\"", "&quot;");
130-
}
131128
}

0 commit comments

Comments
 (0)