Skip to content

Commit a3a3ffb

Browse files
authored
Merge pull request #13678 from SORMAS-Foundation/bugfix-13668-symptoms_clear_all
Bugfix Symptoms clear all
2 parents fd910e0 + cf8392a commit a3a3ffb

2 files changed

Lines changed: 125 additions & 16 deletions

File tree

sormas-ui/src/main/java/de/symeda/sormas/ui/symptoms/SymptomsForm.java

Lines changed: 65 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,11 @@
3030

3131
import java.util.ArrayList;
3232
import java.util.Arrays;
33+
import java.util.Collections;
3334
import java.util.Comparator;
3435
import java.util.Date;
3536
import java.util.HashMap;
37+
import java.util.HashSet;
3638
import java.util.List;
3739
import java.util.Map;
3840
import java.util.Optional;
@@ -132,6 +134,9 @@ public class SymptomsForm extends AbstractEditForm<SymptomsDto> {
132134
private static final String TUBERCULOSIS_ONSET_DATE_LOC = "tuberculosisOnsetDateLoc";
133135
private static final String TUBERCULOSIS_CLINICAL_PRESENTATION_DETAILS_LOC = "tuberculosisClinicalPresentationDetailsLoc";
134136

137+
private static final List<String> YES_NO_UNKNOWN_SYMPTOM_FIELD_IDS =
138+
Collections.unmodifiableList(Arrays.asList(PARENT_TIME_OFF_WORK, JAUNDICE_WITHIN_24_HOURS_OF_BIRTH, DATE_OF_ONSET_KNOWN));
139+
135140
private static Map<String, List<String>> symptomGroupMap = new HashMap<>();
136141
public static final String SKIN_RASH_ONSET_DATE_LAYOUT = fluidRowLocs(6, "LBL_SKIN_RASH_ONSET_DATE", 1, "", 5, SKIN_RASH_ONSET_DATE);
137142

@@ -214,6 +219,7 @@ private static String createSymptomGroupLayout(SymptomGroup symptomGroup, String
214219
private final PersonDto person;
215220
private final SymptomsContext symptomsContext;
216221
private final ViewMode viewMode;
222+
217223
private transient List<String> unconditionalSymptomFieldIds;
218224
private List<String> conditionalBleedingSymptomFieldIds;
219225
private List<String> lesionsFieldIds;
@@ -678,6 +684,7 @@ public String getFormattedHtmlMessage() {
678684
COUGH_WITH_HEAMOPTYSIS,
679685
RUNNY_NOSE,
680686
DIFFICULTY_BREATHING,
687+
DIFFICULTY_BREATHING_DURING_MEALS,
681688
CHEST_PAIN,
682689
CONJUNCTIVITIS,
683690
EYE_PAIN_LIGHT_SENSITIVE,
@@ -750,6 +757,7 @@ public String getFormattedHtmlMessage() {
750757
HYPERACTIVITY,
751758
INSOMNIA,
752759
OPISTHOTONUS,
760+
PARADOXICAL_BREATHING,
753761
PARALYSIS,
754762
PARASTHESIA_AROUND_WOUND,
755763
PARESIS,
@@ -766,6 +774,7 @@ public String getFormattedHtmlMessage() {
766774
FEELING_ILL,
767775
SHIVERING,
768776
RESPIRATORY_DISEASE_VENTILATION,
777+
RESPIRATORY_FATIGUE,
769778
FAST_HEART_RATE,
770779
OXYGEN_SATURATION_LOWER_94,
771780
FEVERISHFEELING,
@@ -942,21 +951,12 @@ public String getFormattedHtmlMessage() {
942951
addListenerForOnsetFields(onsetSymptom, onsetDateField);
943952

944953
Button clearAllButton = ButtonHelper.createButton(Captions.actionClearAll, event -> {
945-
for (Object symptomId : unconditionalSymptomFieldIds) {
946-
getFieldGroup().getField(symptomId).setValue(null);
947-
}
948-
for (Object symptomId : conditionalBleedingSymptomFieldIds) {
949-
getFieldGroup().getField(symptomId).setValue(null);
950-
}
951-
for (Object symptomId : lesionsFieldIds) {
952-
getFieldGroup().getField(symptomId).setValue(null);
953-
}
954-
for (Object symptomId : lesionsLocationFieldIds) {
955-
getFieldGroup().getField(symptomId).setValue(null);
956-
}
957-
for (Object symptomId : monkeypoxImageFieldIds) {
958-
getFieldGroup().getField(symptomId).setValue(null);
959-
}
954+
unconditionalSymptomFieldIds.forEach(this::safeClearField);
955+
conditionalBleedingSymptomFieldIds.forEach(this::safeClearField);
956+
lesionsFieldIds.forEach(this::safeClearField);
957+
lesionsLocationFieldIds.forEach(this::safeClearField);
958+
monkeypoxImageFieldIds.forEach(this::safeClearField);
959+
YES_NO_UNKNOWN_SYMPTOM_FIELD_IDS.forEach(this::safeClearField);
960960
}, ValoTheme.BUTTON_LINK);
961961

962962
Button setEmptyToNoButton = createButtonSetClearedToSymptomState(Captions.symptomsSetClearedToNo, SymptomState.NO);
@@ -1420,6 +1420,56 @@ public Button createButtonSetClearedToSymptomState(String caption, SymptomState
14201420
}
14211421
}
14221422
}
1423+
// Clear YesNoUnknown fields - map SymptomState to YesNoUnknown
1424+
YesNoUnknown yesNoValue;
1425+
switch (symptomState) {
1426+
case YES:
1427+
yesNoValue = YesNoUnknown.YES;
1428+
break;
1429+
case NO:
1430+
yesNoValue = YesNoUnknown.NO;
1431+
break;
1432+
case UNKNOWN:
1433+
default:
1434+
yesNoValue = YesNoUnknown.UNKNOWN;
1435+
break;
1436+
}
1437+
YES_NO_UNKNOWN_SYMPTOM_FIELD_IDS.forEach(symptomId -> {
1438+
final Field<Object> field = (Field<Object>) getFieldGroup().getField(symptomId);
1439+
// quit early if the field is not supposed to be set
1440+
if (field == null) {
1441+
return;
1442+
}
1443+
if (!field.isVisible()) {
1444+
return;
1445+
}
1446+
if (field.isReadOnly()) {
1447+
return;
1448+
}
1449+
1450+
final Object value = field.getValue();
1451+
final Set<?> valueSet = value instanceof Set ? (Set<?>) value : null;
1452+
1453+
// non empty value within a set
1454+
if (valueSet != null && !valueSet.isEmpty()) {
1455+
return;
1456+
}
1457+
1458+
// non empty raw value
1459+
if (valueSet == null && value != null) {
1460+
return;
1461+
}
1462+
1463+
// if we have a set as value, add the new value
1464+
if(valueSet != null) {
1465+
safeSetFieldValue(field, Collections.singleton(yesNoValue));
1466+
return;
1467+
}
1468+
1469+
// we have a raw value, set it
1470+
safeSetFieldValue(field, yesNoValue);
1471+
1472+
});
14231473
}, ValoTheme.BUTTON_LINK);
14241474

14251475
return button;

sormas-ui/src/main/java/de/symeda/sormas/ui/utils/AbstractEditForm.java

Lines changed: 60 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -617,9 +617,68 @@ public void setHeading(String heading) {
617617

618618
/**
619619
* List of editable allowed fields,
620+
*
620621
* @return
621622
*/
622-
public List<Field<?>> editableAllowedFields(){
623+
public List<Field<?>> editableAllowedFields() {
623624
return Collections.unmodifiableList(editableAllowedFields);
624625
}
626+
627+
/**
628+
* Clears the field if it is not read-only.
629+
*
630+
* @param field
631+
*/
632+
protected void safeClearField(Field<?> field) {
633+
if (field.isReadOnly()) {
634+
return;
635+
}
636+
field.clear();
637+
}
638+
639+
/**
640+
* Clears the field if it is not read-only.
641+
*
642+
* @param propertyId
643+
*/
644+
protected void safeClearField(String propertyId) {
645+
final Field<?> field = getField(propertyId);
646+
if (field == null) {
647+
return;
648+
}
649+
safeClearField(field);
650+
}
651+
652+
/**
653+
* Sets the field value if it is not read-only.
654+
*
655+
* @param <T>
656+
* @param field
657+
* @param value
658+
* @return
659+
*/
660+
protected <T> T safeSetFieldValue(Field<T> field, T value) {
661+
if (field.isReadOnly()) {
662+
return field.getValue();
663+
}
664+
final T oldValue = field.getValue();
665+
field.setValue(value);
666+
return oldValue;
667+
}
668+
669+
/**
670+
* Sets the field value if it is not read-only.
671+
*
672+
* @param <T>
673+
* @param propertyId
674+
* @param value
675+
* @return
676+
*/
677+
protected <T> T safeSetFieldValue(String propertyId, T value) {
678+
final Field<T> field = getField(propertyId);
679+
if (field == null) {
680+
return null;
681+
}
682+
return safeSetFieldValue(field, value);
683+
}
625684
}

0 commit comments

Comments
 (0)