Skip to content

Commit 2143119

Browse files
authored
Revert "Metadata fields can be "display on create" per collection"
1 parent 1480dbc commit 2143119

27 files changed

Lines changed: 158 additions & 486 deletions

doc/release-notes/10476-display-on-create-field-option.md

Lines changed: 0 additions & 6 deletions
This file was deleted.

doc/sphinx-guides/source/_static/api/dataset-schema.json

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,6 @@
2626
},
2727
"typeName": {
2828
"type": "string"
29-
},
30-
"displayOnCreate": {
31-
"type": "boolean"
3229
}
3330
}
3431
}

doc/sphinx-guides/source/api/native-api.rst

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1116,27 +1116,20 @@ This endpoint expects a JSON with the following format::
11161116
{
11171117
"datasetFieldTypeName": "datasetFieldTypeName1",
11181118
"required": true,
1119-
"include": true,
1120-
"displayOnCreate": null
1119+
"include": true
11211120
},
11221121
{
11231122
"datasetFieldTypeName": "datasetFieldTypeName2",
11241123
"required": true,
1125-
"include": true,
1126-
"displayOnCreate": true
1124+
"include": true
11271125
}
11281126
]
11291127

1130-
.. note::
1131-
Required fields will always be displayed regardless of their displayOnCreate setting, as this is necessary for dataset creation.
1132-
When displayOnCreate is null, the field's default display behavior is used.
1133-
11341128
Parameters:
11351129

11361130
- ``datasetFieldTypeName``: Name of the metadata field
11371131
- ``required``: Whether the field is required (boolean)
11381132
- ``include``: Whether the field is included (boolean)
1139-
- ``displayOnCreate`` (optional): Whether the field is displayed during dataset creation, even when not required (boolean)
11401133

11411134
.. code-block:: bash
11421135

src/main/java/edu/harvard/iq/dataverse/DatasetFieldServiceBean.java

Lines changed: 1 addition & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -941,12 +941,6 @@ private Predicate buildFieldPresentInDataversePredicate(Dataverse dataverse, boo
941941
criteriaBuilder.isTrue(datasetFieldTypeInputLevelJoin.get("required"))
942942
);
943943

