From 16beccba5d72db683338464c045abb264feb850b Mon Sep 17 00:00:00 2001 From: Francesco Mangiacrapa Date: Mon, 10 Jun 2019 15:48:28 +0000 Subject: [PATCH] Working on Feature #11331 Field repeatability Updated pom version at 1.6.0 git-svn-id: http://svn.d4science-ii.research-infrastructures.eu/gcube/trunk/portlets/widgets/ckan-metadata-publisher-widget@179748 82a268e6-3cf1-43bd-a215-b396298e98cf --- distro/changelog.xml | 15 +- pom.xml | 2 +- .../client/ui/form/CreateDatasetForm.java | 118 ++++++++----- .../client/ui/form/MetaDataField.java | 160 ++++++++++++++++++ .../client/ui/form/MetaDataField.ui.xml | 22 +++ .../client/ui/metadata/CategoryPanel.java | 23 ++- .../server/utils/MetadataDiscovery.java | 18 ++ .../shared/metadata/MetadataFieldWrapper.java | 95 ++++++++++- 8 files changed, 404 insertions(+), 49 deletions(-) create mode 100644 src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/ui/form/MetaDataField.java create mode 100644 src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/ui/form/MetaDataField.ui.xml diff --git a/distro/changelog.xml b/distro/changelog.xml index 99a3cc5..89f8b54 100644 --- a/distro/changelog.xml +++ b/distro/changelog.xml @@ -1,18 +1,27 @@ + + [Feature #11331] Field repeatability: support for catalogue widget + + - [Feature #13074] Integrated with 'openlayer-basic-widgets' + [Feature #13074] Integrated with 'openlayer-basic-widgets' + - [Bug #12914] The form to add/choice the resources to publishing remains frozen + [Bug #12914] The form to add/choice the resources to + publishing remains frozen - [Incident #12563] Error when trying to publish the content of a workspace folder into the catalogue + [Incident #12563] Error when trying to publish the content of + a workspace folder into the catalogue org.gcube.portlets.widgets ckan-metadata-publisher-widget - 1.5.0-SNAPSHOT + 1.6.0-SNAPSHOT gCube Ckan metadata publisher widget 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 5cc5735..f0b625a 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 @@ -62,7 +62,6 @@ import com.google.gwt.user.client.Window; import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwt.user.client.ui.Anchor; import com.google.gwt.user.client.ui.Composite; -import com.google.gwt.user.client.ui.FlowPanel; import com.google.gwt.user.client.ui.FocusPanel; import com.google.gwt.user.client.ui.HTMLPanel; import com.google.gwt.user.client.ui.HorizontalPanel; @@ -193,8 +192,8 @@ public class CreateDatasetForm extends Composite{ // added custom field entries (by the user) private List customFieldEntriesList = new ArrayList(); - // the list of MetaDataFieldSkeleton added - private List listOfMetadataFields = new ArrayList(); + // the list of MetaDataField added + private List listOfMetadataFields = new ArrayList(); // dataset metadata bean private DatasetBean receivedBean; @@ -713,13 +712,22 @@ public class CreateDatasetForm extends Composite{ if(categories == null || categories.isEmpty()){ for (MetadataFieldWrapper field : fields) { - MetaDataFieldSkeleton fieldWidget; + /*MetaDataFieldSkeleton fieldWidget; try { fieldWidget = new MetaDataFieldSkeleton(field, eventBus); metadataFieldsPanel.add(fieldWidget); listOfMetadataFields.add(fieldWidget); } catch (Exception e) { GWT.log("Unable to build such widget", e); + }*/ + + MetaDataField fieldWidget; + try { + fieldWidget = new MetaDataField(field, eventBus); + metadataFieldsPanel.add(fieldWidget); + listOfMetadataFields.add(fieldWidget); + } catch (Exception e) { + GWT.log("Unable to build such widget", e); } } }else{ @@ -732,13 +740,23 @@ public class CreateDatasetForm extends Composite{ fields.removeAll(fieldsForThisCategory); for (MetadataFieldWrapper metadataFieldWrapper : fieldsForThisCategory) { - MetaDataFieldSkeleton fieldWidget; + + /*MetaDataFieldSkeleton fieldWidget; try { fieldWidget = new MetaDataFieldSkeleton(metadataFieldWrapper, eventBus); cp.addField(fieldWidget); listOfMetadataFields.add(fieldWidget); } catch (Exception e) { GWT.log("Unable to build such widget", e); + }*/ + + MetaDataField fieldWidget; + try { + fieldWidget = new MetaDataField(metadataFieldWrapper, eventBus); + cp.addField(fieldWidget); + listOfMetadataFields.add(fieldWidget); + } catch (Exception e) { + GWT.log("Unable to build such widget", e); } } metadataFieldsPanel.add(cp); @@ -748,13 +766,23 @@ public class CreateDatasetForm extends Composite{ // add the remaining one at the end of the categories CategoryPanel extrasCategory = new CategoryPanel("Other", null); for (MetadataFieldWrapper field : fields) { - MetaDataFieldSkeleton fieldWidget; + + /*MetaDataFieldSkeleton fieldWidget; try { fieldWidget = new MetaDataFieldSkeleton(field, eventBus); extrasCategory.addField(fieldWidget); listOfMetadataFields.add(fieldWidget); } catch (Exception e) { GWT.log("Unable to build such widget", e); + }*/ + + MetaDataField fieldWidget; + try { + fieldWidget = new MetaDataField(field, eventBus); + extrasCategory.addField(fieldWidget); + listOfMetadataFields.add(fieldWidget); + } catch (Exception e) { + GWT.log("Unable to build such widget", e); } } metadataFieldsPanel.add(extrasCategory); @@ -931,31 +959,35 @@ public class CreateDatasetForm extends Composite{ Map> customFieldsMap = new HashMap>(); // prepare custom fields - for (MetaDataFieldSkeleton field : listOfMetadataFields) { - List valuesForField = field.getFieldCurrentValue(); - if(!valuesForField.isEmpty()){ - String key = field.getFieldNameQualified(); - List valuesForThisField = null; - if(customFieldsMap.containsKey(key)) - valuesForThisField = customFieldsMap.get(key); - else - valuesForThisField = new ArrayList(); - - valuesForThisField.addAll(valuesForField); - customFieldsMap.put(key, valuesForThisField); - - // get also tag/group if it is the case for this field - List tagsField = field.getTagFromThisField(); - if(tagsField != null) - tags.addAll(tagsField); - - List groupsTitle = field.getGroupTitleFromThisGroup(); - if(groupsTitle != null){ - for (String groupTitle : groupsTitle) { - if(field.isGroupToForce()) - groupsToForceCreation.add(new OrganizationBean(groupTitle, groupTitle, false, field.isPropagateUp())); - else - groups.add(new OrganizationBean(groupTitle, groupTitle, false, field.isPropagateUp())); + for (MetaDataField metaField : listOfMetadataFields) { + + for (MetaDataFieldSkeleton field : metaField.getListOfMetadataFields()) { + + List valuesForField = field.getFieldCurrentValue(); + if(!valuesForField.isEmpty()){ + String key = field.getFieldNameQualified(); + List valuesForThisField = null; + if(customFieldsMap.containsKey(key)) + valuesForThisField = customFieldsMap.get(key); + else + valuesForThisField = new ArrayList(); + + valuesForThisField.addAll(valuesForField); + customFieldsMap.put(key, valuesForThisField); + + // get also tag/group if it is the case for this field + List tagsField = field.getTagFromThisField(); + if(tagsField != null) + tags.addAll(tagsField); + + List groupsTitle = field.getGroupTitleFromThisGroup(); + if(groupsTitle != null){ + for (String groupTitle : groupsTitle) { + if(field.isGroupToForce()) + groupsToForceCreation.add(new OrganizationBean(groupTitle, groupTitle, false, field.isPropagateUp())); + else + groups.add(new OrganizationBean(groupTitle, groupTitle, false, field.isPropagateUp())); + } } } } @@ -1258,14 +1290,17 @@ public class CreateDatasetForm extends Composite{ */ private String areProfileDataValid() { - for (MetaDataFieldSkeleton field : listOfMetadataFields) { + for (MetaDataField metaField : listOfMetadataFields) { + + for (MetaDataFieldSkeleton field : metaField.getListOfMetadataFields()) { - field.removeError(); - - String error = field.isFieldValueValid(); - if(error != null){ - field.showError(); - return field.getFieldNameOriginal() + " is not valid. Suggestion: " + error; + field.removeError(); + + String error = field.isFieldValueValid(); + if(error != null){ + field.showError(); + return field.getFieldNameOriginal() + " is not valid. Suggestion: " + error; + } } } @@ -1447,8 +1482,11 @@ public class CreateDatasetForm extends Composite{ ce.freeze(); // disable profile fields - for (MetaDataFieldSkeleton field : listOfMetadataFields) { - field.freeze(); + for (MetaDataField metaField : listOfMetadataFields) { + for (MetaDataFieldSkeleton field : metaField.getListOfMetadataFields()) { + field.freeze(); + } + } // freeze table of resources diff --git a/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/ui/form/MetaDataField.java b/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/ui/form/MetaDataField.java new file mode 100644 index 0000000..562f5f6 --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/ui/form/MetaDataField.java @@ -0,0 +1,160 @@ +package org.gcube.portlets.widgets.ckandatapublisherwidget.client.ui.form; + +import java.util.ArrayList; +import java.util.List; + +import org.gcube.portlets.widgets.ckandatapublisherwidget.client.ui.metadata.MetaDataFieldSkeleton; +import org.gcube.portlets.widgets.ckandatapublisherwidget.shared.metadata.MetadataFieldWrapper; + +import com.github.gwtbootstrap.client.ui.Button; +import com.github.gwtbootstrap.client.ui.ControlGroup; +import com.github.gwtbootstrap.client.ui.ControlLabel; +import com.github.gwtbootstrap.client.ui.Label; +import com.google.gwt.core.client.GWT; +import com.google.gwt.event.dom.client.ClickEvent; +import com.google.gwt.event.dom.client.ClickHandler; +import com.google.gwt.event.shared.HandlerManager; +import com.google.gwt.uibinder.client.UiBinder; +import com.google.gwt.uibinder.client.UiField; +import com.google.gwt.user.client.ui.Composite; +import com.google.gwt.user.client.ui.VerticalPanel; +import com.google.gwt.user.client.ui.Widget; + + +/** + * The Class MetaDataField. + * + * @author Francesco Mangiacrapa at ISTI-CNR (francesco.mangiacrapa@isti.cnr.it) + * + * Jun 10, 2019 + */ +public class MetaDataField extends Composite { + + private static MetaDataFieldUiBinder uiBinder = GWT.create(MetaDataFieldUiBinder.class); + + @UiField VerticalPanel panelMetaDataFieldsSkeleton; + + @UiField Label repeatabilityLabel; + + //@UiField ControlGroup cgMetaDataFieldSkeletonFields; + + @UiField Button addFieldButton; + + @UiField Button removeFieldButton; + + private List listOfMetadataFields = new ArrayList(); + + private MetadataFieldWrapper fieldWrapper; + + private HandlerManager eventBus; + + /** + * The Interface MetaDataFieldUiBinder. + * + * @author Francesco Mangiacrapa at ISTI-CNR (francesco.mangiacrapa@isti.cnr.it) + * + * Jun 10, 2019 + */ + interface MetaDataFieldUiBinder extends UiBinder { + } + + + /** + * Instantiates a new meta data field. + * + * @param field the field + * @param eventBus the event bus + * @throws Exception the exception + */ + public MetaDataField(final MetadataFieldWrapper field, HandlerManager eventBus) throws Exception { + initWidget(uiBinder.createAndBindUi(this)); + this.fieldWrapper = field; + this.eventBus = eventBus; + addNewOccurrenceOfField(); + checkAllowedAddField(); + checkAllowedRemoveField(); + + addFieldButton.addClickHandler(new ClickHandler() { + + @Override + public void onClick(ClickEvent event) { + addNewOccurrenceOfField(); + checkAllowedAddField(); + checkAllowedRemoveField(); + } + }); + + removeFieldButton.addClickHandler(new ClickHandler() { + + @Override + public void onClick(ClickEvent event) { + removeLatestOccurrenceOfFiled(); + checkAllowedAddField(); + checkAllowedRemoveField(); + } + }); + + //The field is repeatable + if(field.getMaxOccurs()>1) { + repeatabilityLabel.setVisible(true); + repeatabilityLabel.setText(field.getFieldName()+" repeatability"); + } + } + + + /** + * Check allowed remove field. + */ + private void checkAllowedRemoveField() { + boolean removeCond = fieldWrapper.getMaxOccurs()>1 && listOfMetadataFields.size()>1; + removeFieldButton.setVisible(removeCond); + } + + /** + * Checks if is allowed add occurrence. + */ + private void checkAllowedAddField() { + + boolean repeatibilityCond = fieldWrapper.getMaxOccurs()>1 && listOfMetadataFields.size() getListOfMetadataFields() { + return listOfMetadataFields; + } + +} diff --git a/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/ui/form/MetaDataField.ui.xml b/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/ui/form/MetaDataField.ui.xml new file mode 100644 index 0000000..cada8d0 --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/ui/form/MetaDataField.ui.xml @@ -0,0 +1,22 @@ + + + + .important { + font-weight: bold; + } + + + + + + Repeatability + + + + + \ No newline at end of file diff --git a/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/ui/metadata/CategoryPanel.java b/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/ui/metadata/CategoryPanel.java index 1df7fed..4e5326b 100644 --- a/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/ui/metadata/CategoryPanel.java +++ b/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/client/ui/metadata/CategoryPanel.java @@ -3,6 +3,8 @@ package org.gcube.portlets.widgets.ckandatapublisherwidget.client.ui.metadata; import java.util.ArrayList; import java.util.List; +import org.gcube.portlets.widgets.ckandatapublisherwidget.client.ui.form.MetaDataField; + import com.github.gwtbootstrap.client.ui.PageHeader; import com.google.gwt.core.client.GWT; import com.google.gwt.dom.client.Style.Float; @@ -22,7 +24,9 @@ public class CategoryPanel extends Composite{ @UiField VerticalPanel fieldsPanel; @UiField PageHeader categoryHeader; - private List fieldsForThisCategory; + //private List fieldsForThisCategory; + + private List fieldsForThisCategory; public CategoryPanel() { initWidget(uiBinder.createAndBindUi(this)); @@ -48,7 +52,7 @@ public class CategoryPanel extends Composite{ * Add a field to this widget * @param fieldWidget */ - public void addField(MetaDataFieldSkeleton fieldWidget) { + /*public void addField(MetaDataFieldSkeleton fieldWidget) { if(fieldsForThisCategory == null){ fieldsForThisCategory = new ArrayList(); fieldWidget.setVisible(true); @@ -56,6 +60,21 @@ public class CategoryPanel extends Composite{ } fieldsForThisCategory.add(fieldWidget); fieldsPanel.add(fieldWidget); + }*/ + + + /** + * Add a field to this widget + * @param fieldWidget + */ + public void addField(MetaDataField fieldWidget) { + if(fieldsForThisCategory == null){ + fieldsForThisCategory = new ArrayList(); + fieldWidget.setVisible(true); + fieldsPanel.setVisible(true); + } + fieldsForThisCategory.add(fieldWidget); + fieldsPanel.add(fieldWidget); } } diff --git a/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/server/utils/MetadataDiscovery.java b/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/server/utils/MetadataDiscovery.java index 65125f4..e484f45 100644 --- a/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/server/utils/MetadataDiscovery.java +++ b/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/server/utils/MetadataDiscovery.java @@ -242,6 +242,24 @@ public class MetadataDiscovery { ownerCategory.setFieldsForThisCategory(fieldsPerCategoryN); } } + + //Added by Francesco + int maxOccurs = 1; //Default value is 1. A field should occur once. + if(metadataField.getMaxOccurs()!=null) { + try { + //the field can appear an unlimited number of times. + if(metadataField.getMaxOccurs().equals("*")) { + maxOccurs = Integer.MAX_VALUE; + }else { + //the field must appear N times; + maxOccurs = Integer.parseInt(metadataField.getMaxOccurs()); + } + }catch (Exception e) { + //silent + } + + wrapperObj.setMaxOccurs(maxOccurs); + } fieldsWrapper.add(wrapperObj); } diff --git a/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/shared/metadata/MetadataFieldWrapper.java b/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/shared/metadata/MetadataFieldWrapper.java index db67788..afe4cd9 100644 --- a/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/shared/metadata/MetadataFieldWrapper.java +++ b/src/main/java/org/gcube/portlets/widgets/ckandatapublisherwidget/shared/metadata/MetadataFieldWrapper.java @@ -7,6 +7,8 @@ import java.util.List; /** * The Class MetadataFieldWrapper. * @author Costantino Perciante at ISTI-CNR (costantino.perciante@isti.cnr.it) + * + * @author francesco-mangiacrapa at ISTI-CNR (costantino.perciante@isti.cnr.it) */ public class MetadataFieldWrapper implements Serializable{ @@ -23,6 +25,8 @@ public class MetadataFieldWrapper implements Serializable{ private CategoryWrapper ownerCategory; private FieldAsGroup asGroup; private FieldAsTag asTag; + + private Integer maxOccurs = 1; /** * Instantiates a new metadata field. @@ -36,11 +40,12 @@ public class MetadataFieldWrapper implements Serializable{ * * @param fieldName the field name * @param mandatory the mandatory - * @param DataType the type - * @param defaulValue the defaul value + * @param type the type + * @param defaultValue the default value * @param note the note * @param vocabulary the vocabulary * @param validator the validator + * @param category the category */ public MetadataFieldWrapper( String fieldName, Boolean mandatory, DataTypeWrapper type, @@ -56,6 +61,26 @@ public class MetadataFieldWrapper implements Serializable{ this.validator = validator; this.ownerCategory = category; } + + + + /** + * Gets the max occurs. + * + * @return the max occurs + */ + public Integer getMaxOccurs() { + return maxOccurs; + } + + /** + * Sets the max occurs. + * + * @param maxOccurs the new max occurs + */ + public void setMaxOccurs(Integer maxOccurs) { + this.maxOccurs = maxOccurs; + } /** * Gets the field name. @@ -140,7 +165,7 @@ public class MetadataFieldWrapper implements Serializable{ /** * Sets the defaul value. * - * @param defaulValue the defaulValue to set + * @param defaultValue the new default value */ public void setDefaultValue(String defaultValue) { @@ -177,54 +202,117 @@ public class MetadataFieldWrapper implements Serializable{ this.validator = validator; } + /** + * Gets the type. + * + * @return the type + */ public DataTypeWrapper getType() { return type; } + /** + * Sets the type. + * + * @param type the new type + */ public void setType(DataTypeWrapper type) { this.type = type; } + /** + * Checks if is multi selection. + * + * @return true, if is multi selection + */ public boolean isMultiSelection() { return multiSelection; } + /** + * Sets the multi selection. + * + * @param multiSelection the new multi selection + */ public void setMultiSelection(boolean multiSelection) { this.multiSelection = multiSelection; } + /** + * Gets the owner category. + * + * @return the owner category + */ public CategoryWrapper getOwnerCategory() { return ownerCategory; } + /** + * Sets the owner category. + * + * @param ownerCategory the new owner category + */ public void setOwnerCategory(CategoryWrapper ownerCategory) { this.ownerCategory = ownerCategory; } + /** + * Gets the field name from category. + * + * @return the field name from category + */ public String getFieldNameFromCategory() { return fieldNameFromCategory; } + /** + * Sets the field name from category. + * + * @param fieldNameFromCategory the new field name from category + */ public void setFieldNameFromCategory(String fieldNameFromCategory) { this.fieldNameFromCategory = fieldNameFromCategory; } + /** + * Gets the as group. + * + * @return the as group + */ public FieldAsGroup getAsGroup() { return asGroup; } + /** + * Sets the as group. + * + * @param asGroup the new as group + */ public void setAsGroup(FieldAsGroup asGroup) { this.asGroup = asGroup; } + /** + * Gets the as tag. + * + * @return the as tag + */ public FieldAsTag getAsTag() { return asTag; } + /** + * Sets the as tag. + * + * @param asTag the new as tag + */ public void setAsTag(FieldAsTag asTag) { this.asTag = asTag; } + /* (non-Javadoc) + * @see java.lang.Object#toString() + */ @Override public String toString() { return "MetadataFieldWrapper [" @@ -232,6 +320,7 @@ public class MetadataFieldWrapper implements Serializable{ + (fieldNameFromCategory != null ? "fieldNameFromCategory=" + fieldNameFromCategory + ", " : "") + (mandatory != null ? "mandatory=" + mandatory + ", " : "") + + (maxOccurs != null ? "maxOccurs=" + maxOccurs + ", " : "") + (type != null ? "type=" + type + ", " : "") + (defaultValue != null ? "defaultValue=" + defaultValue + ", " : "")