@@ -627,44 +627,17 @@ public String save() {
627627 if (dataverse .isMetadataBlockRoot () && (mdb .isSelected () || mdb .isRequired ())) {
628628 selectedBlocks .add (mdb );
629629 for (DatasetFieldType dsft : mdb .getDatasetFieldTypes ()) {
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 ;
630+ if (!dsft .isChild ()) {
631+ // Save input level for parent field
632+ saveInputLevels (listDFTIL , dsft , dataverse );
635633
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- }
634+ // Handle child fields
635+ if (dsft .isHasChildren ()) {
636+ for (DatasetFieldType child : dsft .getChildDatasetFieldTypes ()) {
637+ saveInputLevels (listDFTIL , child , dataverse );
638+ }
662639 }
663640 }
664- if ((!dsft .isHasParent () && !dsft .isInclude ())
665- || (dsft .isHasParent () && !dsft .getParentDatasetFieldType ().isInclude ())) {
666- listDFTIL .add (new DataverseFieldTypeInputLevel (dsft , dataverse ,false , false ));
667- }
668641 }
669642 }
670643 }
@@ -1030,27 +1003,11 @@ private void refreshAllMetadataBlocks() {
10301003
10311004 for (DatasetFieldType dsft : mdb .getDatasetFieldTypes ()) {
10321005 if (!dsft .isChild ()) {
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- }
1006+ loadInputLevels (dsft , dataverseIdForInputLevel );
10411007 dsft .setOptionSelectItems (resetSelectItems (dsft ));
10421008 if (dsft .isHasChildren ()) {
10431009 for (DatasetFieldType child : dsft .getChildDatasetFieldTypes ()) {
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- }
1010+ loadInputLevels (child , dataverseIdForInputLevel );
10541011 child .setOptionSelectItems (resetSelectItems (child ));
10551012 }
10561013 }
@@ -1061,6 +1018,22 @@ private void refreshAllMetadataBlocks() {
10611018 setAllMetadataBlocks (retList );
10621019 }
10631020
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+
10641037 public void validateAlias (FacesContext context , UIComponent toValidate , Object value ) {
10651038 if (!StringUtils .isEmpty ((String ) value )) {
10661039 String alias = (String ) value ;
@@ -1337,4 +1310,57 @@ public Set<Entry<String, String>> getPidProviderOptions() {
13371310 }
13381311 return options ;
13391312 }
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+ }
13401366}
0 commit comments