944-
// Predicate for displayOnCreate in input level
945-
Predicate displayOnCreateInputLevelPredicate = criteriaBuilder.and(
946-
criteriaBuilder.equal(datasetFieldTypeRoot, datasetFieldTypeInputLevelJoin.get("datasetFieldType")),
947-
criteriaBuilder.isTrue(datasetFieldTypeInputLevelJoin.get("displayOnCreate"))
948-
);
949-
950944
// Create a subquery to check for the absence of a specific DataverseFieldTypeInputLevel.
951945
Subquery<Long> subquery = criteriaQuery.subquery(Long.class);
952946
Root<DataverseFieldTypeInputLevel> subqueryRoot = subquery.from(DataverseFieldTypeInputLevel.class);
@@ -969,19 +963,10 @@ private Predicate buildFieldPresentInDataversePredicate(Dataverse dataverse, boo
969963
// Otherwise, use an always-true predicate (conjunction).
970964
Predicate displayedOnCreatePredicate = onlyDisplayedOnCreate
971965
? criteriaBuilder.or(
972-
// 1. Field marked as displayOnCreate in input level
973-
displayOnCreateInputLevelPredicate,
974-
975-
// 2. Field without input level that is marked as displayOnCreate or required
976-
criteriaBuilder.and(
977-
hasNoInputLevelPredicate,
978-
criteriaBuilder.or(
966+
criteriaBuilder.or(
979967
criteriaBuilder.isTrue(datasetFieldTypeRoot.get("displayOnCreate")),
980968
fieldRequiredInTheInstallation
981-
)
982969
),
983-
984-
// 3. Field required by input level
985970
requiredAsInputLevelPredicate
986971
)
987972
: criteriaBuilder.conjunction();

src/main/java/edu/harvard/iq/dataverse/DatasetFieldType.java

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -273,18 +273,13 @@ public void setValidationFormat(String validationFormat) {
273273
* Determines whether this field type is displayed in the form when creating
274274
* the Dataset (or only later when editing after the initial creation).
275275
*/
276-
@Column(name = "displayoncreate", nullable = true)
277-
private Boolean displayOnCreate;
276+
private boolean displayOnCreate;
278277

279-
public Boolean isDisplayOnCreate() {
278+
public boolean isDisplayOnCreate() {
280279
return displayOnCreate;
281280
}
282281

283-
public Boolean getDisplayOnCreate() {
284-
return displayOnCreate;
285-
}
286-
287-
public void setDisplayOnCreate(Boolean displayOnCreate) {
282+
public void setDisplayOnCreate(boolean displayOnCreate) {
288283
this.displayOnCreate = displayOnCreate;
289284
}
290285

src/main/java/edu/harvard/iq/dataverse/DatasetPage.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1856,7 +1856,6 @@ private void updateDatasetFieldInputLevels() {
18561856
if (dsf != null){
18571857
// Yes, call "setInclude"
18581858
dsf.setInclude(oneDSFieldTypeInputLevel.isInclude());
1859-
dsf.getDatasetFieldType().setDisplayOnCreate(oneDSFieldTypeInputLevel.isDisplayOnCreate());
18601859
// remove from hash
18611860
mapDatasetFields.remove(oneDSFieldTypeInputLevel.getDatasetFieldType().getId());
18621861
}

src/main/java/edu/harvard/iq/dataverse/Dataverse.java

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -438,12 +438,6 @@ public boolean isDatasetFieldTypeInInputLevels(Long datasetFieldTypeId) {
438438
.anyMatch(inputLevel -> inputLevel.getDatasetFieldType().getId().equals(datasetFieldTypeId));
439439
}
440440

441-
public boolean isDatasetFieldTypeDisplayOnCreateAsInputLevel(Long datasetFieldTypeId) {
442-
return dataverseFieldTypeInputLevels.stream()
443-
.anyMatch(inputLevel -> inputLevel.getDatasetFieldType().getId().equals(datasetFieldTypeId)
444-
&& inputLevel.isDisplayOnCreate());
445-
}
446-
447441
public Template getDefaultTemplate() {
448442
return defaultTemplate;
449443
}

src/main/java/edu/harvard/iq/dataverse/DataverseFieldTypeInputLevel.java

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -58,16 +58,14 @@ public class DataverseFieldTypeInputLevel implements Serializable {
5858
private DatasetFieldType datasetFieldType;
5959
private boolean include;
6060
private boolean required;
61-
private boolean displayOnCreate;
6261

6362
public DataverseFieldTypeInputLevel () {}
6463

65-
public DataverseFieldTypeInputLevel (DatasetFieldType fieldType, Dataverse dataverse, boolean required, boolean include, boolean displayOnCreate) {
64+
public DataverseFieldTypeInputLevel (DatasetFieldType fieldType, Dataverse dataverse, boolean required, boolean include) {
6665
this.datasetFieldType = fieldType;
6766
this.dataverse = dataverse;
6867
this.required = required;
6968
this.include = include;
70-
this.displayOnCreate = displayOnCreate;
7169
}
7270

7371
public Long getId() {
@@ -117,14 +115,6 @@ public void setRequired(boolean required) {
117115
this.required = required;
118116
}
119117

120-
public boolean isDisplayOnCreate() {
121-
return displayOnCreate;
122-
}
123-
124-
public void setDisplayOnCreate(boolean displayOnCreate) {
125-
this.displayOnCreate = displayOnCreate;
126-
}
127-
128118
@Override
129119
public boolean equals(Object object) {
130120
// TODO: Warning - this method won't work in the case the id fields are not set

src/main/java/edu/harvard/iq/dataverse/DataverseFieldTypeInputLevelServiceBean.java

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ public void delete(DataverseFieldTypeInputLevel dataverseFieldTypeInputLevel) {
104104
cache.invalidate();
105105
}
106106

107-
public void deleteDataverseFieldTypeInputLevelFor(Dataverse d) {
107+
public void deleteFacetsFor(Dataverse d) {
108108
em.createNamedQuery("DataverseFieldTypeInputLevel.removeByOwnerId")
109109
.setParameter("ownerId", d.getId())
110110
.executeUpdate();
@@ -117,13 +117,4 @@ public void create(DataverseFieldTypeInputLevel dataverseFieldTypeInputLevel) {
117117
em.persist(dataverseFieldTypeInputLevel);
118118
}
119119

120-
public DataverseFieldTypeInputLevel save(DataverseFieldTypeInputLevel inputLevel) {
121-
if (inputLevel.getId() == null) {
122-
em.persist(inputLevel);
123-
return inputLevel;
124-
} else {
125-
return em.merge(inputLevel);
126-
}
127-
}
128-
129120
}

src/main/java/edu/harvard/iq/dataverse/DataversePage.java

Lines changed: 53 additions & 79 deletions
Original file line numberDiff line numberDiff line change
@@ -627,17 +627,44 @@ public String save() {
627627
if (dataverse.isMetadataBlockRoot() && (mdb.isSelected() || mdb.isRequired())) {
628628
selectedBlocks.add(mdb);
629629
for (DatasetFieldType dsft : mdb.getDatasetFieldTypes()) {
630-
if (!dsft.isChild()) {
631-
// Save input level for parent field
632-
saveInputLevels(listDFTIL, dsft, dataverse);
630+
// currently we don't allow input levels for setting an optional field as conditionally required
631+
// so we skip looking at parents (which get set automatically with their children)
632+
if (!dsft.isHasChildren() && dsft.isRequiredDV()) {
633+
boolean addRequiredInputLevels = false;
634+
boolean parentAlreadyAdded = false;
633635

634-
// Handle child fields
635-
if (dsft.isHasChildren()) {
636-
for (DatasetFieldType child : dsft.getChildDatasetFieldTypes()) {
637-
saveInputLevels(listDFTIL, child, dataverse);
638-
}
636+
if (!dsft.isHasParent() && dsft.isInclude()) {
637+
addRequiredInputLevels = !dsft.isRequired();
638+
}
639+
if (dsft.isHasParent() && dsft.getParentDatasetFieldType().isInclude()) {
640+
addRequiredInputLevels = !dsft.isRequired() || !dsft.getParentDatasetFieldType().isRequired();
641+
}
642+
643+
if (addRequiredInputLevels) {
644+
listDFTIL.add(new DataverseFieldTypeInputLevel(dsft, dataverse,true, true));
645+
646+
//also add the parent as required (if it hasn't been added already)
647+
// todo: review needed .equals() methods, then change this to use a Set, in order to simplify code
648+
if (dsft.isHasParent()) {
649+
DataverseFieldTypeInputLevel parentToAdd = new DataverseFieldTypeInputLevel(dsft.getParentDatasetFieldType(), dataverse, true, true);
650+
for (DataverseFieldTypeInputLevel dataverseFieldTypeInputLevel : listDFTIL) {
651+
if (dataverseFieldTypeInputLevel.getDatasetFieldType().getId() == parentToAdd.getDatasetFieldType().getId()) {
652+
parentAlreadyAdded = true;
653+
break;
654+
}
655+
}
656+
if (!parentAlreadyAdded) {
657+
// Only add the parent once. There's a UNIQUE (dataverse_id, datasetfieldtype_id)
658+
// constraint on the dataversefieldtypeinputlevel table we need to avoid.
659+
listDFTIL.add(parentToAdd);
660+
}
661+
}
639662
}
640663
}
664+
if ((!dsft.isHasParent() && !dsft.isInclude())
665+
|| (dsft.isHasParent() && !dsft.getParentDatasetFieldType().isInclude())) {
666+
listDFTIL.add(new DataverseFieldTypeInputLevel(dsft, dataverse,false, false));
667+
}
641668
}
642669
}
643670
}
@@ -1003,11 +1030,27 @@ private void refreshAllMetadataBlocks() {
10031030

10041031
for (DatasetFieldType dsft : mdb.getDatasetFieldTypes()) {
10051032
if (!dsft.isChild()) {
1006-
loadInputLevels(dsft, dataverseIdForInputLevel);
1033+
DataverseFieldTypeInputLevel dsfIl = dataverseFieldTypeInputLevelService.findByDataverseIdDatasetFieldTypeId(dataverseIdForInputLevel, dsft.getId());
1034+
if (dsfIl != null) {
1035+
dsft.setRequiredDV(dsfIl.isRequired());
1036+
dsft.setInclude(dsfIl.isInclude());
1037+
} else {
1038+
dsft.setRequiredDV(dsft.isRequired());
1039+
dsft.setInclude(true);
1040+
}
10071041
dsft.setOptionSelectItems(resetSelectItems(dsft));
10081042
if (dsft.isHasChildren()) {
10091043
for (DatasetFieldType child : dsft.getChildDatasetFieldTypes()) {
1010-
loadInputLevels(child, dataverseIdForInputLevel);
1044+
DataverseFieldTypeInputLevel dsfIlChild = dataverseFieldTypeInputLevelService.findByDataverseIdDatasetFieldTypeId(dataverseIdForInputLevel, child.getId());
1045+
if (dsfIlChild != null) {
1046+
child.setRequiredDV(dsfIlChild.isRequired());
1047+
child.setInclude(dsfIlChild.isInclude());
1048+
} else {
1049+
// in the case of conditionally required (child = true, parent = false)
1050+
// we set this to false; i.e this is the default "don't override" value
1051+
child.setRequiredDV(child.isRequired() && dsft.isRequired());
1052+
child.setInclude(true);
1053+
}
10111054
child.setOptionSelectItems(resetSelectItems(child));
10121055
}
10131056
}
@@ -1018,22 +1061,6 @@ private void refreshAllMetadataBlocks() {
10181061
setAllMetadataBlocks(retList);
10191062
}
10201063

1021-
private void loadInputLevels(DatasetFieldType dsft, Long dataverseIdForInputLevel) {
1022-
DataverseFieldTypeInputLevel dsfIl = dataverseFieldTypeInputLevelService
1023-
.findByDataverseIdDatasetFieldTypeId(dataverseIdForInputLevel, dsft.getId());
1024-
1025-
if (dsfIl != null) {
1026-
dsft.setRequiredDV(dsfIl.isRequired());
1027-
dsft.setInclude(dsfIl.isInclude());
1028-
dsft.setDisplayOnCreate(dsfIl.isDisplayOnCreate());
1029-
} else {
1030-
// If there is no input level, use the default values
1031-
dsft.setRequiredDV(dsft.isRequired());
1032-
dsft.setInclude(true);
1033-
dsft.setDisplayOnCreate(false);
1034-
}
1035-
}
1036-
10371064
public void validateAlias(FacesContext context, UIComponent toValidate, Object value) {
10381065
if (!StringUtils.isEmpty((String) value)) {
10391066
String alias = (String) value;
@@ -1310,57 +1337,4 @@ public Set<Entry<String, String>> getPidProviderOptions() {
13101337
}
13111338
return options;
13121339
}
1313-
1314-
public void updateDisplayOnCreate(Long mdbId, Long dsftId, boolean currentValue) {
1315-
for (MetadataBlock mdb : allMetadataBlocks) {
1316-
if (mdb.getId().equals(mdbId)) {
1317-
for (DatasetFieldType dsft : mdb.getDatasetFieldTypes()) {
1318-
if (dsft.getId().equals(dsftId)) {
1319-
// Update value in memory
1320-
dsft.setDisplayOnCreate(!currentValue);
1321-
1322-
// Update or create input level
1323-
DataverseFieldTypeInputLevel existingLevel = dataverseFieldTypeInputLevelService
1324-
.findByDataverseIdDatasetFieldTypeId(dataverse.getId(), dsftId);
1325-
1326-
if (existingLevel != null) {
1327-
existingLevel.setDisplayOnCreate(!currentValue);
1328-
dataverseFieldTypeInputLevelService.save(existingLevel);
1329-
} else {
1330-
DataverseFieldTypeInputLevel newLevel = new DataverseFieldTypeInputLevel(
1331-
dsft,
1332-
dataverse,
1333-
dsft.isRequiredDV(),
1334-
true, // default include
1335-
!currentValue // new value of displayOnCreate
1336-
);
1337-
dataverseFieldTypeInputLevelService.save(newLevel);
1338-
}
1339-
}
1340-
}
1341-
}
1342-
}
1343-
}
1344-
1345-
private void saveInputLevels(List<DataverseFieldTypeInputLevel> listDFTIL, DatasetFieldType dsft, Dataverse dataverse) {
1346-
// If the field already has an input level, update it
1347-
DataverseFieldTypeInputLevel existingLevel = dataverseFieldTypeInputLevelService
1348-
.findByDataverseIdDatasetFieldTypeId(dataverse.getId(), dsft.getId());
1349-
1350-
if (existingLevel != null) {
1351-
existingLevel.setDisplayOnCreate(dsft.isDisplayOnCreate());
1352-
existingLevel.setInclude(dsft.isInclude());
1353-
existingLevel.setRequired(dsft.isRequiredDV());
1354-
listDFTIL.add(existingLevel);
1355-
} else if (dsft.isInclude() || dsft.isDisplayOnCreate() || dsft.isRequiredDV()) {
1356-
// Only create new input level if there is any specific configuration
1357-
listDFTIL.add(new DataverseFieldTypeInputLevel(
1358-
dsft,
1359-
dataverse,
1360-
dsft.isRequiredDV(),
1361-
dsft.isInclude(),
1362-
dsft.isDisplayOnCreate()
1363-
));
1364-
}
1365-
}
13661340
}

0 commit comments

Comments
 (0)