diff --git a/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/ui/form/CreateDatasetForm.java b/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/ui/form/CreateDatasetForm.java index ac8c599..07e0cfa 100644 --- a/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/ui/form/CreateDatasetForm.java +++ b/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/ui/form/CreateDatasetForm.java @@ -318,13 +318,13 @@ public class CreateDatasetForm extends Composite{ authorEmailTextbox.setText(bean.getAuthorEmail()); maintainerTextbox.setText(bean.getAuthorSurname() + " " + bean.getAuthorName()); maintainerEmailTextbox.setText(bean.getMaintainerEmail()); - + setAlertBlock("Retrieving information, please wait...", AlertType.INFO, true); // vocabulary list of tags has preemption List vocabularyTags = bean.getTagsVocabulary(); tagsPanel.setVocabulary(vocabularyTags); - + // retrieve custom fields Map> customFieldsMap = bean.getCustomFields(); @@ -403,7 +403,6 @@ public class CreateDatasetForm extends Composite{ public void onFailure(Throwable arg0) { setAlertBlock("Error while checking if a vocabulary of tags is defined in the selected organization.", AlertType.ERROR, true); - tagsPanel.setVocabulary(null); tagsPanel.setVisible(true); } @@ -932,8 +931,8 @@ public class CreateDatasetForm extends Composite{ // prepare custom fields for (MetaDataFieldSkeleton field : listOfMetadataFields) { - String value = field.getFieldCurrentValue(); - if(!value.isEmpty()){ + List valuesForField = field.getFieldCurrentValue(); + if(!valuesForField.isEmpty()){ String key = field.getFieldNameQualified(); List valuesForThisField = null; if(customFieldsMap.containsKey(key)) @@ -941,20 +940,22 @@ public class CreateDatasetForm extends Composite{ else valuesForThisField = new ArrayList(); - valuesForThisField.add(value); + valuesForThisField.addAll(valuesForField); customFieldsMap.put(key, valuesForThisField); // get also tag/group if it is the case for this field - String tag = field.getTagFromThisField(); - if(tag != null) - tags.add(tag); + List tagsField = field.getTagFromThisField(); + if(tagsField != null) + tags.addAll(tagsField); - String groupTitle = field.getGroupTitleFromThisGroup(); - if(groupTitle != null){ - if(field.isGroupToForce()) - groupsToForceCreation.add(new OrganizationBean(groupTitle, groupTitle, false)); - else - groups.add(new OrganizationBean(groupTitle, groupTitle, false)); + List groupsTitle = field.getGroupTitleFromThisGroup(); + if(groupsTitle != null){ + for (String groupTitle : groupsTitle) { + if(field.isGroupToForce()) + groupsToForceCreation.add(new OrganizationBean(groupTitle, groupTitle, false)); + else + groups.add(new OrganizationBean(groupTitle, groupTitle, false)); + } } } } diff --git a/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/ui/metadata/MetaDataFieldSkeleton.java b/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/ui/metadata/MetaDataFieldSkeleton.java index 340cf87..4bc1d73 100644 --- a/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/ui/metadata/MetaDataFieldSkeleton.java +++ b/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/ui/metadata/MetaDataFieldSkeleton.java @@ -358,7 +358,7 @@ public class MetaDataFieldSkeleton extends Composite{ case Text: case GeoJSON: // validation for geojson will be performed at server side as well TODO - String textAreaValue = getFieldCurrentValue(); + String textAreaValue = getFieldCurrentValue().get(0); if(field.getMandatory()){ @@ -379,7 +379,7 @@ public class MetaDataFieldSkeleton extends Composite{ case Time: - String dateValue = getFieldCurrentValue(); + String dateValue = getFieldCurrentValue().get(0); if(field.getMandatory()){ if(dateValue.isEmpty()) @@ -450,7 +450,7 @@ public class MetaDataFieldSkeleton extends Composite{ // just handle the case of textbox if(holder.getClass().equals(TextBox.class)){ - String textBoxValue = getFieldCurrentValue(); + String textBoxValue = getFieldCurrentValue().get(0); if(field.getMandatory()){ if(!textBoxValue.trim().isEmpty()) if(field.getValidator() == null || field.getValidator().isEmpty()) @@ -466,24 +466,31 @@ public class MetaDataFieldSkeleton extends Composite{ } else{ - String listBoxCurrentValue = getFieldCurrentValue(); + List listboxValues = getFieldCurrentValue(); - // listbox case - if(!field.getMandatory()){ + for (String value : listboxValues) { + if(!field.getMandatory()){ - if(field.getValidator() == null || field.getValidator().isEmpty()) - return null; - else - return checkValidator(listBoxCurrentValue, field.getValidator()) ? null : MALFORMED_ATTRIBUTE; + if(field.getValidator() == null || field.getValidator().isEmpty()) + continue; + else + if(checkValidator(value, field.getValidator())) + continue; + else return MALFORMED_ATTRIBUTE; - }else{ + }else{ - return listBoxCurrentValue == null || listBoxCurrentValue.isEmpty() ? MANDATORY_ATTRIBUTE_MISSING : null; + if(value == null || value.isEmpty()) + return MANDATORY_ATTRIBUTE_MISSING; + else + continue; + } } - } + return null; + default: return null; } @@ -513,47 +520,49 @@ public class MetaDataFieldSkeleton extends Composite{ } /** - * Returns the current value of the field (in case of multiselection Listbox returns - * the values separated by column ','). In case of TimeInterval or TimeList see getTimeIntervalOrTimeListWithoutMissing() + * Returns the current value of the field. In case of TimeInterval or TimeList see getTimeIntervalOrTimeListWithoutMissing() * @return */ - public String getFieldCurrentValue(){ + public List getFieldCurrentValue(){ - String toReturn = ""; + List toReturn = new ArrayList(); + String manipulatedTemp = ""; switch(field.getType()){ case Boolean : - toReturn = ((CheckBox)holder).getValue().toString(); + toReturn.add(((CheckBox)holder).getValue().toString()); break; case Text: case GeoJSON: - toReturn = ((TextArea)holder).getText(); + + toReturn.add(((TextArea)holder).getText()); break; case Time: - toReturn = ((DataTimeBox)holder).getCurrentValue().replaceAll(DataTimeBox.MISSING_RANGE_VALUE_START, ""); // it was a noRange metadata + toReturn.add(((DataTimeBox)holder).getCurrentValue().replaceAll(DataTimeBox.MISSING_RANGE_VALUE_START, "")); // it was a noRange metadata break; case Time_Interval: - toReturn = rangesList.get(0).getCurrentValue().replaceAll(DataTimeBox.MISSING_RANGE_VALUE_START, "").replaceAll(DataTimeBox.MISSING_RANGE_VALUE_END, UPPER_RANGE_NOT_SPECIFIED); + manipulatedTemp = rangesList.get(0).getCurrentValue().replaceAll(DataTimeBox.MISSING_RANGE_VALUE_START, "").replaceAll(DataTimeBox.MISSING_RANGE_VALUE_END, UPPER_RANGE_NOT_SPECIFIED); if(toReturn.equals(DataTimeBox.RANGE_SEPARATOR_START_END + UPPER_RANGE_NOT_SPECIFIED)) - toReturn = ""; + manipulatedTemp = ""; // split to check if the extreme are equals - String[] temp = toReturn.split(DataTimeBox.RANGE_SEPARATOR_START_END); + String[] temp = manipulatedTemp.split(DataTimeBox.RANGE_SEPARATOR_START_END); if(temp[0].equals(temp[1])) - toReturn = temp[0]; + manipulatedTemp = temp[0]; + toReturn.add(manipulatedTemp); break; case Times_ListOf: - toReturn = ""; + manipulatedTemp = ""; for (DataTimeBox elem : rangesList) { String currentRange = elem.getCurrentValue().replaceAll(DataTimeBox.MISSING_RANGE_VALUE_START, "").replaceAll(DataTimeBox.MISSING_RANGE_VALUE_END, UPPER_RANGE_NOT_SPECIFIED); @@ -562,39 +571,39 @@ public class MetaDataFieldSkeleton extends Composite{ String[] splitted = currentRange.split(DataTimeBox.RANGE_SEPARATOR_START_END); if(splitted[0].equals(splitted[1])) - toReturn += (toReturn.isEmpty()) ? splitted[0] : RANGE_SEPARATOR + splitted[0]; + manipulatedTemp += (manipulatedTemp.isEmpty()) ? splitted[0] : RANGE_SEPARATOR + splitted[0]; else - toReturn += (toReturn.isEmpty()) ? splitted[0] + DataTimeBox.RANGE_SEPARATOR_START_END + splitted[1] : + manipulatedTemp += (manipulatedTemp.isEmpty()) ? splitted[0] + DataTimeBox.RANGE_SEPARATOR_START_END + splitted[1] : RANGE_SEPARATOR + splitted[0] + DataTimeBox.RANGE_SEPARATOR_START_END + splitted[1]; } - if(toReturn.endsWith(RANGE_SEPARATOR)) - toReturn = toReturn.substring(0, toReturn.length() - 1); + if(manipulatedTemp.endsWith(RANGE_SEPARATOR)) + manipulatedTemp = manipulatedTemp.substring(0, manipulatedTemp.length() - 1); + toReturn.add(manipulatedTemp); break; case Number: case String: if(holder.getClass().equals(TextBox.class)) - toReturn = ((TextBox)holder).getText(); - else{// listbox case - - boolean first = true; + toReturn.add(((TextBox)holder).getText()); + else{ // handle multiselected case for(int i = 0; i < ((ListBox)holder).getItemCount(); i++){ if(((ListBox)holder).isItemSelected(i)){ - toReturn += first ? ((ListBox)holder).getItemText(i) : ", " + ((ListBox)holder).getItemText(i); - first = false; + toReturn.add(((ListBox)holder).getItemText(i)); } } // if it was not mandatory but there was no choice, returning empty string if(!field.getMandatory()) - if(toReturn.equals("Select " + field.getFieldName())) - toReturn = ""; + if(toReturn.equals("Select " + field.getFieldName())){ + toReturn.clear(); + toReturn.add(""); + } } break; @@ -728,13 +737,17 @@ public class MetaDataFieldSkeleton extends Composite{ * Given the name and the value of this field, return a tag if it is the case. * @return a tag as string */ - public String getTagFromThisField(){ + public List getTagFromThisField(){ FieldAsTag asTag = field.getAsTag(); + List generatedTags = new ArrayList(); if(asTag != null){ - return TaggingGroupingValue.getComposedValue(field.getFieldName(), getFieldCurrentValue(), asTag.getSeparator(), asTag.getTaggingValue()); + List values = getFieldCurrentValue(); + for (String value : values) { + generatedTags.add(TaggingGroupingValue.getComposedValueTag(field.getFieldName(), value, asTag.getSeparator(), asTag.getTaggingValue())); + } + return generatedTags; } - return null; } @@ -742,10 +755,15 @@ public class MetaDataFieldSkeleton extends Composite{ * Given the name and the value of this field, return a group title if it is the case. * @return a tag as string */ - public String getGroupTitleFromThisGroup(){ + public List getGroupTitleFromThisGroup(){ FieldAsGroup asGroup = field.getAsGroup(); + List generatedGroups = new ArrayList(); if(asGroup != null){ - return TaggingGroupingValue.getComposedValue(field.getFieldName(), getFieldCurrentValue(), " ", asGroup.getGroupingValue()); + List values = getFieldCurrentValue(); + for (String value : values) { + generatedGroups.addAll(TaggingGroupingValue.getComposedValueGroup(field.getFieldName(), value, asGroup.getGroupingValue())); + } + return generatedGroups; } return null; } diff --git a/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/ui/metadata/timeandreanges/DataTimeBox.java b/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/ui/metadata/timeandreanges/DataTimeBox.java index 03a056c..4775073 100644 --- a/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/ui/metadata/timeandreanges/DataTimeBox.java +++ b/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/ui/metadata/timeandreanges/DataTimeBox.java @@ -12,6 +12,10 @@ import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.FlowPanel; import com.google.gwt.user.client.ui.Widget; +/** + * Widget for handling date-like fields. + * @author Costantino Perciante at ISTI-CNR (costantino.perciante@isti.cnr.it) + */ public class DataTimeBox extends Composite{ private static DataTimeBoxUiBinder uiBinder = GWT @@ -55,12 +59,12 @@ public class DataTimeBox extends Composite{ singleDataEnd.setVisible(true); singleDataEnd.setWidth("50%"); singleDataStart.setWidth("50%"); - + startRangeTime.setWidth("30%"); endRangeTime.setWidth("30%"); startRangeDate.setWidth("60%"); endRangeDate.setWidth("60%"); - + startRangeDate.setPlaceholder(INSERT_DATE_START_LABEL); endRangeDate.setPlaceholder(INSERT_DATE_END_LABEL); endRangeTime.setPlaceholder(INSERT_TIME_INSTANT_LABEL); diff --git a/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/ui/tags/TagsPanel.java b/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/ui/tags/TagsPanel.java index 9d7f0b2..2473a5f 100644 --- a/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/ui/tags/TagsPanel.java +++ b/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/ui/tags/TagsPanel.java @@ -53,13 +53,14 @@ public class TagsPanel extends Composite{ // tags list private List tagsList = new ArrayList(); + // vocabulary private List vocabulary; public TagsPanel() { initWidget(uiBinder.createAndBindUi(this)); tagsEnterListBox.setVisible(false); - tagsPanel.clear(); tagsList.clear(); + tagsPanel.clear(); } @@ -69,22 +70,21 @@ public class TagsPanel extends Composite{ */ public void setVocabulary(List vocabularyTags) { - tagsEnterListBox.clear(); - tagsPanel.clear(); - tagsList.clear(); - GWT.log("Vocabulary of tags is " + vocabularyTags); - + if(vocabularyTags == null || vocabularyTags.isEmpty()){ + vocabulary = null; tagsEnterListBox.setVisible(false); tagsPanel.setVisible(true); tagsEnterTextBox.setVisible(true); }else{ - + vocabulary = vocabularyTags; + tagsEnterListBox.clear(); + tagsPanel.clear(); + tagsList.clear(); for (String vocabularyTag : vocabularyTags) { tagsEnterListBox.addItem(vocabularyTag, vocabularyTag); } - vocabulary = vocabularyTags; tagsPanel.setVisible(false); tagsEnterTextBox.setVisible(false); tagsEnterListBox.setVisible(true); @@ -256,7 +256,6 @@ public class TagsPanel extends Composite{ * Freeze tags */ public void freeze() { - tagsEnterTextBox.setEnabled(false); tagsEnterListBox.setEnabled(false); for(int i = 0; i < tagsList.size(); i++){ @@ -268,7 +267,6 @@ public class TagsPanel extends Composite{ tagWidget.getWidget(1).removeFromParent(); } - } /** @@ -276,8 +274,6 @@ public class TagsPanel extends Composite{ * @param none */ public void setGroupPanelType(ControlGroupType type) { - tagsInsertGroup.setType(type); - } } \ No newline at end of file diff --git a/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/shared/metadata/TaggingGroupingValue.java b/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/shared/metadata/TaggingGroupingValue.java index f0f2405..24de09c 100644 --- a/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/shared/metadata/TaggingGroupingValue.java +++ b/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/shared/metadata/TaggingGroupingValue.java @@ -1,5 +1,8 @@ package org.gcube.portlets.widgets.ckandatapublisherwidget.shared.metadata; +import java.util.Arrays; +import java.util.List; + /** * Specifies the action to take when a tag or a group must be created from a field. @@ -14,14 +17,14 @@ public enum TaggingGroupingValue { onValue_onFieldName; /** - * Returns the composed value + * Returns the composed value in case of tag * @param name * @param value * @param separator * @param action * @return */ - public static String getComposedValue(String name, String value, String separator, TaggingGroupingValue action){ + public static String getComposedValueTag(String name, String value, String separator, TaggingGroupingValue action){ switch(action){ case onFieldName: @@ -36,5 +39,28 @@ public enum TaggingGroupingValue { } } + + /** + * Returns the composed value in case of group + * @param name + * @param value + * @param separator + * @param action + * @return a list of group names + */ + public static List getComposedValueGroup(String name, String value, TaggingGroupingValue action){ + + switch(action){ + case onFieldName: + return Arrays.asList(name); + case onValue: + return Arrays.asList(value); + case onFieldName_onValue: + case onValue_onFieldName: + return Arrays.asList(value, name); + default: return null; + } + + } }