Skip to content

Commit 7b35dbc

Browse files
author
Rafał Ścipień
committed
Closes #2788: Remove render option conditionalRenderingParent, use in ajax disable property to block events
1 parent 5f5c2b3 commit 7b35dbc

6 files changed

Lines changed: 67 additions & 86 deletions

File tree

fairchive-webapp/src/main/java/edu/harvard/iq/dataverse/dataset/metadata/inputRenderer/ConditionalRendering.java

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,24 @@
11
package edu.harvard.iq.dataverse.dataset.metadata.inputRenderer;
22

3+
import com.google.common.base.Strings;
34
import edu.harvard.iq.dataverse.persistence.dataset.DatasetField;
45

56
import java.util.List;
67

8+
/***
9+
* ConditionalRendering can be assigned in two situations:
10+
* * main vocab field which controls the rest. Only datasetFieldName is set
11+
* * fields dependent on main vocab field. Both values must be filled
12+
*/
713
public class ConditionalRendering {
814
private String datasetFieldName;
915
private String renderOnValue;
1016

17+
/***
18+
*
19+
* @param datasetFieldName - dataset field name which will control other fields
20+
* @param renderOnValue - value of datasetFieldName on which given field will be rendered
21+
*/
1122
public ConditionalRendering(String datasetFieldName, String renderOnValue) {
1223
this.datasetFieldName = datasetFieldName;
1324
this.renderOnValue = renderOnValue;
@@ -29,11 +40,30 @@ public void setRenderOnValue(String renderOnValue) {
2940
this.renderOnValue = renderOnValue;
3041
}
3142

43+
/***
44+
* Check subfields for main vocab value which controls rest of fields
45+
* renderOnValue is not set only for vocab field controlling rest of fields
46+
*/
3247
public boolean shouldRender(List<DatasetField> subfields) {
48+
if (Strings.isNullOrEmpty(this.renderOnValue)) {
49+
return true;
50+
}
51+
3352
return subfields.stream()
3453
.filter(df -> df.getDatasetFieldType().getName().equals(this.datasetFieldName))
3554
.findFirst()
3655
.map(df -> this.renderOnValue.equals(df.getValue()))
3756
.orElse(true);
3857
}
58+
59+
/***
60+
* Check if dataset field is responsible for controlling other fields
61+
* eq
62+
* country (parent field which unit, name) <- looking for this field
63+
* unit (render if US)
64+
* name (render if PL)
65+
*/
66+
public boolean controlledBy(DatasetField datasetField) {
67+
return datasetField.getDatasetFieldType().getName().equals(this.datasetFieldName);
68+
}
3969
}

fairchive-webapp/src/main/java/edu/harvard/iq/dataverse/dataset/metadata/inputRenderer/HiddenVocabInputFieldRenderer.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,5 +56,10 @@ public boolean isHidden() {
5656
public List<ControlledVocabularyValue> getDefaultVocabValues() {
5757
return defaultVocabValues;
5858
}
59+
60+
@Override
61+
public boolean showOnCondition(List<DatasetField> subfields) {
62+
return false;
63+
}
5964

6065
}

fairchive-webapp/src/main/java/edu/harvard/iq/dataverse/dataset/metadata/inputRenderer/VocabSelectInputFieldRenderer.java

Lines changed: 12 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,13 @@
11
package edu.harvard.iq.dataverse.dataset.metadata.inputRenderer;
22

3-
import com.google.gson.Gson;
43
import edu.harvard.iq.dataverse.persistence.dataset.DatasetField;
54
import edu.harvard.iq.dataverse.persistence.dataset.InputRendererType;
65
import io.vavr.control.Option;
7-
import io.vavr.control.Try;
8-
import org.primefaces.PrimeFaces;
96

107
import javax.faces.component.UIComponent;
118
import javax.faces.event.AjaxBehaviorEvent;
129
import java.util.List;
10+
import java.util.stream.Collectors;
1311

1412
public class VocabSelectInputFieldRenderer implements InputFieldRenderer {
1513

@@ -20,10 +18,6 @@ public class VocabSelectInputFieldRenderer implements InputFieldRenderer {
2018
*/
2119
private boolean sortByLocalisedStringsOrder = false;
2220

23-
/**
24-
* If true event is attached to refresh div containing this vocab select
25-
*/
26-
private boolean conditionalRenderingParent = false;
2721

2822
private final ConditionalRendering conditionalRendering;
2923

@@ -33,11 +27,9 @@ public class VocabSelectInputFieldRenderer implements InputFieldRenderer {
3327
public VocabSelectInputFieldRenderer(
3428
boolean renderInTwoColumns,
3529
boolean sortByLocalisedStringsOrder,
36-
boolean conditionalRenderingParent,
3730
ConditionalRendering conditionalRendering) {
3831
this.renderInTwoColumns = renderInTwoColumns;
3932
this.sortByLocalisedStringsOrder = sortByLocalisedStringsOrder;
40-
this.conditionalRenderingParent = conditionalRenderingParent;
4133
this.conditionalRendering = conditionalRendering;
4234
}
4335

@@ -83,47 +75,31 @@ public boolean isSortByLocalisedStringsOrder() {
8375
}
8476

8577

86-
public boolean isConditionalRenderingParent() {
87-
return conditionalRenderingParent;
88-
}
89-
9078
// -------------------- LOGIC --------------------
9179

9280
public void processValueChange(AjaxBehaviorEvent event) {
9381
UIComponent component = event.getComponent();
94-
String updateClientId = (String) component.getAttributes().get("updateClientId");
9582
DatasetField datasetField = (DatasetField) component.getAttributes().get("datasetField");
96-
9783
clearSiblingsDatasetFieldValue(datasetField);
98-
// partial refresh of web page
99-
PrimeFaces.current().ajax().update(updateClientId);
84+
}
85+
86+
public boolean hasChangeListener(DatasetField datasetField) {
87+
return this.conditionalRendering != null && this.conditionalRendering.controlledBy(datasetField);
10088
}
10189

10290
private void clearSiblingsDatasetFieldValue(DatasetField vocabDatasetField) {
10391
List<DatasetField> siblingsFields = vocabDatasetField.getDatasetFieldParent()
10492
.getOrElseThrow(() -> new NullPointerException("datasetfield with type: " + vocabDatasetField.getTypeName()
10593
+ " didn't have any parent required for conditional rendering"))
106-
.getDatasetFieldsChildren();
94+
.getDatasetFieldsChildren()
95+
.stream()
96+
.filter(df -> !df.getDatasetFieldType().getName().equals(vocabDatasetField.getDatasetFieldType().getName()))
97+
.collect(Collectors.toList());
10798

99+
// Assume that all subfield will be used in conditional rendering(excluding main vocab)
100+
// If we will need more fields visible all the time this clearing will not work properly
108101
for (DatasetField sibling : siblingsFields) {
109-
VocabSelectInputFieldRendererFactory.VocabularyInputRendererOptions siblingRendererOptions = parseRendererOptions(sibling);
110-
if (hasMatchingConditionalRendering(vocabDatasetField, siblingRendererOptions)) {
111-
sibling.clearValue();
112-
}
102+
sibling.clearValue();
113103
}
114104
}
115-
116-
private VocabSelectInputFieldRendererFactory.VocabularyInputRendererOptions parseRendererOptions(DatasetField field) {
117-
String jsonOptions = field.getDatasetFieldType().getInputRendererOptions();
118-
return Try.of(() -> new Gson().fromJson(jsonOptions,
119-
VocabSelectInputFieldRendererFactory.VocabularyInputRendererOptions.class))
120-
.getOrElseThrow(e -> new InputRendererInvalidConfigException("Invalid syntax of input renderer options: " + jsonOptions, e));
121-
}
122-
123-
private boolean hasMatchingConditionalRendering(
124-
DatasetField current,
125-
VocabSelectInputFieldRendererFactory.VocabularyInputRendererOptions options) {
126-
return options.hasConditionalRendering() &&
127-
current.getDatasetFieldType().getName().equals(options.getConditionalRendering().getDatasetFieldName());
128-
}
129105
}

fairchive-webapp/src/main/java/edu/harvard/iq/dataverse/dataset/metadata/inputRenderer/VocabSelectInputFieldRendererFactory.java

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,6 @@ public VocabSelectInputFieldRenderer createRenderer(DatasetFieldType fieldType,
3535
return new VocabSelectInputFieldRenderer(
3636
rendererOptions.isRenderInTwoColumns(),
3737
rendererOptions.isSortByLocalisedStringsOrder(),
38-
rendererOptions.isConditionalRenderingParent(),
3938
rendererOptions.getConditionalRendering());
4039
}
4140

@@ -47,7 +46,6 @@ public VocabSelectInputFieldRenderer createRenderer(DatasetFieldType fieldType,
4746
public static class VocabularyInputRendererOptions {
4847
private boolean sortByLocalisedStringsOrder = false;
4948
private boolean renderInTwoColumns = true;
50-
private boolean conditionalRenderingParent = false;
5149
private ConditionalRendering conditionalRendering;
5250

5351

@@ -69,10 +67,6 @@ public boolean hasConditionalRendering() {
6967
return conditionalRendering != null;
7068
}
7169

72-
public boolean isConditionalRenderingParent() {
73-
return conditionalRenderingParent;
74-
}
75-
7670
// -------------------- SETTERS --------------------
7771

7872
public void setBySortLocalisedStringsOrder(boolean sortByLocalisedStringsOrder) {

fairchive-webapp/src/main/webapp/WEB-INF/templates/dataset/inputRenderer/controlledVocabInputField.xhtml

Lines changed: 20 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -22,39 +22,26 @@
2222
data-original-title="#{datasetField.datasetFieldType.localeDescription}"></span>
2323
</div>
2424

25-
<ui:fragment rendered="#{inputRenderer.isConditionalRenderingParent()}">
26-
<p:selectOneMenu id="singleVocabularySelectAjax"
27-
value="#{datasetField.singleControlledVocabularyValue}"
28-
converter="controlledVocabularyValueConverter"
29-
style="width: auto !important; max-width:100%; min-width:200px;"
30-
styleClass="form-control primitive"
31-
rendered="#{!datasetField.datasetFieldType.allowMultiples}"
32-
filter="true"
33-
filterMatchMode="contains"
34-
>
35-
<f:selectItem itemLabel="#{bundle.select}" itemValue="" noSelectionOption="true"/>
36-
<f:selectItems value="#{datasetField.datasetFieldType.getControlledVocabSelectItems(inputRenderer.isSortByLocalisedStringsOrder())}" />
37-
<f:attribute name="updateClientId" value=":#{p:resolveClientIds('@id(fieldsByTypeFragment)', view)}" />
38-
<f:attribute name="datasetField" value="#{datasetField}" />
39-
<p:ajax event="change"
40-
listener="#{inputRenderer.processValueChange}"
41-
/>
42-
</p:selectOneMenu>
43-
</ui:fragment>
44-
<ui:fragment rendered="#{not inputRenderer.isConditionalRenderingParent()}">
45-
<p:selectOneMenu id="singleVocabularySelect"
46-
value="#{datasetField.singleControlledVocabularyValue}"
47-
converter="controlledVocabularyValueConverter"
48-
style="width: auto !important; max-width:100%; min-width:200px;"
49-
styleClass="form-control primitive"
50-
rendered="#{!datasetField.datasetFieldType.allowMultiples}"
51-
filter="true"
52-
filterMatchMode="contains"
53-
>
54-
<f:selectItem itemLabel="#{bundle.select}" itemValue="" noSelectionOption="true"/>
55-
<f:selectItems value="#{datasetField.datasetFieldType.getControlledVocabSelectItems(inputRenderer.isSortByLocalisedStringsOrder())}" />
56-
</p:selectOneMenu>
57-
</ui:fragment>
25+
26+
<p:selectOneMenu id="singleVocabularySelect"
27+
value="#{datasetField.singleControlledVocabularyValue}"
28+
converter="controlledVocabularyValueConverter"
29+
style="width: auto !important; max-width:100%; min-width:200px;"
30+
styleClass="form-control primitive"
31+
rendered="#{!datasetField.datasetFieldType.allowMultiples}"
32+
filter="true"
33+
filterMatchMode="contains"
34+
>
35+
<f:selectItem itemLabel="#{bundle.select}" itemValue="" noSelectionOption="true"/>
36+
<f:selectItems value="#{datasetField.datasetFieldType.getControlledVocabSelectItems(inputRenderer.isSortByLocalisedStringsOrder())}" />
37+
<f:attribute name="datasetField" value="#{datasetField}" />
38+
<p:ajax event="change"
39+
listener="#{inputRenderer.processValueChange}"
40+
disabled="#{not inputRenderer.hasChangeListener(datasetField)}"
41+
update=":#{p:resolveClientIds('@id(fieldsByTypeFragment)', view)}"
42+
/>
43+
</p:selectOneMenu>
44+
5845

5946
<p:selectCheckboxMenu id="multiVocabularySelect" rendered="#{datasetField.datasetFieldType.allowMultiples}"
6047
value="#{datasetField.controlledVocabularyValues}" converter="controlledVocabularyValueConverter"

fairchive-webapp/src/test/java/edu/harvard/iq/dataverse/dataset/metadata/inputRenderer/VocabSelectInputFieldRendererFactoryTest.java

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -57,17 +57,6 @@ public void createRenderer__withSortByLocalisedStringsOrderOption() {
5757
assertTrue(renderer.isSortByLocalisedStringsOrder());
5858
}
5959

60-
61-
@Test
62-
public void createRenderer__withConditionalRenderingParentOption() {
63-
// given
64-
JsonObject rendererOptions = TestJsonCreator.stringAsJsonElement("{'conditionalRenderingParent':true}").getAsJsonObject();
65-
// when
66-
VocabSelectInputFieldRenderer renderer = inputFieldRendererFactory.createRenderer(fieldType, rendererOptions);
67-
// then
68-
assertTrue(renderer.isConditionalRenderingParent());
69-
}
70-
7160
@Test
7261
public void createRenderer__withConditionalRenderingOption() {
7362
// given

0 commit comments

Comments
 (0)