From 4e87e23d3e17f812b4706791b0f15b8a3de4db04 Mon Sep 17 00:00:00 2001 From: "francesco.mangiacrapa" Date: Thu, 1 Oct 2020 15:56:27 +0200 Subject: [PATCH] starting the implementation --- .classpath | 1 + .project | 19 + .settings/.jsdtscope | 13 + .../com.gwtplugins.gdt.eclipse.core.prefs | 4 + .settings/org.eclipse.jdt.core.prefs | 5 +- .settings/org.eclipse.wst.common.component | 13 + ....eclipse.wst.common.project.facet.core.xml | 8 + ...rg.eclipse.wst.jsdt.ui.superType.container | 1 + .../org.eclipse.wst.jsdt.ui.superType.name | 1 + .settings/org.eclipse.wst.validation.prefs | 2 + pom.xml | 8 +- .../MetadataProfileFormBuilder.gwt.xml | 21 +- .../client/MetadataProfileFormBuilder.java | 15 +- .../MetadataProfileFormBuilderAsync.java | 32 - .../MetadataProfileFormBuilderService.java | 11 +- ...etadataProfileFormBuilderServiceAsync.java | 40 + .../client/events/AddResourceEvent.java | 33 + .../events/AddResourceEventHandler.java | 11 + .../client/events/CloseCreationFormEvent.java | 27 + .../events/CloseCreationFormEventHandler.java | 13 + .../client/events/DeleteCustomFieldEvent.java | 32 + .../events/DeleteCustomFieldEventHandler.java | 11 + .../client/events/DeleteResourceEvent.java | 34 + .../events/DeleteResourceEventHandler.java | 11 + .../client/form/MetaDataField.java | 162 ++ .../client/form/MetaDataField.ui.xml | 24 + .../form/catalogue/CreateDatasetForm.java | 1575 +++++++++++++++++ .../form/catalogue/CreateDatasetForm.ui.xml | 410 +++++ .../form/generic/CreateMetadataForm.java | 861 +++++++++ .../form/generic/CreateMetadataForm.ui.xml | 410 +++++ .../GeoJsonAreaSelectionDialog.java | 208 +++ .../mpformbuilder/client/ui/icons/Images.java | 13 + .../mpformbuilder/client/ui/icons/file.png | Bin 0 -> 1186 bytes .../mpformbuilder/client/ui/icons/folder.png | Bin 0 -> 527 bytes .../client/ui/metadata/CategoryPanel.java | 80 + .../client/ui/metadata/CategoryPanel.ui.xml | 12 + .../client/ui/metadata/CustomFieldEntry.java | 107 ++ .../ui/metadata/CustomFieldEntry.ui.xml | 13 + .../ui/metadata/MetaDataFieldSkeleton.java | 926 ++++++++++ .../ui/metadata/MetaDataFieldSkeleton.ui.xml | 50 + .../ui/resources/AddResourceContainer.java | 37 + .../ui/resources/AddResourceContainer.ui.xml | 8 + .../ui/resources/AddResourceToDataset.java | 189 ++ .../ui/resources/AddResourceToDataset.ui.xml | 110 ++ .../ui/resources/AddedResourcesSummary.java | 159 ++ .../ui/resources/AddedResourcesSummary.ui.xml | 8 + .../client/ui/tags/TagsPanel.java | 279 +++ .../client/ui/tags/TagsPanel.ui.xml | 36 + .../client/ui/timeandranges/DataTimeBox.java | 138 ++ .../ui/timeandranges/DataTimeBox.ui.xml | 30 + .../twincolumnselection/ResourceCellLeft.java | 46 + .../ResourceCellRight.java | 65 + .../twincolumnselection/ResourceInfoForm.java | 143 ++ .../ResourceInfoForm.ui.xml | 88 + .../ShowMorePagerPanel.java | 101 ++ .../TwinColumnSelectionMainPanel.java | 571 ++++++ .../TwinColumnSelectionMainPanel.ui.xml | 58 + .../client/ui/utils/GcubeDialogExtended.java | 155 ++ .../client/ui/utils/InfoIconsLabels.java | 198 +++ .../server/MetadataDiscovery.java | 159 +- ...MetadataProfileFormBuilderServiceImpl.java | 91 +- .../shared/catalogue/DatasetBean.java | 335 ++++ .../shared/catalogue/OrganizationBean.java | 75 + .../shared/catalogue/ResourceElementBean.java | 252 +++ .../MetadataProfileFormBuilder.gwt.xml | 22 +- .../webapp/MetadataProfileFormBuilder.html | 16 +- src/main/webapp/WEB-INF/web.xml | 6 +- 67 files changed, 8340 insertions(+), 252 deletions(-) create mode 100644 .settings/.jsdtscope create mode 100644 .settings/com.gwtplugins.gdt.eclipse.core.prefs create mode 100644 .settings/org.eclipse.wst.common.component create mode 100644 .settings/org.eclipse.wst.common.project.facet.core.xml create mode 100644 .settings/org.eclipse.wst.jsdt.ui.superType.container create mode 100644 .settings/org.eclipse.wst.jsdt.ui.superType.name create mode 100644 .settings/org.eclipse.wst.validation.prefs delete mode 100644 src/main/java/org/gcube/portlets/widgets/mpformbuilder/client/MetadataProfileFormBuilderAsync.java create mode 100644 src/main/java/org/gcube/portlets/widgets/mpformbuilder/client/MetadataProfileFormBuilderServiceAsync.java create mode 100644 src/main/java/org/gcube/portlets/widgets/mpformbuilder/client/events/AddResourceEvent.java create mode 100644 src/main/java/org/gcube/portlets/widgets/mpformbuilder/client/events/AddResourceEventHandler.java create mode 100644 src/main/java/org/gcube/portlets/widgets/mpformbuilder/client/events/CloseCreationFormEvent.java create mode 100644 src/main/java/org/gcube/portlets/widgets/mpformbuilder/client/events/CloseCreationFormEventHandler.java create mode 100644 src/main/java/org/gcube/portlets/widgets/mpformbuilder/client/events/DeleteCustomFieldEvent.java create mode 100644 src/main/java/org/gcube/portlets/widgets/mpformbuilder/client/events/DeleteCustomFieldEventHandler.java create mode 100644 src/main/java/org/gcube/portlets/widgets/mpformbuilder/client/events/DeleteResourceEvent.java create mode 100644 src/main/java/org/gcube/portlets/widgets/mpformbuilder/client/events/DeleteResourceEventHandler.java create mode 100644 src/main/java/org/gcube/portlets/widgets/mpformbuilder/client/form/MetaDataField.java create mode 100644 src/main/java/org/gcube/portlets/widgets/mpformbuilder/client/form/MetaDataField.ui.xml create mode 100644 src/main/java/org/gcube/portlets/widgets/mpformbuilder/client/form/catalogue/CreateDatasetForm.java create mode 100644 src/main/java/org/gcube/portlets/widgets/mpformbuilder/client/form/catalogue/CreateDatasetForm.ui.xml create mode 100644 src/main/java/org/gcube/portlets/widgets/mpformbuilder/client/form/generic/CreateMetadataForm.java create mode 100644 src/main/java/org/gcube/portlets/widgets/mpformbuilder/client/form/generic/CreateMetadataForm.ui.xml create mode 100644 src/main/java/org/gcube/portlets/widgets/mpformbuilder/client/openlayerwidget/GeoJsonAreaSelectionDialog.java create mode 100644 src/main/java/org/gcube/portlets/widgets/mpformbuilder/client/ui/icons/Images.java create mode 100644 src/main/java/org/gcube/portlets/widgets/mpformbuilder/client/ui/icons/file.png create mode 100644 src/main/java/org/gcube/portlets/widgets/mpformbuilder/client/ui/icons/folder.png create mode 100644 src/main/java/org/gcube/portlets/widgets/mpformbuilder/client/ui/metadata/CategoryPanel.java create mode 100644 src/main/java/org/gcube/portlets/widgets/mpformbuilder/client/ui/metadata/CategoryPanel.ui.xml create mode 100644 src/main/java/org/gcube/portlets/widgets/mpformbuilder/client/ui/metadata/CustomFieldEntry.java create mode 100644 src/main/java/org/gcube/portlets/widgets/mpformbuilder/client/ui/metadata/CustomFieldEntry.ui.xml create mode 100644 src/main/java/org/gcube/portlets/widgets/mpformbuilder/client/ui/metadata/MetaDataFieldSkeleton.java create mode 100644 src/main/java/org/gcube/portlets/widgets/mpformbuilder/client/ui/metadata/MetaDataFieldSkeleton.ui.xml create mode 100644 src/main/java/org/gcube/portlets/widgets/mpformbuilder/client/ui/resources/AddResourceContainer.java create mode 100644 src/main/java/org/gcube/portlets/widgets/mpformbuilder/client/ui/resources/AddResourceContainer.ui.xml create mode 100644 src/main/java/org/gcube/portlets/widgets/mpformbuilder/client/ui/resources/AddResourceToDataset.java create mode 100644 src/main/java/org/gcube/portlets/widgets/mpformbuilder/client/ui/resources/AddResourceToDataset.ui.xml create mode 100644 src/main/java/org/gcube/portlets/widgets/mpformbuilder/client/ui/resources/AddedResourcesSummary.java create mode 100644 src/main/java/org/gcube/portlets/widgets/mpformbuilder/client/ui/resources/AddedResourcesSummary.ui.xml create mode 100644 src/main/java/org/gcube/portlets/widgets/mpformbuilder/client/ui/tags/TagsPanel.java create mode 100644 src/main/java/org/gcube/portlets/widgets/mpformbuilder/client/ui/tags/TagsPanel.ui.xml create mode 100644 src/main/java/org/gcube/portlets/widgets/mpformbuilder/client/ui/timeandranges/DataTimeBox.java create mode 100644 src/main/java/org/gcube/portlets/widgets/mpformbuilder/client/ui/timeandranges/DataTimeBox.ui.xml create mode 100644 src/main/java/org/gcube/portlets/widgets/mpformbuilder/client/ui/twincolumnselection/ResourceCellLeft.java create mode 100644 src/main/java/org/gcube/portlets/widgets/mpformbuilder/client/ui/twincolumnselection/ResourceCellRight.java create mode 100644 src/main/java/org/gcube/portlets/widgets/mpformbuilder/client/ui/twincolumnselection/ResourceInfoForm.java create mode 100644 src/main/java/org/gcube/portlets/widgets/mpformbuilder/client/ui/twincolumnselection/ResourceInfoForm.ui.xml create mode 100644 src/main/java/org/gcube/portlets/widgets/mpformbuilder/client/ui/twincolumnselection/ShowMorePagerPanel.java create mode 100644 src/main/java/org/gcube/portlets/widgets/mpformbuilder/client/ui/twincolumnselection/TwinColumnSelectionMainPanel.java create mode 100644 src/main/java/org/gcube/portlets/widgets/mpformbuilder/client/ui/twincolumnselection/TwinColumnSelectionMainPanel.ui.xml create mode 100644 src/main/java/org/gcube/portlets/widgets/mpformbuilder/client/ui/utils/GcubeDialogExtended.java create mode 100644 src/main/java/org/gcube/portlets/widgets/mpformbuilder/client/ui/utils/InfoIconsLabels.java create mode 100644 src/main/java/org/gcube/portlets/widgets/mpformbuilder/shared/catalogue/DatasetBean.java create mode 100644 src/main/java/org/gcube/portlets/widgets/mpformbuilder/shared/catalogue/OrganizationBean.java create mode 100644 src/main/java/org/gcube/portlets/widgets/mpformbuilder/shared/catalogue/ResourceElementBean.java diff --git a/.classpath b/.classpath index 08662b4..2db9c0e 100644 --- a/.classpath +++ b/.classpath @@ -32,6 +32,7 @@ + diff --git a/.project b/.project index 270476f..50a65f1 100644 --- a/.project +++ b/.project @@ -20,10 +20,29 @@ + + com.gwtplugins.gdt.eclipse.core.webAppProjectValidator + + + + + com.gwtplugins.gwt.eclipse.core.gwtProjectValidator + + + + + org.eclipse.wst.validation.validationbuilder + + + + org.eclipse.jem.workbench.JavaEMFNature + org.eclipse.wst.common.modulecore.ModuleCoreNature org.eclipse.jdt.core.javanature org.eclipse.wst.common.project.facet.core.nature org.eclipse.m2e.core.maven2Nature + com.gwtplugins.gwt.eclipse.core.gwtNature + org.eclipse.wst.jsdt.core.jsNature diff --git a/.settings/.jsdtscope b/.settings/.jsdtscope new file mode 100644 index 0000000..f179e11 --- /dev/null +++ b/.settings/.jsdtscope @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/.settings/com.gwtplugins.gdt.eclipse.core.prefs b/.settings/com.gwtplugins.gdt.eclipse.core.prefs new file mode 100644 index 0000000..692248e --- /dev/null +++ b/.settings/com.gwtplugins.gdt.eclipse.core.prefs @@ -0,0 +1,4 @@ +eclipse.preferences.version=1 +lastWarOutDir=/home/francesco-mangiacrapa/git/metadata-profile-form-builder-widget/target/metadata-profile-form-builder-widget-0.1.0-SNAPSHOT +warSrcDir=src/main/webapp +warSrcDirIsOutput=false diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs index 58f03bf..8db228c 100644 --- a/.settings/org.eclipse.jdt.core.prefs +++ b/.settings/org.eclipse.jdt.core.prefs @@ -1,6 +1,9 @@ eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7 org.eclipse.jdt.core.compiler.compliance=1.7 +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning org.eclipse.jdt.core.compiler.release=disabled org.eclipse.jdt.core.compiler.source=1.7 diff --git a/.settings/org.eclipse.wst.common.component b/.settings/org.eclipse.wst.common.component new file mode 100644 index 0000000..fb41ec3 --- /dev/null +++ b/.settings/org.eclipse.wst.common.component @@ -0,0 +1,13 @@ + + + + + + + + uses + + + + + diff --git a/.settings/org.eclipse.wst.common.project.facet.core.xml b/.settings/org.eclipse.wst.common.project.facet.core.xml new file mode 100644 index 0000000..2ad8c36 --- /dev/null +++ b/.settings/org.eclipse.wst.common.project.facet.core.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/.settings/org.eclipse.wst.jsdt.ui.superType.container b/.settings/org.eclipse.wst.jsdt.ui.superType.container new file mode 100644 index 0000000..3bd5d0a --- /dev/null +++ b/.settings/org.eclipse.wst.jsdt.ui.superType.container @@ -0,0 +1 @@ +org.eclipse.wst.jsdt.launching.baseBrowserLibrary \ No newline at end of file diff --git a/.settings/org.eclipse.wst.jsdt.ui.superType.name b/.settings/org.eclipse.wst.jsdt.ui.superType.name new file mode 100644 index 0000000..05bd71b --- /dev/null +++ b/.settings/org.eclipse.wst.jsdt.ui.superType.name @@ -0,0 +1 @@ +Window \ No newline at end of file diff --git a/.settings/org.eclipse.wst.validation.prefs b/.settings/org.eclipse.wst.validation.prefs new file mode 100644 index 0000000..04cad8c --- /dev/null +++ b/.settings/org.eclipse.wst.validation.prefs @@ -0,0 +1,2 @@ +disabled=06target +eclipse.preferences.version=1 diff --git a/pom.xml b/pom.xml index f339ce2..3a636dd 100644 --- a/pom.xml +++ b/pom.xml @@ -13,7 +13,7 @@ org.gcube.portlets.widgets metadata-profile-form-builder-widget - jar + war 0.1.0-SNAPSHOT Metadata Profile Form Builder @@ -67,6 +67,12 @@ ${gwtVersion} provided + + com.google.gwt + gwt-dev + ${gwtVersion} + provided + com.github.gwtbootstrap gwt-bootstrap diff --git a/src/main/java/org/gcube/portlets/widgets/mpformbuilder/MetadataProfileFormBuilder.gwt.xml b/src/main/java/org/gcube/portlets/widgets/mpformbuilder/MetadataProfileFormBuilder.gwt.xml index ecaaf16..a7f617a 100644 --- a/src/main/java/org/gcube/portlets/widgets/mpformbuilder/MetadataProfileFormBuilder.gwt.xml +++ b/src/main/java/org/gcube/portlets/widgets/mpformbuilder/MetadataProfileFormBuilder.gwt.xml @@ -3,18 +3,25 @@ - - - - - - + + + + + + + + + + + + - + diff --git a/src/main/java/org/gcube/portlets/widgets/mpformbuilder/client/MetadataProfileFormBuilder.java b/src/main/java/org/gcube/portlets/widgets/mpformbuilder/client/MetadataProfileFormBuilder.java index dc9725c..042a9f1 100644 --- a/src/main/java/org/gcube/portlets/widgets/mpformbuilder/client/MetadataProfileFormBuilder.java +++ b/src/main/java/org/gcube/portlets/widgets/mpformbuilder/client/MetadataProfileFormBuilder.java @@ -2,8 +2,6 @@ package org.gcube.portlets.widgets.mpformbuilder.client; import com.google.gwt.core.client.EntryPoint; import com.google.gwt.core.client.GWT; -import com.google.gwt.user.client.Window; -import com.google.gwt.user.client.rpc.AsyncCallback; /** * Entry point classes define onModuleLoad(). @@ -19,23 +17,12 @@ public class MetadataProfileFormBuilder implements EntryPoint { /** * Create a remote service proxy to talk to the server-side Greeting service. */ - private final MetadataProfileFormBuilderAsync greetingService = GWT.create(MetadataProfileFormBuilderService.class); + private final MetadataProfileFormBuilderServiceAsync formBuilderService = GWT.create(MetadataProfileFormBuilderService.class); /** * This is the entry point method. */ public void onModuleLoad() { - greetingService.greetServer("Hello World", new AsyncCallback() { - - @Override - public void onSuccess(String result) { - Window.alert(result); - } - - @Override - public void onFailure(Throwable caught) { - } - }); } } diff --git a/src/main/java/org/gcube/portlets/widgets/mpformbuilder/client/MetadataProfileFormBuilderAsync.java b/src/main/java/org/gcube/portlets/widgets/mpformbuilder/client/MetadataProfileFormBuilderAsync.java deleted file mode 100644 index 1439f7c..0000000 --- a/src/main/java/org/gcube/portlets/widgets/mpformbuilder/client/MetadataProfileFormBuilderAsync.java +++ /dev/null @@ -1,32 +0,0 @@ -package org.gcube.portlets.widgets.mpformbuilder.client; - -import com.google.gwt.core.client.GWT; -import com.google.gwt.user.client.rpc.AsyncCallback; - -public interface MetadataProfileFormBuilderAsync { - - /** - * GWT-RPC service asynchronous (client-side) interface - * - * @see org.gcube.portlets.widgets.mpformbuilder.client.MetadataProfileFormBuilderService - */ - void greetServer(java.lang.String name, AsyncCallback callback); - - /** - * Utility class to get the RPC Async interface from client-side code - */ - public static final class Util { - private static MetadataProfileFormBuilderAsync instance; - - public static final MetadataProfileFormBuilderAsync getInstance() { - if (instance == null) { - instance = (MetadataProfileFormBuilderAsync) GWT.create(MetadataProfileFormBuilderService.class); - } - return instance; - } - - private Util() { - // Utility class should not be instantiated - } - } -} diff --git a/src/main/java/org/gcube/portlets/widgets/mpformbuilder/client/MetadataProfileFormBuilderService.java b/src/main/java/org/gcube/portlets/widgets/mpformbuilder/client/MetadataProfileFormBuilderService.java index 9504e82..34daa71 100644 --- a/src/main/java/org/gcube/portlets/widgets/mpformbuilder/client/MetadataProfileFormBuilderService.java +++ b/src/main/java/org/gcube/portlets/widgets/mpformbuilder/client/MetadataProfileFormBuilderService.java @@ -1,12 +1,19 @@ package org.gcube.portlets.widgets.mpformbuilder.client; +import java.util.List; + +import org.gcube.portlets.widgets.mpformbuilder.shared.metadata.MetaDataProfileBean; + import com.google.gwt.user.client.rpc.RemoteService; import com.google.gwt.user.client.rpc.RemoteServiceRelativePath; /** * The client side stub for the RPC service. */ -@RemoteServiceRelativePath("greet") +@RemoteServiceRelativePath("mpformbuilderservice") public interface MetadataProfileFormBuilderService extends RemoteService { - String greetServer(String name) throws IllegalArgumentException; + + List getProfilesInTheScope(String scope, String genericResourceSecondaryType) throws Exception; + + MetaDataProfileBean getProfileForMetadata(String metadata) throws Exception; } diff --git a/src/main/java/org/gcube/portlets/widgets/mpformbuilder/client/MetadataProfileFormBuilderServiceAsync.java b/src/main/java/org/gcube/portlets/widgets/mpformbuilder/client/MetadataProfileFormBuilderServiceAsync.java new file mode 100644 index 0000000..c9daa12 --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/mpformbuilder/client/MetadataProfileFormBuilderServiceAsync.java @@ -0,0 +1,40 @@ +package org.gcube.portlets.widgets.mpformbuilder.client; + +import java.util.List; + +import org.gcube.portlets.widgets.mpformbuilder.shared.metadata.MetaDataProfileBean; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.user.client.rpc.AsyncCallback; + +public interface MetadataProfileFormBuilderServiceAsync { + + /** + * GWT-RPC service asynchronous (client-side) interface + * + * @see org.gcube.portlets.widgets.mpformbuilder.client.MetadataProfileFormBuilderService + */ + + void getProfilesInTheScope(String scope, String genericResourceSecondaryType, AsyncCallback> callback); + + void getProfileForMetadata(String metadata, + AsyncCallback callback); + + /** + * Utility class to get the RPC Async interface from client-side code + */ + public static final class Util { + private static MetadataProfileFormBuilderServiceAsync instance; + + public static final MetadataProfileFormBuilderServiceAsync getInstance() { + if (instance == null) { + instance = (MetadataProfileFormBuilderServiceAsync) GWT.create(MetadataProfileFormBuilderService.class); + } + return instance; + } + + private Util() { + // Utility class should not be instantiated + } + } +} diff --git a/src/main/java/org/gcube/portlets/widgets/mpformbuilder/client/events/AddResourceEvent.java b/src/main/java/org/gcube/portlets/widgets/mpformbuilder/client/events/AddResourceEvent.java new file mode 100644 index 0000000..f0485cc --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/mpformbuilder/client/events/AddResourceEvent.java @@ -0,0 +1,33 @@ +package org.gcube.portlets.widgets.mpformbuilder.client.events; + +import org.gcube.portlets.widgets.mpformbuilder.shared.catalogue.ResourceElementBean; + +import com.google.gwt.event.shared.GwtEvent; + +/** + * Added resource event + * @author Costantino Perciante at ISTI-CNR (costantino.perciante@isti.cnr.it) + */ +public class AddResourceEvent extends GwtEvent { + public static Type TYPE = new Type(); + + private ResourceElementBean resource; + + public AddResourceEvent(ResourceElementBean resource) { + this.resource = resource; + } + + public ResourceElementBean getResource() { + return resource; + } + + @Override + public Type getAssociatedType() { + return TYPE; + } + + @Override + protected void dispatch(AddResourceEventHandler handler) { + handler.onAddedResource(this); + } +} diff --git a/src/main/java/org/gcube/portlets/widgets/mpformbuilder/client/events/AddResourceEventHandler.java b/src/main/java/org/gcube/portlets/widgets/mpformbuilder/client/events/AddResourceEventHandler.java new file mode 100644 index 0000000..f73c2d5 --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/mpformbuilder/client/events/AddResourceEventHandler.java @@ -0,0 +1,11 @@ +package org.gcube.portlets.widgets.mpformbuilder.client.events; + +import com.google.gwt.event.shared.EventHandler; + +/** + * Added resource handler interface + * @author Costantino Perciante at ISTI-CNR (costantino.perciante@isti.cnr.it) + */ +public interface AddResourceEventHandler extends EventHandler { + void onAddedResource(AddResourceEvent addResourceEvent); +} diff --git a/src/main/java/org/gcube/portlets/widgets/mpformbuilder/client/events/CloseCreationFormEvent.java b/src/main/java/org/gcube/portlets/widgets/mpformbuilder/client/events/CloseCreationFormEvent.java new file mode 100644 index 0000000..1f0a215 --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/mpformbuilder/client/events/CloseCreationFormEvent.java @@ -0,0 +1,27 @@ +package org.gcube.portlets.widgets.mpformbuilder.client.events; + +import com.google.gwt.event.shared.GwtEvent; + +/** + * Called on close form. + * @author Costantino Perciante at ISTI-CNR (costantino.perciante@isti.cnr.it) + */ +public class CloseCreationFormEvent extends GwtEvent{ + + public static Type TYPE = new Type(); + + public CloseCreationFormEvent() { + super(); + } + + @Override + public Type getAssociatedType() { + return TYPE; + } + + @Override + protected void dispatch(CloseCreationFormEventHandler handler) { + handler.onClose(this); + } + +} diff --git a/src/main/java/org/gcube/portlets/widgets/mpformbuilder/client/events/CloseCreationFormEventHandler.java b/src/main/java/org/gcube/portlets/widgets/mpformbuilder/client/events/CloseCreationFormEventHandler.java new file mode 100644 index 0000000..203d211 --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/mpformbuilder/client/events/CloseCreationFormEventHandler.java @@ -0,0 +1,13 @@ +package org.gcube.portlets.widgets.mpformbuilder.client.events; + +import com.google.gwt.event.shared.EventHandler; + +/** + * Close event handler interface + * @author Costantino Perciante at ISTI-CNR + * (costantino.perciante@isti.cnr.it) + * + */ +public interface CloseCreationFormEventHandler extends EventHandler { + void onClose(CloseCreationFormEvent event); +} diff --git a/src/main/java/org/gcube/portlets/widgets/mpformbuilder/client/events/DeleteCustomFieldEvent.java b/src/main/java/org/gcube/portlets/widgets/mpformbuilder/client/events/DeleteCustomFieldEvent.java new file mode 100644 index 0000000..41d01ab --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/mpformbuilder/client/events/DeleteCustomFieldEvent.java @@ -0,0 +1,32 @@ +package org.gcube.portlets.widgets.mpformbuilder.client.events; +import org.gcube.portlets.widgets.mpformbuilder.client.ui.metadata.CustomFieldEntry; + +import com.google.gwt.event.shared.GwtEvent; + +/** + * Delete custom field event. + * @author Costantino Perciante at ISTI-CNR (costantino.perciante@isti.cnr.it) + */ +public class DeleteCustomFieldEvent extends GwtEvent { + public static Type TYPE = new Type(); + + private CustomFieldEntry removedEntry; + + public DeleteCustomFieldEvent(CustomFieldEntry removedEntry) { + this.removedEntry = removedEntry; + } + + public CustomFieldEntry getRemovedEntry() { + return removedEntry; + } + + @Override + public Type getAssociatedType() { + return TYPE; + } + + @Override + protected void dispatch(DeleteCustomFieldEventHandler handler) { + handler.onRemoveEntry(this); + } +} diff --git a/src/main/java/org/gcube/portlets/widgets/mpformbuilder/client/events/DeleteCustomFieldEventHandler.java b/src/main/java/org/gcube/portlets/widgets/mpformbuilder/client/events/DeleteCustomFieldEventHandler.java new file mode 100644 index 0000000..a8db9df --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/mpformbuilder/client/events/DeleteCustomFieldEventHandler.java @@ -0,0 +1,11 @@ +package org.gcube.portlets.widgets.mpformbuilder.client.events; + +import com.google.gwt.event.shared.EventHandler; + +/** + * Handler associated to the DeleteCustomFieldEvent + * @author Costantino Perciante at ISTI-CNR (costantino.perciante@isti.cnr.it) + */ +public interface DeleteCustomFieldEventHandler extends EventHandler { + void onRemoveEntry(DeleteCustomFieldEvent event); +} diff --git a/src/main/java/org/gcube/portlets/widgets/mpformbuilder/client/events/DeleteResourceEvent.java b/src/main/java/org/gcube/portlets/widgets/mpformbuilder/client/events/DeleteResourceEvent.java new file mode 100644 index 0000000..c528579 --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/mpformbuilder/client/events/DeleteResourceEvent.java @@ -0,0 +1,34 @@ +package org.gcube.portlets.widgets.mpformbuilder.client.events; + +import org.gcube.portlets.widgets.mpformbuilder.shared.catalogue.ResourceElementBean; + +import com.google.gwt.event.shared.GwtEvent; + +/** + * Deleted resource event. + * @author Costantino Perciante at ISTI-CNR (costantino.perciante@isti.cnr.it) + */ +public class DeleteResourceEvent extends GwtEvent { + public static Type TYPE = new Type(); + + private ResourceElementBean resource; + + public DeleteResourceEvent(ResourceElementBean resource) { + this.resource = resource; + } + + public ResourceElementBean getResource() { + return resource; + } + + @Override + public Type getAssociatedType() { + return TYPE; + } + + @Override + protected void dispatch(DeleteResourceEventHandler handler) { + handler.onDeletedResource(this); + } + +} diff --git a/src/main/java/org/gcube/portlets/widgets/mpformbuilder/client/events/DeleteResourceEventHandler.java b/src/main/java/org/gcube/portlets/widgets/mpformbuilder/client/events/DeleteResourceEventHandler.java new file mode 100644 index 0000000..f972473 --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/mpformbuilder/client/events/DeleteResourceEventHandler.java @@ -0,0 +1,11 @@ +package org.gcube.portlets.widgets.mpformbuilder.client.events; + +import com.google.gwt.event.shared.EventHandler; + +/** + * The delete event handler + * @author Costantino Perciante at ISTI-CNR (costantino.perciante@isti.cnr.it) + */ +public interface DeleteResourceEventHandler extends EventHandler{ + void onDeletedResource(DeleteResourceEvent deleteResourceEvent); +} diff --git a/src/main/java/org/gcube/portlets/widgets/mpformbuilder/client/form/MetaDataField.java b/src/main/java/org/gcube/portlets/widgets/mpformbuilder/client/form/MetaDataField.java new file mode 100644 index 0000000..d76f144 --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/mpformbuilder/client/form/MetaDataField.java @@ -0,0 +1,162 @@ +package org.gcube.portlets.widgets.mpformbuilder.client.form; + +import java.util.ArrayList; +import java.util.List; + +import org.gcube.portlets.widgets.mpformbuilder.client.ui.metadata.MetaDataFieldSkeleton; +import org.gcube.portlets.widgets.mpformbuilder.shared.metadata.MetadataFieldWrapper; + +import com.github.gwtbootstrap.client.ui.Button; +import com.github.gwtbootstrap.client.ui.Label; +import com.github.gwtbootstrap.client.ui.constants.LabelType; +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.setType(LabelType.INFO); + addFieldButton.setTitle("Add another "+field.getFieldName()); + removeFieldButton.setTitle("Remove latest "+field.getFieldName()); +// String maxTxt = field.getMaxOccurs()==Integer.MAX_VALUE?"":"(max occurs declared are "+field.getMaxOccurs()+" times)"; + } + } + + + /** + * 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/mpformbuilder/client/form/MetaDataField.ui.xml b/src/main/java/org/gcube/portlets/widgets/mpformbuilder/client/form/MetaDataField.ui.xml new file mode 100644 index 0000000..eaf8b01 --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/mpformbuilder/client/form/MetaDataField.ui.xml @@ -0,0 +1,24 @@ + + + + .margin-left-max-occurrs { + padding-left: 50px; + } + + + + + + + Repeatable field + + + + + + \ No newline at end of file diff --git a/src/main/java/org/gcube/portlets/widgets/mpformbuilder/client/form/catalogue/CreateDatasetForm.java b/src/main/java/org/gcube/portlets/widgets/mpformbuilder/client/form/catalogue/CreateDatasetForm.java new file mode 100644 index 0000000..aef4a3b --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/mpformbuilder/client/form/catalogue/CreateDatasetForm.java @@ -0,0 +1,1575 @@ +//package org.gcube.portlets.widgets.mpformbuilder.client.form.catalogue; +// +//import java.util.ArrayList; +//import java.util.HashMap; +//import java.util.HashSet; +//import java.util.Iterator; +//import java.util.List; +//import java.util.Map; +//import java.util.Map.Entry; +//import java.util.Set; +// +//import org.gcube.portlets.widgets.mpformbuilder.client.MetadataProfileFormBuilderServiceAsync; +//import org.gcube.portlets.widgets.mpformbuilder.client.MetadataProfileFormBuilderService; +//import org.gcube.portlets.widgets.mpformbuilder.client.events.CloseCreationFormEvent; +//import org.gcube.portlets.widgets.mpformbuilder.client.events.CloseCreationFormEventHandler; +//import org.gcube.portlets.widgets.mpformbuilder.client.events.DeleteCustomFieldEvent; +//import org.gcube.portlets.widgets.mpformbuilder.client.events.DeleteCustomFieldEventHandler; +//import org.gcube.portlets.widgets.mpformbuilder.client.form.MetaDataField; +//import org.gcube.portlets.widgets.mpformbuilder.client.ui.metadata.CategoryPanel; +//import org.gcube.portlets.widgets.mpformbuilder.client.ui.metadata.CustomFieldEntry; +//import org.gcube.portlets.widgets.mpformbuilder.client.ui.metadata.MetaDataFieldSkeleton; +//import org.gcube.portlets.widgets.mpformbuilder.client.ui.resources.AddResourceContainer; +//import org.gcube.portlets.widgets.mpformbuilder.client.ui.resources.AddResourceToDataset; +//import org.gcube.portlets.widgets.mpformbuilder.client.ui.resources.AddedResourcesSummary; +//import org.gcube.portlets.widgets.mpformbuilder.client.ui.tags.TagsPanel; +//import org.gcube.portlets.widgets.mpformbuilder.client.ui.twincolumnselection.TwinColumnSelectionMainPanel; +//import org.gcube.portlets.widgets.mpformbuilder.client.ui.utils.InfoIconsLabels; +//import org.gcube.portlets.widgets.mpformbuilder.shared.catalogue.DatasetBean; +//import org.gcube.portlets.widgets.mpformbuilder.shared.catalogue.OrganizationBean; +//import org.gcube.portlets.widgets.mpformbuilder.shared.license.LicenseBean; +//import org.gcube.portlets.widgets.mpformbuilder.shared.metadata.CategoryWrapper; +//import org.gcube.portlets.widgets.mpformbuilder.shared.metadata.MetaDataProfileBean; +//import org.gcube.portlets.widgets.mpformbuilder.shared.metadata.MetadataFieldWrapper; +// +//import com.github.gwtbootstrap.client.ui.AlertBlock; +//import com.github.gwtbootstrap.client.ui.Button; +//import com.github.gwtbootstrap.client.ui.ControlGroup; +//import com.github.gwtbootstrap.client.ui.Form; +//import com.github.gwtbootstrap.client.ui.Icon; +//import com.github.gwtbootstrap.client.ui.ListBox; +//import com.github.gwtbootstrap.client.ui.Paragraph; +//import com.github.gwtbootstrap.client.ui.Popover; +//import com.github.gwtbootstrap.client.ui.Tab; +//import com.github.gwtbootstrap.client.ui.TabPanel; +//import com.github.gwtbootstrap.client.ui.TextArea; +//import com.github.gwtbootstrap.client.ui.TextBox; +//import com.github.gwtbootstrap.client.ui.constants.AlertType; +//import com.github.gwtbootstrap.client.ui.constants.ControlGroupType; +//import com.github.gwtbootstrap.client.ui.resources.Bootstrap.Tabs; +//import com.google.gwt.core.client.GWT; +//import com.google.gwt.dom.client.SelectElement; +//import com.google.gwt.dom.client.Style.Unit; +//import com.google.gwt.event.dom.client.ChangeEvent; +//import com.google.gwt.event.dom.client.ChangeHandler; +//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.uibinder.client.UiHandler; +//import com.google.gwt.user.client.Timer; +//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.FocusPanel; +//import com.google.gwt.user.client.ui.HTMLPanel; +//import com.google.gwt.user.client.ui.HorizontalPanel; +//import com.google.gwt.user.client.ui.SimplePanel; +//import com.google.gwt.user.client.ui.VerticalPanel; +//import com.google.gwt.user.client.ui.Widget; +// +///** +// * Create metadata form for ckan product. +// * @author Costantino Perciante at ISTI-CNR (costantino.perciante@isti.cnr.it) +// */ +//public class CreateDatasetForm extends Composite{ +// +// private static EditMetadataFormUiBinder uiBinder = GWT +// .create(EditMetadataFormUiBinder.class); +// +// interface EditMetadataFormUiBinder extends +// UiBinder { +// } +// +// @UiField HTMLPanel createDatasetMainPanel; +// @UiField TextBox titleTextBox; +// @UiField TextArea descriptionTextarea; +// @UiField ListBox licenseListbox; +// @UiField ListBox visibilityListbox; +// @UiField ListBox organizationsListbox; +// @UiField TextBox versionTextbox; +// @UiField TextBox authorTextbox; +// @UiField TextBox authorEmailTextbox; +// @UiField TextBox maintainerTextbox; +// @UiField TextBox maintainerEmailTextbox; +// @UiField ControlGroup customFields; +// @UiField Button addCustomFieldButton; +// @UiField Button createButton; +// @UiField Button resetButton; +// @UiField AlertBlock infoBlock; +// @UiField AlertBlock alertNoResources; +// @UiField AlertBlock onContinueAlertBlock; +// @UiField AlertBlock onCreateAlertBlock; +// @UiField VerticalPanel metadataFieldsPanel; +// @UiField ListBox metadataTypeListbox; +// @UiField Form formFirstStep; +// @UiField Form formSecondStep; +// @UiField Form formThirdStep; +// @UiField Button continueButton; +// @UiField Button goBackButtonSecondStep; +// @UiField Paragraph selectedProfile; +// @UiField Button goToDatasetButton; +// @UiField HorizontalPanel goToDatasetButtonPanel; +// @UiField Button addResourcesButton; +// @UiField SimplePanel workspaceResourcesContainer; +// @UiField Button continueThirdStep; +// @UiField Button goBackButtonFirstStep; +// @UiField Anchor licenseUrlAnchor; +// @UiField Paragraph unavailableUrl; +// @UiField TagsPanel tagsPanel; +// @UiField ListBox groupsListbox; +// +// // info panels +// @UiField Icon infoIconLicenses; +// @UiField FocusPanel focusPanelLicenses; +// @UiField Popover popoverLicenses; +// @UiField Icon infoIconVisibility; +// @UiField FocusPanel focusPanelVisibility; +// @UiField Popover popoverVisibility; +// @UiField Icon infoIconAuthor; +// @UiField FocusPanel focusPanelAuthor; +// @UiField Popover popoverAuthor; +// @UiField Icon infoIconMaintainerEmail; +// @UiField FocusPanel focusPanelMaintainerEmail; +// @UiField Popover popoverMaintainerEmail; +// @UiField Icon infoIconAuthorEmail; +// @UiField FocusPanel focusPanelAuthorEmail; +// @UiField Popover popoverAuthorEmail; +// @UiField Icon infoIconTypes; +// @UiField FocusPanel focusPanelTypes; +// @UiField Popover popoverTypes; +// @UiField Icon infoIconMaintainer; +// @UiField FocusPanel focusPanelMaintainer; +// @UiField Popover popoverMaintainer; +// @UiField Icon infoIconCustomFields; +// @UiField FocusPanel focusPanelCustomFields; +// @UiField Popover popoverCustomFields; +// @UiField Icon infoIconResources; +// @UiField FocusPanel focusPanelResources; +// @UiField Popover popoverResources; +// @UiField Icon infoIconTitle; +// @UiField FocusPanel focusPanelTitle; +// @UiField Popover popoverGroups; +// @UiField Icon infoIconGroups; +// @UiField FocusPanel focusPanelGroups; +// @UiField Popover popoverTitle; +// @UiField Icon infoIconDescription; +// @UiField Popover popoverDescription; +// @UiField FocusPanel focusPanelDescription; +// @UiField ControlGroup metadataTypesControlGroup; +// @UiField ControlGroup productTitleGroup; +// @UiField ControlGroup maintainerControlGroup; +// @UiField ControlGroup versionControlGroup; +// @UiField ControlGroup organizationsGroup; +// @UiField ControlGroup groupsControlGroup; +// +// private final MetadataProfileFormBuilderServiceAsync formBuilderService = GWT.create(MetadataProfileFormBuilderService.class); +// +// private static final String REGEX_TITLE_PRODUCT_SUBWORD = "[^a-zA-Z0-9_.-]"; +// private static final String REGEX_MAIL = "\\b[\\w.%-]+@[-.\\w]+\\.[A-Za-z]{2,4}\\b"; +// private static final String NONE_PROFILE = "none"; +// +// // error/info messages +// protected static final String ERROR_PRODUCT_CREATION = "There was an error while trying to publish your item."; +// protected static final String PRODUCT_CREATED_OK = "Item correctly published!"; +// private static final String TRYING_TO_CREATE_PRODUCT = "Trying to publish the item, please wait..."; +// protected static final String MISSING_PUBLISH_RIGHTS = "It seems you are not authorized to publish on catalogue. Request it to the VRE manager or the portal administrator."; +// +// // tab panel +// private TabPanel tabPanel; +// +// // add resource form +// private AddResourceToDataset resourceForm; +// +// // the licenses +// private List licenseBean; +// +// // event bus +// private HandlerManager eventBus; +// +// // added custom field entries (by the user) +// private List customFieldEntriesList = new ArrayList(); +// +// // the list of MetaDataField added +// private List listOfMetadataFields = new ArrayList(); +// +// // dataset metadata bean +// private DatasetBean receivedBean; +// +// // the owner +// private String owner; +// +// // workspace request? +// private boolean isWorkspaceRequest = false; +// +// // resource table +// private TwinColumnSelectionMainPanel resourcesTwinPanel; +// +// // List of opened popup'ids +// private List popupOpenedIds = new ArrayList(); +// +// // map of organization name title +// private Map nameTitleOrganizationMap = new HashMap(); +// +// /** +// * Invoked in the most general case +// * @param eventBus the event bus +// */ +// public CreateDatasetForm(HandlerManager eventBus) { +// createDatasetFormBody(false, null, eventBus); +// } +// +// /** +// * Invoked when the workspace is used +// * @param idFolderWorkspace +// * @param eventBus the event bus +// */ +// public CreateDatasetForm(String idFolderOrFileWorkspace, HandlerManager eventBus) { +// createDatasetFormBody(true, idFolderOrFileWorkspace, eventBus); +// } +// +// /** +// * Bind on events +// */ +// private void bind() { +// // when a custom field is removed, remove it from the list +// eventBus.addHandler(DeleteCustomFieldEvent.TYPE, new DeleteCustomFieldEventHandler() { +// +// @Override +// public void onRemoveEntry(DeleteCustomFieldEvent event) { +// customFieldEntriesList.remove(event.getRemovedEntry()); +// customFields.remove(event.getRemovedEntry()); +// } +// }); +// +// // on close form +// eventBus.addHandler(CloseCreationFormEvent.TYPE, new CloseCreationFormEventHandler() { +// @Override +// public void onClose(CloseCreationFormEvent event) { +// InfoIconsLabels.closeDialogBox(popupOpenedIds); +// } +// }); +// } +// +// /** +// * The real constructor +// * @param isWorkspaceRequest +// * @param idFolderWorkspace +// * @param owner +// * @param eventBus +// */ +// private void createDatasetFormBody(final boolean isWorkspaceRequest, final String idFolderOrFileWorkspace, final HandlerManager eventBus){ +// +// initWidget(uiBinder.createAndBindUi(this)); +// this.eventBus = eventBus; +// this.isWorkspaceRequest = isWorkspaceRequest; +// bind(); +// prepareInfoIcons(); +// +// // disable continue button +// continueButton.setEnabled(false); +// resetButton.setEnabled(false); +// +// // hide tags panel +// tagsPanel.setVisible(false); +// +// // check if the user has publishing rights +// setAlertBlock("Checking your permissions, please wait...", AlertType.INFO, true); +// +// ckanServices.isPublisherUser(isWorkspaceRequest, new AsyncCallback() { +// +// @Override +// public void onSuccess(Boolean result) { +// +// if(result){ +// +// // set info block +// setAlertBlock("Retrieving information, please wait...", AlertType.INFO, true); +// +// // get back the licenses and the metadata information +// ckanServices.getDatasetBean(idFolderOrFileWorkspace, new AsyncCallback() { +// +// @Override +// public void onFailure(Throwable caught) { +// +// setAlertBlock(caught.getMessage(), AlertType.ERROR, true); +// +// } +// +// @Override +// public void onSuccess(final DatasetBean bean) { +// +// if(bean == null){ +// +// setAlertBlock("Error while retrieving information.", AlertType.ERROR, true); +// } +// else{ +// +// // save it +// receivedBean = bean; +// +// // fill the form +// titleTextBox.setText(bean.getTitle()); +// descriptionTextarea.setText(bean.getDescription()); +// versionTextbox.setText(String.valueOf(bean.getVersion())); +// authorTextbox.setText(bean.getAuthorSurname() + " " + bean.getAuthorName()); +// 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(); +// +// // TODO Check if these tags are ok for the vocabulary +// if(customFieldsMap != null && vocabularyTags == null){ +// +// // get the keys and put them as tags +// Iterator>> iteratorOverCustomField = customFieldsMap.entrySet().iterator(); +// +// while (iteratorOverCustomField.hasNext()) { +// Map.Entry> entry = iteratorOverCustomField +// .next(); +// +// List values = entry.getValue(); +// +// for (String value : values) { +// // these are fixed key, variable value custom fields +// CustomFieldEntry toAdd = new CustomFieldEntry(eventBus, entry.getKey(), value, false); +// customFieldEntriesList.add(toAdd); +// customFields.add(toAdd); +// +// // add as tag +// tagsPanel.addTagElement(entry.getKey()); +// } +// } +// } +// +// // set it as visible anyway +// tagsPanel.setVisible(true); +// +// if(isWorkspaceRequest){ +// // if there are not resources, for now just checked it ( and hide so that the step will be skipped) +// if(hideManageResources()){ +// alertNoResources.setType(AlertType.WARNING); +// alertNoResources.setVisible(true); +// }else +// resourcesTwinPanel = new TwinColumnSelectionMainPanel(bean.getResourceRoot()); +// } +// +// // set organizations +// List organizations = bean.getOrganizationList(); +// +// for (OrganizationBean organization : organizations) { +// organizationsListbox.addItem(organization.getTitle()); +// nameTitleOrganizationMap.put(organization.getTitle(), organization.getName()); +// } +// +// // force the selection of the first one, and retrieve the list of profiles +// organizationsListbox.setSelectedIndex(0); +// +// // add change handler to dynamically retrieve the list of profiles +// organizationsListbox.addChangeHandler(new ChangeHandler() { +// +// @Override +// public void onChange(ChangeEvent event) { +// event.preventDefault(); +// organizationsListboxChangeHandlerBody(); +// } +// }); +// +// // get the name of the organization from the title +// final String orgName = nameTitleOrganizationMap.get(organizationsListbox.getSelectedItemText()); +// +// // force tags +// setAlertBlock("Checking for tags vocabulary, please wait...", AlertType.INFO, true); +// ckanServices.getTagsForOrganization(orgName, new AsyncCallback>() { +// +// @Override +// public void onSuccess(List vocabulary) { +// +// tagsPanel.setVocabulary(vocabulary); +// tagsPanel.setVisible(true); +// } +// +// @Override +// public void onFailure(Throwable arg0) { +// +// setAlertBlock("Error while checking if a vocabulary of tags is defined in the selected organization.", AlertType.ERROR, true); +// tagsPanel.setVisible(true); +// +// } +// }); +// +// // try to retrieve the profiles +// setAlertBlock("Retrieving types, please wait...", AlertType.INFO, true); +// +// // perform remote request of profiles for the selected organization +// ckanServices.getProfiles(orgName, new AsyncCallback>() { +// +// @Override +// public void onFailure(Throwable caught) { +// setAlertBlock(caught.getMessage(), AlertType.ERROR, true); +// } +// +// @Override +// public void onSuccess(final List profiles) { +// +// if(profiles == null){ +// setAlertBlock("An unknow error occurred while retrieving types, sorry", AlertType.ERROR, true); +// } +// else{ +// +// receivedBean.setMetadataList(profiles); +// prepareMetadataList(receivedBean); +// organizationsListbox.setEnabled(true); +// metadataTypeListbox.setEnabled(true); +// +// // try to retrieve the licenses +// setAlertBlock("Retrieving licenses, please wait...", AlertType.INFO, true); +// ckanServices.getLicenses(new AsyncCallback>() { +// +// @Override +// public void onFailure(Throwable caught){ +// setAlertBlock(caught.getMessage(), AlertType.ERROR, true); +// } +// +// @Override +// public void onSuccess(List licenses) { +// +// if(licenses != null && !licenses.isEmpty()){ +// +// licenseBean = licenses; +// +// // fill the listbox +// for(int i = 0; i < licenses.size(); i++){ +// licenseListbox.addItem(licenses.get(i).getTitle()); +// } +// +// // set the url of the license, if any +// showLicenseUrl(); +// +// // try to retrieve the licenses +// setAlertBlock("Retrieving groups, please wait...", AlertType.INFO, true); +// +// // request groups +// ckanServices.getUserGroups(orgName, new AsyncCallback>() { +// +// @Override +// public void onSuccess(List groups) { +// if(groups == null){ +// setAlertBlock("Error while retrieving groups", AlertType.ERROR, true); +// }else{ +// if(groups.isEmpty()){ +// groupsControlGroup.setVisible(false); +// } +// else{ +// +// // add groups +// for (OrganizationBean group : groups) { +// groupsListbox.addItem(group.getTitle(), group.getName()); +// } +// hideGroupsAlreadyInProfile(profiles); +// } +// // everything went ok +// setAlertBlock("", AlertType.ERROR, false); +// continueButton.setEnabled(true); +// resetButton.setEnabled(true); +// } +// } +// +// @Override +// public void onFailure(Throwable caught) { +// setAlertBlock(caught.getMessage(), AlertType.ERROR, true); +// } +// }); +// +// }else{ +// setAlertBlock("Error while retrieving licenses", AlertType.ERROR, true); +// } +// } +// }); +// } +// } +// }); +// } +// } +// }); +// +// }else{ +// setAlertBlock(MISSING_PUBLISH_RIGHTS, AlertType.ERROR, true); +// } +// +// } +// +// @Override +// public void onFailure(Throwable caught) { +// setAlertBlock(MISSING_PUBLISH_RIGHTS, AlertType.ERROR, true); +// } +// }); +// +// +// +// } +// +// +// /** +// * When the organization name is changed we need to retrieve the list of profiles and groups +// */ +// private void organizationsListboxChangeHandlerBody() { +// +// // remove any other product profiles +// metadataTypeListbox.clear(); +// +// // add "none" item again +// metadataTypeListbox.addItem(NONE_PROFILE); +// +// // select "none" +// metadataTypeListbox.setSelectedIndex(0); +// +// // get the name of the organization from the title +// String selectedOrganizationTitle = organizationsListbox.getSelectedItemText(); +// final String orgName = nameTitleOrganizationMap.get(selectedOrganizationTitle); +// +// // try to retrieve the profiles +// setAlertBlock("Retrieving types, please wait...", AlertType.INFO, true); +// +// // disable the list of organizations name so that the user doesn't change it again +// // also disable the profiles and the list of groups +// organizationsListbox.setEnabled(false); +// metadataTypeListbox.setEnabled(false); +// groupsListbox.clear(); +// groupsControlGroup.setVisible(false); +// +// // perform remote request of profiles for the selected organization +// ckanServices.getProfiles(orgName, new AsyncCallback>() { +// +// @Override +// public void onSuccess(final List profiles) { +// +// if(profiles != null){ +// +// receivedBean.setMetadataList(profiles); +// prepareMetadataList(receivedBean); +// organizationsListbox.setEnabled(true); +// metadataTypeListbox.setEnabled(true); +// +// // try to retrieve the licenses +// setAlertBlock("Retrieving groups, please wait...", AlertType.INFO, true); +// +// // request groups +// ckanServices.getUserGroups(orgName, new AsyncCallback>() { +// +// @Override +// public void onSuccess(List groups) { +// +// if(groups == null){ +// setAlertBlock("Error while retrieving groups, try later", AlertType.ERROR, true); +// }else{ +// if(groups.isEmpty()){ +// groupsControlGroup.setVisible(false); +// } +// else{ +// +// // add groups +// for (OrganizationBean group : groups) { +// groupsListbox.addItem(group.getTitle(), group.getName()); +// } +// groupsListbox.setEnabled(true); +// hideGroupsAlreadyInProfile(profiles); +// } +// setAlertBlock("", AlertType.ERROR, false); +// } +// } +// +// @Override +// public void onFailure(Throwable caught) { +// setAlertBlock("Error while retrieving groups, try later", AlertType.ERROR, true); +// } +// }); +// +// +// // check also for tags (if for that context there is a vocabulary or not) +// tagsPanel.setVisible(false); +// setAlertBlock("Checking for tags vocabulary, please wait...", AlertType.INFO, true); +// ckanServices.getTagsForOrganization(orgName, new AsyncCallback>() { +// +// @Override +// public void onSuccess(List vocabulary) { +// +// tagsPanel.setVocabulary(vocabulary); +// tagsPanel.setVisible(true); +// setAlertBlock("", AlertType.ERROR, false); +// } +// +// @Override +// 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); +// +// } +// }); +// +// }else +// setAlertBlock("Error while retrieving types, sorry", AlertType.ERROR, true); +// +// } +// +// @Override +// public void onFailure(Throwable caught) { +// +// setAlertBlock("Error while retrieving types, sorry", AlertType.ERROR, true); +// +// } +// }); +// +// } +// +// /** +// * Add the items to the listbox and put data into the metadataPanel +// * @param receivedBean +// */ +// private void prepareMetadataList(final DatasetBean receivedBean) { +// +// List profiles = receivedBean.getMetadataList(); +// +// if(profiles != null && !profiles.isEmpty()){ +// for(MetaDataProfileBean metadataBean: profiles){ +// +// metadataTypeListbox.addItem(metadataBean.getType()); +// +// // add handler on select +// metadataTypeListbox.addChangeHandler(new ChangeHandler() { +// +// @Override +// public void onChange(ChangeEvent event) { +// +// String selectedItemText = metadataTypeListbox.getSelectedItemText(); +// metadataFieldsPanel.clear(); +// if(selectedItemText.equals(NONE_PROFILE)){ +// metadataFieldsPanel.setVisible(false); +// receivedBean.setChosenType(null); +// }else{ +// receivedBean.setChosenType(selectedItemText); +// addFields(selectedItemText); +// } +// } +// }); +// } +// +// // hide elements or show them if needed (groups in profiles cannot be present again in groups listbox) +// if(groupsControlGroup.isVisible()){ +// List groupsToHide = new ArrayList(); +// for(MetaDataProfileBean profile: profiles) +// groupsToHide.add(profile.getType().toString()); +// +// SelectElement se = groupsListbox.getElement().cast(); +// +// for (int i = 0; i < groupsListbox.getItemCount(); i++) { +// if(groupsToHide.contains(groupsListbox.getItemText(i))){ +// se.getOptions().getItem(i).getStyle().setProperty("display", "none"); +// }else +// se.getOptions().getItem(i).getStyle().setProperty("display", ""); +// } +// } +// +// metadataTypesControlGroup.setVisible(true); +// }else{ +// // just hide this listbox +// metadataTypesControlGroup.setVisible(false); +// metadataFieldsPanel.clear(); +// listOfMetadataFields.clear(); +// receivedBean.setChosenType(null); +// } +// } +// +// /** +// * Add fields of the selected metadata profile to the widget +// * @param selectedItem +// */ +// protected void addFields(String selectedItem) { +// +// for(MetaDataProfileBean bean: receivedBean.getMetadataList()){ +// if(bean.getType().equals(selectedItem)){ +// +// // clear old data +// listOfMetadataFields.clear(); +// +// // prepare the data +// List fields = bean.getMetadataFields(); +// List categories = bean.getCategories(); +// +// GWT.log("There are " + categories.size() + " categories for profile " + bean.getTitle()); +// +// if(categories == null || categories.isEmpty()){ +// for (MetadataFieldWrapper field : fields) { +// /*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{ +// +// // create the categories, then parse the fields. Fields do not belonging to a category are put at the end +// for (CategoryWrapper categoryWrapper : categories) { +// if(categoryWrapper.getFieldsForThisCategory() != null && categoryWrapper.getFieldsForThisCategory().size() > 0){ +// CategoryPanel cp = new CategoryPanel(categoryWrapper.getTitle(), categoryWrapper.getDescription()); +// List fieldsForThisCategory = categoryWrapper.getFieldsForThisCategory(); +// fields.removeAll(fieldsForThisCategory); +// +// for (MetadataFieldWrapper metadataFieldWrapper : fieldsForThisCategory) { +// +// /*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); +// } +// } +// +// // add the remaining one at the end of the categories +// CategoryPanel extrasCategory = new CategoryPanel("Other", null); +// for (MetadataFieldWrapper field : fields) { +// +// /*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); +// } +// metadataFieldsPanel.setVisible(true); +// } +// } +// } +// +// +// @UiHandler("addCustomFieldButton") +// void addCustomFieldEvent(ClickEvent e){ +// +// CustomFieldEntry toAdd = new CustomFieldEntry(eventBus, "", "", true); +// customFieldEntriesList.add(toAdd); +// customFields.add(toAdd); +// +// } +// +// @UiHandler("continueButton") +// void onContinueButton(ClickEvent e){ +// +// // validate data +// final String errorMsg = validateDataOnContinue(); +// +// if(errorMsg != null){ +// +// alertOnContinue("Please check inserted data [" + errorMsg + "]", AlertType.ERROR); +// return; +// +// }else{ +// +// // better check for title (only if the dataset was not created.. if it is the case, fields are not frozen) +// if(!titleTextBox.isEnabled()) +// actionsAfterOnContinue(); +// else{ +// alertOnContinue("Checking if a item with such title already exists, please wait...", AlertType.INFO); +// ckanServices.datasetIdAlreadyExists(titleTextBox.getText(), organizationsListbox.getSelectedItemText(), new AsyncCallback() { +// +// @Override +// public void onSuccess(Boolean result) { +// if(result){ +// alertOnContinue("Sorry but an item with such title already exists, try to change it", AlertType.WARNING); +// }else{ +// actionsAfterOnContinue(); +// } +// } +// +// @Override +// public void onFailure(Throwable caught) { +// alertOnContinue("Sorry but there was a problem while checking if the inserted data are correct", AlertType.ERROR); +// } +// }); +// } +// } +// } +// +// /** +// * After onContinue ... +// */ +// private void actionsAfterOnContinue(){ +// +// // check what to do +// if(isWorkspaceRequest){ +// +// // we need to show the page to handle resources one by one from the workspace +// formFirstStep.setVisible(false); +// formSecondStep.setVisible(!hideManageResources()); +// formThirdStep.setVisible(hideManageResources()); +// +// // add the resources to the container panel +// if(workspaceResourcesContainer.getWidget() == null){ +// workspaceResourcesContainer.getElement().getStyle().setMarginLeft(20, Unit.PX); +// workspaceResourcesContainer.add(resourcesTwinPanel); +// } +// +// }else{ +// +// // this is not a workspace request +// formFirstStep.setVisible(false); +// formThirdStep.setVisible(true); +// +// } +// +// if(metadataTypeListbox.getSelectedItemText().equals(NONE_PROFILE)) +// selectedProfile.setText(""); +// else +// selectedProfile.setText("Selected Type is " + metadataTypeListbox.getSelectedItemText()); +// +// } +// +// +// @UiHandler("goBackButtonFirstStep") +// void onGoBackButtonFirstStep(ClickEvent e){ +// +// // swap forms +// formFirstStep.setVisible(true); +// formSecondStep.setVisible(false); +// formThirdStep.setVisible(false); +// +// } +// +// +// @UiHandler("goBackButtonSecondStep") +// void onGoBackButton(ClickEvent e){ +// +// // swap forms +// if(isWorkspaceRequest){ +// formFirstStep.setVisible(hideManageResources()); +// formSecondStep.setVisible(!hideManageResources()); +// }else{ +// formFirstStep.setVisible(true); +// formSecondStep.setVisible(false); +// } +// formThirdStep.setVisible(false); +// +// } +// +// @UiHandler("continueThirdStep") +// void onContinueThirdStep(ClickEvent e){ +// +// // swap forms +// formSecondStep.setVisible(false); +// formThirdStep.setVisible(true); +// +// } +// +// +// @UiHandler("createButton") +// void createDatasetEvent(ClickEvent e){ +// +// String errorMessage = areProfileDataValid(); +// +// if(errorMessage != null){ +// alertOnCreate("Please check the inserted values and the mandatory fields [" + errorMessage +"]", AlertType.ERROR, true); +// } +// else{ +// +// String title = titleTextBox.getValue().trim(); +// String description = descriptionTextarea.getText().trim(); +// String selectedLicense = licenseListbox.getSelectedItemText(); +// String visibility = visibilityListbox.getSelectedItemText(); +// long version = Long.valueOf(versionTextbox.getValue().trim()); +// String author = authorTextbox.getValue(); +// String authorEmail = authorEmailTextbox.getValue(); +// String maintainer = maintainerTextbox.getValue().trim(); +// String maintainerEmail = maintainerEmailTextbox.getValue().trim(); +// String chosenOrganizationTitle = organizationsListbox.getSelectedItemText(); +// Set tags = new HashSet(tagsPanel.getTags()); +// +// //we need to retrieve the organization's name from this title +// List orgs = receivedBean.getOrganizationList(); +// String chosenOrganization = null; +// for (OrganizationBean organizationBean : orgs) { +// if(chosenOrganizationTitle.equals(organizationBean.getTitle())){ +// chosenOrganization = organizationBean.getName(); +// break; +// } +// } +// +// List groups = new ArrayList(); +// List groupsToForceCreation = new ArrayList(); +// +// // get groups, if any +// int items = groupsListbox.getItemCount(); +// for (int i = 0; i < items; i++) { +// String groupTitle = groupsListbox.getItemText(i); +// String groupName = groupsListbox.getValue(i); +// if(groupsListbox.isItemSelected(i)){ +// groups.add(new OrganizationBean(groupTitle, groupName, false)); +// } +// } +// +// Map> customFieldsMap = new HashMap>(); +// +// // prepare custom fields +// 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())); +// } +// } +// } +// } +// } +// +// for(CustomFieldEntry customEntry : customFieldEntriesList){ +// String key = customEntry.getKey(); +// String value = customEntry.getValue(); +// if(value != null && !value.isEmpty()){ +// List valuesForThisField = null; +// if(customFieldsMap.containsKey(key)) +// valuesForThisField = customFieldsMap.get(key); +// else +// valuesForThisField = new ArrayList(); +// valuesForThisField.add(value); +// customFieldsMap.put(key, valuesForThisField); +// } +// +// } +// +// // fill the bean +// receivedBean.setAuthorFullName(author); +// receivedBean.setAuthorEmail(authorEmail); +// receivedBean.setDescription(description); +// receivedBean.setLicense(selectedLicense); +// receivedBean.setMaintainer(maintainer); +// receivedBean.setMaintainerEmail(maintainerEmail); +// receivedBean.setVersion(version); +// receivedBean.setVisibile(visibility.equals("Public")); +// receivedBean.setTitle(title); +// receivedBean.setTags(new ArrayList(tags)); +// receivedBean.setSelectedOrganization(chosenOrganization); +// receivedBean.setGroups(groups); +// receivedBean.setGroupsForceCreation(groupsToForceCreation); +// if(resourcesTwinPanel != null) +// receivedBean.setResourceRoot(resourcesTwinPanel.getResourcesToPublish()); +// receivedBean.setCustomFields(customFieldsMap); +// +// // alert +// alertOnCreate(TRYING_TO_CREATE_PRODUCT, AlertType.INFO, false); +// +// // invoke the create method +// createButton.setEnabled(false); +// goBackButtonSecondStep.setEnabled(false); +// +// ckanServices.createCKanDataset(receivedBean, new AsyncCallback() { +// +// @Override +// public void onSuccess(final DatasetBean createdDatasetBean) { +// +// GWT.log("Created the dataset: "+createdDatasetBean); +// +// if(createdDatasetBean != null){ +// +// final String datasetUrl = createdDatasetBean.getSource(); +// +// alertOnCreate(PRODUCT_CREATED_OK, AlertType.SUCCESS, false); +// +// try { +// // disable dataset fields +// disableDatasetFields(); +// }catch (Exception e) { +// // TODO: handle exception +// } +// +// // disable reset +// resetButton.setEnabled(false); +// +// // show the go to dataset button +// +// goToDatasetButtonPanel.setVisible(true); +// goToDatasetButton.setVisible(true); +// goToDatasetButton.setText( +// datasetUrl.length() > 100 ? +// datasetUrl.substring(0, 100) + "..." : datasetUrl +// ); +// // goToDatasetButton.setHref(datasetUrl); +// goToDatasetButton.addClickHandler(new ClickHandler() { +// +// @Override +// public void onClick(ClickEvent event) { +// Window.open(datasetUrl, "_blank", ""); +// //Window.Location.assign(datasetUrl); +// } +// }); +// +// +// // set hidden the create button +// createButton.setVisible(false); +// +// // if we are in the "general case" we need to show a form for adding resources +// if(!isWorkspaceRequest) { +// +// try { +// // show the add resources button +// addResourcesButton.setVisible(true); +// +// addResourcesButton.addClickHandler(new ClickHandler() { +// +// @Override +// public void onClick(ClickEvent event) { +// +// // remove content of the main panel +// createDatasetMainPanel.clear(); +// +// // TabPanelException +// tabPanel = new TabPanel(Tabs.ABOVE); +// tabPanel.setWidth("100%"); +// +// // add the form +// resourceForm = new AddResourceToDataset(eventBus, createdDatasetBean.getId(), createdDatasetBean.getSelectedOrganization(), owner, datasetUrl); +// +// // tab for the form +// Tab formContainer = new Tab(); +// formContainer.add(resourceForm); +// formContainer.setHeading("Add New Resource"); +// tabPanel.add(formContainer); +// +// // tab for the added resources +// Tab addedResources = new Tab(); +// addedResources.add(new AddedResourcesSummary(eventBus)); +// addedResources.setHeading("Added Resource"); +// tabPanel.add(addedResources); +// +// // add tabs to resources panel +// tabPanel.selectTab(0); +// +// // form container +// AddResourceContainer container = new AddResourceContainer(datasetUrl); +// container.add(tabPanel); +// +// // add the new content of the main panel +// createDatasetMainPanel.add(container); +// } +// }); +// }catch (Exception e2) { +// //silent +// } +// } +// +// }else{ +// +// alertOnCreate(ERROR_PRODUCT_CREATION, AlertType.ERROR, true); +// } +// +// } +// +// @Override +// public void onFailure(Throwable caught) { +// alertOnCreate(ERROR_PRODUCT_CREATION + " Error message is : " + caught.getMessage(), AlertType.ERROR, true); +// } +// }); +// } +// } +// +// /** +// * Prepare the info icons of all core metadata info +// */ +// private void prepareInfoIcons() { +// +// // tags +// tagsPanel.prepareIcon(popupOpenedIds); +// +// // licenses +// InfoIconsLabels.preparePopupPanelAndPopover( +// InfoIconsLabels.LICENSES_INFO_ID_POPUP, +// InfoIconsLabels.LICENSES_INFO_TEXT, +// InfoIconsLabels.LICENSES_INFO_CAPTION, +// infoIconLicenses, +// popoverLicenses, +// focusPanelLicenses, +// popupOpenedIds +// ); +// +// // visibility +// InfoIconsLabels.preparePopupPanelAndPopover( +// InfoIconsLabels.VISIBILITY_INFO_ID_POPUP, +// InfoIconsLabels.VISIBILITY_INFO_TEXT, +// InfoIconsLabels.VISIBILITY_INFO_CAPTION, +// infoIconVisibility, +// popoverVisibility, +// focusPanelVisibility, +// popupOpenedIds +// ); +// +// // author +// InfoIconsLabels.preparePopupPanelAndPopover( +// InfoIconsLabels.AUTHOR_INFO_ID_POPUP, +// InfoIconsLabels.AUTHOR_INFO_TEXT, +// InfoIconsLabels.AUTHOR_INFO_CAPTION, +// infoIconAuthor, +// popoverAuthor, +// focusPanelAuthor, +// popupOpenedIds +// ); +// +// // author's email +// InfoIconsLabels.preparePopupPanelAndPopover( +// InfoIconsLabels.AUTHOR_EMAIL_INFO_ID_POPUP, +// InfoIconsLabels.AUTHOR_EMAIL_INFO_TEXT, +// InfoIconsLabels.AUTHOR_EMAIL_INFO_CAPTION, +// infoIconAuthorEmail, +// popoverAuthorEmail, +// focusPanelAuthorEmail, +// popupOpenedIds +// ); +// +// // maintainer +// InfoIconsLabels.preparePopupPanelAndPopover( +// InfoIconsLabels.MAINTAINER_INFO_ID_POPUP, +// InfoIconsLabels.MAINTAINER_INFO_TEXT, +// InfoIconsLabels.MAINTAINER_INFO_CAPTION, +// infoIconMaintainer, +// popoverMaintainer, +// focusPanelMaintainer, +// popupOpenedIds +// ); +// +// // maintainer's email +// InfoIconsLabels.preparePopupPanelAndPopover( +// InfoIconsLabels.MAINTAINER_EMAIL_INFO_ID_POPUP, +// InfoIconsLabels.MAINTAINER_EMAIL_INFO_TEXT, +// InfoIconsLabels.MAINTAINER_EMAIL_INFO_CAPTION, +// infoIconMaintainerEmail, +// popoverMaintainerEmail, +// focusPanelMaintainerEmail, +// popupOpenedIds +// ); +// +// // profiles (or types) +// InfoIconsLabels.preparePopupPanelAndPopover( +// InfoIconsLabels.PROFILES_INFO_ID_POPUP, +// InfoIconsLabels.PROFILES_INFO_TEXT, +// InfoIconsLabels.PROFILES_INFO_CAPTION, +// infoIconTypes, +// popoverTypes, +// focusPanelTypes, +// popupOpenedIds +// ); +// +// // custom fields +// InfoIconsLabels.preparePopupPanelAndPopover( +// InfoIconsLabels.CUSTOM_FIELDS_INFO_ID_POPUP, +// InfoIconsLabels.CUSTOM_FIELDS_INFO_TEXT, +// InfoIconsLabels.CUSTOM_FIELDS_INFO_CAPTION, +// infoIconCustomFields, +// popoverCustomFields, +// focusPanelCustomFields, +// popupOpenedIds +// ); +// +// // resources field +// InfoIconsLabels.preparePopupPanelAndPopover( +// InfoIconsLabels.RESOURCES_INFO_ID_POPUP, +// InfoIconsLabels.RESOURCES_INFO_TEXT, +// InfoIconsLabels.RESOURCES_INFO_CAPTION, +// infoIconResources, +// popoverResources, +// focusPanelResources, +// popupOpenedIds +// ); +// +// // title +// InfoIconsLabels.preparePopupPanelAndPopover( +// InfoIconsLabels.TITLE_INFO_ID_POPUP, +// InfoIconsLabels.TITLE_INFO_TEXT, +// InfoIconsLabels.TITLE_INFO_CAPTION, +// infoIconTitle, +// popoverTitle, +// focusPanelTitle, +// popupOpenedIds +// ); +// +// // description +// InfoIconsLabels.preparePopupPanelAndPopover( +// InfoIconsLabels.DESCRIPTION_INFO_ID_POPUP, +// InfoIconsLabels.DESCRIPTION_INFO_TEXT, +// InfoIconsLabels.DESCRIPTION_INFO_CAPTION, +// infoIconDescription, +// popoverDescription, +// focusPanelDescription, +// popupOpenedIds +// ); +// +// // groups +// InfoIconsLabels.preparePopupPanelAndPopover( +// InfoIconsLabels.GROUPS_INFO_ID_POPUP, +// InfoIconsLabels.GROUPS_INFO_TEXT, +// InfoIconsLabels.GROUPS_INFO_CAPTION, +// infoIconGroups, +// popoverGroups, +// focusPanelGroups, +// popupOpenedIds +// ); +// } +// +// /** +// * Test if profile data are valid +// * @return +// */ +// private String areProfileDataValid() { +// +// 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; +// } +// } +// } +// +// return null; +// } +// +// /** +// * On continue show alert box and enable buttons +// * @param text +// * @param type +// */ +// private void alertOnContinue(String text, AlertType type){ +// +// onContinueAlertBlock.setText(text); +// onContinueAlertBlock.setType(type); +// onContinueAlertBlock.setVisible(true); +// continueButton.setEnabled(true); +// resetButton.setEnabled(true); +// +// // hide after some seconds +// Timer t = new Timer() { +// +// @Override +// public void run() { +// +// onContinueAlertBlock.setVisible(false); +// +// } +// }; +// +// t.schedule(4000); +// } +// +// /** +// * On continue show alert box and enable buttons +// * @param text +// * @param type +// */ +// private void alertOnCreate(String text, AlertType type, boolean hideAfterAWhile){ +// +// onCreateAlertBlock.setText(text); +// onCreateAlertBlock.setType(type); +// onCreateAlertBlock.setVisible(true); +// createButton.setEnabled(true); +// goBackButtonSecondStep.setEnabled(true); +// +// if(hideAfterAWhile){ +// // hide after some seconds +// Timer t = new Timer() { +// +// @Override +// public void run() { +// +// onCreateAlertBlock.setVisible(false); +// +// } +// }; +// t.schedule(10000); +// } +// } +// +// /** +// * Validate data +// * @return true on success, false otherwise +// */ +// private String validateDataOnContinue() { +// +// // remove errors +// productTitleGroup.setType(ControlGroupType.NONE); +// maintainerControlGroup.setType(ControlGroupType.NONE); +// versionControlGroup.setType(ControlGroupType.NONE); +// metadataTypesControlGroup.setType(ControlGroupType.NONE); +// organizationsGroup.setType(ControlGroupType.NONE); +// tagsPanel.setGroupPanelType(ControlGroupType.NONE); +// +// String title = titleTextBox.getText().trim(); +// if(title.isEmpty()){ +// productTitleGroup.setType(ControlGroupType.ERROR); +// return "Missing title"; +// } +// +// // better check for the title +// String[] splittedTitle = title.split(" "); +// +// for (String word : splittedTitle) { +// String replaced = word.replaceAll(REGEX_TITLE_PRODUCT_SUBWORD, ""); +// if(!replaced.equals(word)){ +// productTitleGroup.setType(ControlGroupType.ERROR); +// return "Please note not all characters are allowed for the title"; +// } +// } +// +// // email reg expression +// String maintainerMail = maintainerEmailTextbox.getText(); +// if(!maintainerMail.isEmpty() && !maintainerMail.matches(REGEX_MAIL)){ +// maintainerControlGroup.setType(ControlGroupType.ERROR); +// return "Not valid maintainer email"; +// } +// +// // check if version is a number +// try{ +// int number = Integer.valueOf(versionTextbox.getText().trim()); +// if(number <= 0) +// throw new Exception(); +// }catch(Exception e){ +// versionControlGroup.setType(ControlGroupType.ERROR); +// return "Version must be a natural number greater than zero"; +// } +// +// // check if metadata profile is different from none and its mandatory fields have been fulfilled +// if(checkSelectedMetaDataProfile()){ +// metadataTypesControlGroup.setType(ControlGroupType.ERROR); +// return "You must select a Type different frome none"; +// } +// +// if(organizationsListbox.getSelectedItemText() == null){ +// organizationsGroup.setType(ControlGroupType.ERROR); +// return "You must select an organization in which you want to publish"; +// } +// +// // at least one tag.. +// if(tagsPanel.getTags().isEmpty()){ +// tagsPanel.setGroupPanelType(ControlGroupType.ERROR); +// return "Please add at least one meaningful tag for the item"; +// } +// +// return null; +// } +// +// /** +// * Checks if a metadata profile has been chosen and its fields have been fulfilled +// * @return +// */ +// private boolean checkSelectedMetaDataProfile() { +// return metadataTypeListbox.getSelectedItemText().equals(NONE_PROFILE) && metadataTypeListbox.getItemCount() != 1; +// } +// +// @UiHandler("resetButton") +// void resetFormEvent(ClickEvent e){ +// +// // reset main fields +// titleTextBox.setText(""); +// descriptionTextarea.setText(""); +// versionTextbox.setText(""); +// maintainerTextbox.setText(""); +// maintainerEmailTextbox.setText(""); +// tagsPanel.removeTags(); +// +// // unselect all groups +// for(int i = 0; i < groupsListbox.getItemCount(); i++) +// groupsListbox.setItemSelected(i, false); +// +// // delete custom fields +// for (CustomFieldEntry customField : customFieldEntriesList) { +// customField.removeFromParent(); +// } +// customFieldEntriesList.clear(); +// } +// +// /** +// * Disable dataset editable fields once the dataset has been successfully created. +// */ +// protected void disableDatasetFields() { +// +// titleTextBox.setEnabled(false); +// descriptionTextarea.setEnabled(false); +// versionTextbox.setEnabled(false); +// maintainerTextbox.setEnabled(false); +// maintainerEmailTextbox.setEnabled(false); +// visibilityListbox.setEnabled(false); +// tagsPanel.freeze(); +// licenseListbox.setEnabled(false); +// organizationsListbox.setEnabled(false); +// addCustomFieldButton.setEnabled(false); +// metadataTypeListbox.setEnabled(false); +// groupsListbox.setEnabled(false); +// +// for(CustomFieldEntry ce: customFieldEntriesList) +// ce.freeze(); +// +// // disable profile fields +// for (MetaDataField metaField : listOfMetadataFields) { +// for (MetaDataFieldSkeleton field : metaField.getListOfMetadataFields()) { +// field.freeze(); +// } +// +// } +// +// // freeze table of resources +// if(resourcesTwinPanel != null) +// resourcesTwinPanel.freeze(); +// } +// +// /** +// * change alert block behavior. +// * @param textToShow +// * @param type +// * @param visible +// */ +// private void setAlertBlock(String textToShow, AlertType type, boolean visible){ +// +// infoBlock.setText(textToShow); +// infoBlock.setType(type); +// infoBlock.setVisible(visible); +// +// } +// +// @UiHandler("licenseListbox") +// void onSelectedLicenseChange(ChangeEvent c){ +// +// showLicenseUrl(); +// +// } +// +// /** +// * The body of the onSelectedLicenseChange +// */ +// private void showLicenseUrl(){ +// +// String selectedLicense = licenseListbox.getSelectedItemText(); +// int index = -1; +// if((index = licenseBean.indexOf(new LicenseBean(selectedLicense, null))) >= 0){ +// LicenseBean foundLicense = licenseBean.get(index); +// licenseUrlAnchor.setText(foundLicense.getUrl()); +// licenseUrlAnchor.setHref(foundLicense.getUrl()); +// licenseUrlAnchor.setVisible(true); +// unavailableUrl.setVisible(false); +// }else{ +// licenseUrlAnchor.setVisible(false); +// unavailableUrl.setVisible(true); +// } +// } +// +// +// /** +// * Hide the groups that are already listed in the profiles page +// * @param profiles +// */ +// private void hideGroupsAlreadyInProfile(List profiles) { +// +// List groupsToHide = new ArrayList(); +// for(MetaDataProfileBean profile: profiles) +// groupsToHide.add(profile.getType()); +// +// SelectElement se = groupsListbox.getElement().cast(); +// +// int hiddenElements = 0; +// for (int i = 0; i < groupsListbox.getItemCount(); i++) { +// if(groupsToHide.contains(groupsListbox.getItemText(i))){ +// se.getOptions().getItem(i).getStyle().setProperty("display", "none"); +// hiddenElements++; +// } +// } +// +// if(hiddenElements == groupsListbox.getItemCount()) +// groupsControlGroup.setVisible(false); +// else +// groupsControlGroup.setVisible(true); +// +// } +// +// /** +// * Check if resource(s) are missing +// * @return +// */ +// private boolean hideManageResources(){ +// +// return receivedBean.getResourceRoot() == null || receivedBean.getResourceRoot().isFolder() && (receivedBean.getResourceRoot().getChildren() == null || +// receivedBean.getResourceRoot().getChildren().isEmpty()); +// +// } +//} \ No newline at end of file diff --git a/src/main/java/org/gcube/portlets/widgets/mpformbuilder/client/form/catalogue/CreateDatasetForm.ui.xml b/src/main/java/org/gcube/portlets/widgets/mpformbuilder/client/form/catalogue/CreateDatasetForm.ui.xml new file mode 100644 index 0000000..cf4440a --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/mpformbuilder/client/form/catalogue/CreateDatasetForm.ui.xml @@ -0,0 +1,410 @@ + + + + .form-main-style { + margin-left: 10px; + } + + .fieldset-border-style { + border: 1px groove #444; + -webkit-box-shadow: 0px 0px 0px 0px #000; + box-shadow: 0px 0px 0px 0px #000; + padding: 10px; + } + + .legend-style { + width: auto; + padding: 10px; + margin-bottom: 0px; + } + + @external .form-horizontal .input-large; + .form-horizontal .input-large .input-prepend { + width: 95%; + } + + .block-alert-style { + margin-top: 10px; + padding: 10px; + margin-bottom: 10px; + } + + .tagsPanelStyle { + display: inline-block; + } + + .selected-profile { + font-weight: bold; + } + + .label-go-to-product { + display: inline-block; + vertical-align: middle; + font-weight: bold; + } + + .the-margin-left{ + margin-left: 5px; + } + + + + + + + Insert Item Information + + * + is required + + + + + + + + + * + Title : + + + + + + + + + + + + + + + + Description: + + + + + + + + + + + + + + + + + + License: + + + + + + + + + + + + + + + Selected + License Url: + + + Unavailable + + + + + + + Visibility: + + + Restricted + Public + + + + + + + + + + + + + Publish in: + + + + + + + + + Version: + + + + + + + + + * + Author: + + + + + + + + + + + + + + + + * + Author Email: + + + + + + + + + + + + + + + + Maintainer: + + + + + + + + + + + + + + + + Maintainer Email: + + + + + + + + + + + + + + + Types: + + + none + + + + + + + + + + + + + Item Groups: + + + + + + + + + + + + + + + + + + + + + + Continue + Reset + + + + + + + + + Manage Resources + + + + + + + + + + + + + + + + + Continue + + Go + Back + + + + + + + + Insert Item Profile Information + + * + is required + + + + + + + + + + + Custom Field(s): + + + + + + + + + + + + + + + + + + + + + Go to the Item + + + + Add Resources + + Create + + Go + Back + + + + + \ No newline at end of file diff --git a/src/main/java/org/gcube/portlets/widgets/mpformbuilder/client/form/generic/CreateMetadataForm.java b/src/main/java/org/gcube/portlets/widgets/mpformbuilder/client/form/generic/CreateMetadataForm.java new file mode 100644 index 0000000..2a1bcb7 --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/mpformbuilder/client/form/generic/CreateMetadataForm.java @@ -0,0 +1,861 @@ +package org.gcube.portlets.widgets.mpformbuilder.client.form.generic; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import org.gcube.portlets.widgets.mpformbuilder.client.MetadataProfileFormBuilderService; +import org.gcube.portlets.widgets.mpformbuilder.client.MetadataProfileFormBuilderServiceAsync; +import org.gcube.portlets.widgets.mpformbuilder.client.events.CloseCreationFormEvent; +import org.gcube.portlets.widgets.mpformbuilder.client.events.CloseCreationFormEventHandler; +import org.gcube.portlets.widgets.mpformbuilder.client.events.DeleteCustomFieldEvent; +import org.gcube.portlets.widgets.mpformbuilder.client.events.DeleteCustomFieldEventHandler; +import org.gcube.portlets.widgets.mpformbuilder.client.form.MetaDataField; +import org.gcube.portlets.widgets.mpformbuilder.client.ui.metadata.CategoryPanel; +import org.gcube.portlets.widgets.mpformbuilder.client.ui.metadata.CustomFieldEntry; +import org.gcube.portlets.widgets.mpformbuilder.client.ui.metadata.MetaDataFieldSkeleton; +import org.gcube.portlets.widgets.mpformbuilder.client.ui.resources.AddResourceToDataset; +import org.gcube.portlets.widgets.mpformbuilder.client.ui.tags.TagsPanel; +import org.gcube.portlets.widgets.mpformbuilder.client.ui.twincolumnselection.TwinColumnSelectionMainPanel; +import org.gcube.portlets.widgets.mpformbuilder.client.ui.utils.InfoIconsLabels; +import org.gcube.portlets.widgets.mpformbuilder.shared.catalogue.OrganizationBean; +import org.gcube.portlets.widgets.mpformbuilder.shared.license.LicenseBean; +import org.gcube.portlets.widgets.mpformbuilder.shared.metadata.CategoryWrapper; +import org.gcube.portlets.widgets.mpformbuilder.shared.metadata.MetaDataProfileBean; +import org.gcube.portlets.widgets.mpformbuilder.shared.metadata.MetadataFieldWrapper; + +import com.github.gwtbootstrap.client.ui.AlertBlock; +import com.github.gwtbootstrap.client.ui.Button; +import com.github.gwtbootstrap.client.ui.ControlGroup; +import com.github.gwtbootstrap.client.ui.Form; +import com.github.gwtbootstrap.client.ui.Icon; +import com.github.gwtbootstrap.client.ui.ListBox; +import com.github.gwtbootstrap.client.ui.Paragraph; +import com.github.gwtbootstrap.client.ui.Popover; +import com.github.gwtbootstrap.client.ui.TabPanel; +import com.github.gwtbootstrap.client.ui.constants.AlertType; +import com.google.gwt.core.client.GWT; +import com.google.gwt.event.dom.client.ChangeEvent; +import com.google.gwt.event.dom.client.ChangeHandler; +import com.google.gwt.event.dom.client.ClickEvent; +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.uibinder.client.UiHandler; +import com.google.gwt.user.client.Timer; +import com.google.gwt.user.client.Window; +import com.google.gwt.user.client.rpc.AsyncCallback; +import com.google.gwt.user.client.ui.Composite; +import com.google.gwt.user.client.ui.FocusPanel; +import com.google.gwt.user.client.ui.HTMLPanel; +import com.google.gwt.user.client.ui.VerticalPanel; +import com.google.gwt.user.client.ui.Widget; + +/** + * Create metadata form for ckan product. + * @author Costantino Perciante at ISTI-CNR (costantino.perciante@isti.cnr.it) + */ +public class CreateMetadataForm extends Composite{ + + private static EditMetadataFormUiBinder uiBinder = GWT + .create(EditMetadataFormUiBinder.class); + + + /** + * The Interface EditMetadataFormUiBinder. + * + * @author Francesco Mangiacrapa at ISTI-CNR (francesco.mangiacrapa@isti.cnr.it) + * + * Oct 1, 2020 + */ + interface EditMetadataFormUiBinder extends + UiBinder { + } + + @UiField HTMLPanel createDatasetMainPanel; + @UiField ControlGroup customFields; + @UiField Button addCustomFieldButton; + @UiField Button createButton; + @UiField Button resetButton; + @UiField AlertBlock infoBlock; + @UiField AlertBlock onContinueAlertBlock; + @UiField AlertBlock onCreateAlertBlock; + @UiField VerticalPanel metadataFieldsPanel; + @UiField ListBox metadataTypeListbox; + @UiField Form formFirstStep; + @UiField Button continueButton; + @UiField Paragraph selectedProfile; + @UiField TagsPanel tagsPanel; + + // info panels + @UiField Icon infoIconTypes; + @UiField FocusPanel focusPanelTypes; + @UiField Popover popoverTypes; + @UiField Icon infoIconCustomFields; + @UiField FocusPanel focusPanelCustomFields; + @UiField Popover popoverCustomFields; + @UiField ControlGroup metadataTypesControlGroup; + @UiField ControlGroup productTitleGroup; + @UiField ControlGroup maintainerControlGroup; + @UiField ControlGroup versionControlGroup; + @UiField ControlGroup organizationsGroup; + @UiField ControlGroup groupsControlGroup; + + private final MetadataProfileFormBuilderServiceAsync formBuilderService = GWT.create(MetadataProfileFormBuilderService.class); + + private static final String REGEX_TITLE_PRODUCT_SUBWORD = "[^a-zA-Z0-9_.-]"; + private static final String REGEX_MAIL = "\\b[\\w.%-]+@[-.\\w]+\\.[A-Za-z]{2,4}\\b"; + private static final String NONE_PROFILE = "none"; + + // error/info messages + protected static final String ERROR_PRODUCT_CREATION = "There was an error while trying to publish your item."; + protected static final String PRODUCT_CREATED_OK = "Item correctly published!"; + private static final String TRYING_TO_CREATE_PRODUCT = "Trying to publish the item, please wait..."; + protected static final String MISSING_PUBLISH_RIGHTS = "It seems you are not authorized to publish on catalogue. Request it to the VRE manager or the portal administrator."; + + // tab panel + private TabPanel tabPanel; + + // add resource form + private AddResourceToDataset resourceForm; + + // the licenses + private List licenseBean; + + // event bus + private HandlerManager eventBus; + + // added custom field entries (by the user) + private List customFieldEntriesList = new ArrayList(); + + // the list of MetaDataField added + private List listOfMetadataFields = new ArrayList(); + + // dataset metadata bean + //private DatasetBean receivedBean; + + // the owner + private String owner; + // resource table + private TwinColumnSelectionMainPanel resourcesTwinPanel; + + // List of opened popup'ids + private List popupOpenedIds = new ArrayList(); + + // map of organization name title + private Map nameTitleOrganizationMap = new HashMap(); + + private String scope; + + private String genericResourceSecondaryType; + + /** + * Invoked in the most general case. + * + * @param scope the scope + * @param genericResourceSecondaryType the generic resource secondary type + * @param eventBus the event bus + */ + public CreateMetadataForm(String scope, String genericResourceSecondaryType, HandlerManager eventBus) { + this(eventBus); + this.scope = scope; + this.genericResourceSecondaryType = genericResourceSecondaryType; + MetadataProfileFormBuilderServiceAsync.Util.getInstance().getProfilesInTheScope(scope, genericResourceSecondaryType, new AsyncCallback>() { + + @Override + public void onFailure(Throwable caught) { + } + + @Override + public void onSuccess(List profiles) { + createDatasetFormBody(profiles); + } + + }); + } + + /** + * Instantiates a new creates the dataset form. + * + * @param profiles the profiles + * @param eventBus the event bus + */ + public CreateMetadataForm(List profiles, HandlerManager eventBus) { + this(eventBus); + createDatasetFormBody(profiles); + } + + + /** + * Instantiates a new creates the dataset form. + * + * @param eventBus the event bus + */ + private CreateMetadataForm(HandlerManager eventBus) { + initWidget(uiBinder.createAndBindUi(this)); + this.eventBus = eventBus; + bind(); + prepareInfoIcons(); + } + + + /** + * Bind on events. + */ + private void bind() { + // when a custom field is removed, remove it from the list + eventBus.addHandler(DeleteCustomFieldEvent.TYPE, new DeleteCustomFieldEventHandler() { + + @Override + public void onRemoveEntry(DeleteCustomFieldEvent event) { + customFieldEntriesList.remove(event.getRemovedEntry()); + customFields.remove(event.getRemovedEntry()); + } + }); + + // on close form + eventBus.addHandler(CloseCreationFormEvent.TYPE, new CloseCreationFormEventHandler() { + @Override + public void onClose(CloseCreationFormEvent event) { + InfoIconsLabels.closeDialogBox(popupOpenedIds); + } + }); + } + + /** + * Creates the dataset form body. + * + * @param profiles the profiles + */ + private void createDatasetFormBody(final List profiles){ + + if(profiles == null){ + setAlertBlock("An unknow error occurred while retrieving types, sorry", AlertType.ERROR, true); + } + else{ + prepareMetadataList(profiles); + metadataTypeListbox.setEnabled(true); + } + } + + + /** + * Add the items to the listbox and put data into the metadataPanel. + * + * @param profiles the profiles + */ + private void prepareMetadataList(final List profiles) { + + if(profiles != null && !profiles.isEmpty()){ + for(MetaDataProfileBean metadataBean: profiles){ + + metadataTypeListbox.addItem(metadataBean.getType()); + + // add handler on select + metadataTypeListbox.addChangeHandler(new ChangeHandler() { + + @Override + public void onChange(ChangeEvent event) { + + String selectedItemText = metadataTypeListbox.getSelectedItemText(); + metadataFieldsPanel.clear(); + if(selectedItemText.equals(NONE_PROFILE)){ + metadataFieldsPanel.setVisible(false); + //receivedBean.setChosenType(null); + }else{ + //receivedBean.setChosenType(selectedItemText); + addFields(selectedItemText, profiles); + } + } + }); + } + +// // hide elements or show them if needed (groups in profiles cannot be present again in groups listbox) +// if(groupsControlGroup.isVisible()){ +// List groupsToHide = new ArrayList(); +// for(MetaDataProfileBean profile: profiles) +// groupsToHide.add(profile.getType().toString()); +// +// SelectElement se = groupsListbox.getElement().cast(); +// +// for (int i = 0; i < groupsListbox.getItemCount(); i++) { +// if(groupsToHide.contains(groupsListbox.getItemText(i))){ +// se.getOptions().getItem(i).getStyle().setProperty("display", "none"); +// }else +// se.getOptions().getItem(i).getStyle().setProperty("display", ""); +// } +// } +// +// metadataTypesControlGroup.setVisible(true); + }else{ + // just hide this listbox + metadataTypesControlGroup.setVisible(false); + metadataFieldsPanel.clear(); + listOfMetadataFields.clear(); + //receivedBean.setChosenType(null); + } + } + + /** + * Add fields of the selected metadata profile to the widget. + * + * @param selectedItem the selected item + * @param listProfiles the list profiles + */ + protected void addFields(String selectedItem, List listProfiles) { + + for(MetaDataProfileBean bean: listProfiles){ + if(bean.getType().equals(selectedItem)){ + + // clear old data + listOfMetadataFields.clear(); + + // prepare the data + List fields = bean.getMetadataFields(); + List categories = bean.getCategories(); + + GWT.log("There are " + categories.size() + " categories for profile " + bean.getTitle()); + + if(categories == null || categories.isEmpty()){ + for (MetadataFieldWrapper field : fields) { + /*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{ + + // create the categories, then parse the fields. Fields do not belonging to a category are put at the end + for (CategoryWrapper categoryWrapper : categories) { + if(categoryWrapper.getFieldsForThisCategory() != null && categoryWrapper.getFieldsForThisCategory().size() > 0){ + CategoryPanel cp = new CategoryPanel(categoryWrapper.getTitle(), categoryWrapper.getDescription()); + List fieldsForThisCategory = categoryWrapper.getFieldsForThisCategory(); + fields.removeAll(fieldsForThisCategory); + + for (MetadataFieldWrapper metadataFieldWrapper : fieldsForThisCategory) { + + /*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); + } + } + + // add the remaining one at the end of the categories + CategoryPanel extrasCategory = new CategoryPanel("Other", null); + for (MetadataFieldWrapper field : fields) { + + /*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); + } + metadataFieldsPanel.setVisible(true); + } + } + } + + + /** + * Adds the custom field event. + * + * @param e the e + */ + @UiHandler("addCustomFieldButton") + void addCustomFieldEvent(ClickEvent e){ + + CustomFieldEntry toAdd = new CustomFieldEntry(eventBus, "", "", true); + customFieldEntriesList.add(toAdd); + customFields.add(toAdd); + + } + + /** + * On continue button. + * + * @param e the e + */ + @UiHandler("continueButton") + void onContinueButton(ClickEvent e){ + + // validate data + final String errorMsg = validateDataOnContinue(); + + if(errorMsg != null){ + + alertOnContinue("Please check inserted data [" + errorMsg + "]", AlertType.ERROR); + return; + + }else{ + + Window.alert("Called onContinueButton"); + } + } + + /** + * After onContinue ... + */ + private void actionsAfterOnContinue(){ + + Window.alert("Called actionsAfterOnContinue"); + + if(metadataTypeListbox.getSelectedItemText().equals(NONE_PROFILE)) + selectedProfile.setText(""); + else + selectedProfile.setText("Selected Type is " + metadataTypeListbox.getSelectedItemText()); + + } + + + /** + * On go back button first step. + * + * @param e the e + */ + @UiHandler("goBackButtonFirstStep") + void onGoBackButtonFirstStep(ClickEvent e){ + + Window.alert("Called onGoBackButtonFirstStep"); + +// // swap forms +// formFirstStep.setVisible(true); +// formSecondStep.setVisible(false); +// formThirdStep.setVisible(false); + + } + + + /** + * On go back button. + * + * @param e the e + */ + @UiHandler("goBackButtonSecondStep") + void onGoBackButton(ClickEvent e){ + + Window.alert("Called onGoBackButton"); + +// // swap forms +// if(isWorkspaceRequest){ +// formFirstStep.setVisible(hideManageResources()); +// formSecondStep.setVisible(!hideManageResources()); +// }else{ +// formFirstStep.setVisible(true); +// formSecondStep.setVisible(false); +// } +// formThirdStep.setVisible(false); + + } + + /** + * On continue third step. + * + * @param e the e + */ + @UiHandler("continueThirdStep") + void onContinueThirdStep(ClickEvent e){ + + Window.alert("Called onGoBackButton"); + + // swap forms +// formSecondStep.setVisible(false); +// formThirdStep.setVisible(true); + + } + + + /** + * Creates the dataset event. + * + * @param e the e + */ + @UiHandler("createButton") + void createDatasetEvent(ClickEvent e){ + + String errorMessage = areProfileDataValid(); + + if(errorMessage != null){ + alertOnCreate("Please check the inserted values and the mandatory fields [" + errorMessage +"]", AlertType.ERROR, true); + } + else{ + + Set tags = new HashSet(tagsPanel.getTags()); + List groups = new ArrayList(); + List groupsToForceCreation = new ArrayList(); + Map> customFieldsMap = new HashMap>(); + + // prepare custom fields + 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())); + } + } + } + } + } + + for(CustomFieldEntry customEntry : customFieldEntriesList){ + String key = customEntry.getKey(); + String value = customEntry.getValue(); + if(value != null && !value.isEmpty()){ + List valuesForThisField = null; + if(customFieldsMap.containsKey(key)) + valuesForThisField = customFieldsMap.get(key); + else + valuesForThisField = new ArrayList(); + valuesForThisField.add(value); + customFieldsMap.put(key, valuesForThisField); + } + + } + + // alert + alertOnCreate(TRYING_TO_CREATE_PRODUCT, AlertType.INFO, false); + + // invoke the create method + createButton.setEnabled(false); + + } + } + + /** + * Prepare the info icons of all core metadata info. + */ + private void prepareInfoIcons() { + + // tags + tagsPanel.prepareIcon(popupOpenedIds); + + + // profiles (or types) + InfoIconsLabels.preparePopupPanelAndPopover( + InfoIconsLabels.PROFILES_INFO_ID_POPUP, + InfoIconsLabels.PROFILES_INFO_TEXT, + InfoIconsLabels.PROFILES_INFO_CAPTION, + infoIconTypes, + popoverTypes, + focusPanelTypes, + popupOpenedIds + ); + + // custom fields + InfoIconsLabels.preparePopupPanelAndPopover( + InfoIconsLabels.CUSTOM_FIELDS_INFO_ID_POPUP, + InfoIconsLabels.CUSTOM_FIELDS_INFO_TEXT, + InfoIconsLabels.CUSTOM_FIELDS_INFO_CAPTION, + infoIconCustomFields, + popoverCustomFields, + focusPanelCustomFields, + popupOpenedIds + ); + } + + /** + * Test if profile data are valid. + * + * @return the string + */ + private String areProfileDataValid() { + + 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; + } + } + } + + return null; + } + + /** + * On continue show alert box and enable buttons. + * + * @param text the text + * @param type the type + */ + private void alertOnContinue(String text, AlertType type){ + + onContinueAlertBlock.setText(text); + onContinueAlertBlock.setType(type); + onContinueAlertBlock.setVisible(true); + continueButton.setEnabled(true); + resetButton.setEnabled(true); + + // hide after some seconds + Timer t = new Timer() { + + @Override + public void run() { + + onContinueAlertBlock.setVisible(false); + + } + }; + + t.schedule(4000); + } + + /** + * On continue show alert box and enable buttons. + * + * @param text the text + * @param type the type + * @param hideAfterAWhile the hide after A while + */ + private void alertOnCreate(String text, AlertType type, boolean hideAfterAWhile){ + + Window.alert("Called alertOnCreate"); + +// onCreateAlertBlock.setText(text); +// onCreateAlertBlock.setType(type); +// onCreateAlertBlock.setVisible(true); +// createButton.setEnabled(true); +// goBackButtonSecondStep.setEnabled(true); +// +// if(hideAfterAWhile){ +// // hide after some seconds +// Timer t = new Timer() { +// +// @Override +// public void run() { +// +// onCreateAlertBlock.setVisible(false); +// +// } +// }; +// t.schedule(10000); +// } + } + + /** + * Validate data. + * + * @return true on success, false otherwise + */ + private String validateDataOnContinue() { + +// // remove errors +// productTitleGroup.setType(ControlGroupType.NONE); +// maintainerControlGroup.setType(ControlGroupType.NONE); +// versionControlGroup.setType(ControlGroupType.NONE); +// metadataTypesControlGroup.setType(ControlGroupType.NONE); +// organizationsGroup.setType(ControlGroupType.NONE); +// tagsPanel.setGroupPanelType(ControlGroupType.NONE); +// +// String title = titleTextBox.getText().trim(); +// if(title.isEmpty()){ +// productTitleGroup.setType(ControlGroupType.ERROR); +// return "Missing title"; +// } +// +// // better check for the title +// String[] splittedTitle = title.split(" "); +// +// for (String word : splittedTitle) { +// String replaced = word.replaceAll(REGEX_TITLE_PRODUCT_SUBWORD, ""); +// if(!replaced.equals(word)){ +// productTitleGroup.setType(ControlGroupType.ERROR); +// return "Please note not all characters are allowed for the title"; +// } +// } +// +// // email reg expression +// String maintainerMail = maintainerEmailTextbox.getText(); +// if(!maintainerMail.isEmpty() && !maintainerMail.matches(REGEX_MAIL)){ +// maintainerControlGroup.setType(ControlGroupType.ERROR); +// return "Not valid maintainer email"; +// } +// +// // check if version is a number +// try{ +// int number = Integer.valueOf(versionTextbox.getText().trim()); +// if(number <= 0) +// throw new Exception(); +// }catch(Exception e){ +// versionControlGroup.setType(ControlGroupType.ERROR); +// return "Version must be a natural number greater than zero"; +// } +// +// // check if metadata profile is different from none and its mandatory fields have been fulfilled +// if(checkSelectedMetaDataProfile()){ +// metadataTypesControlGroup.setType(ControlGroupType.ERROR); +// return "You must select a Type different frome none"; +// } +// +// if(organizationsListbox.getSelectedItemText() == null){ +// organizationsGroup.setType(ControlGroupType.ERROR); +// return "You must select an organization in which you want to publish"; +// } +// +// // at least one tag.. +// if(tagsPanel.getTags().isEmpty()){ +// tagsPanel.setGroupPanelType(ControlGroupType.ERROR); +// return "Please add at least one meaningful tag for the item"; +// } + + return null; + } + + /** + * Checks if a metadata profile has been chosen and its fields have been fulfilled. + * + * @return true, if successful + */ + private boolean checkSelectedMetaDataProfile() { + return metadataTypeListbox.getSelectedItemText().equals(NONE_PROFILE) && metadataTypeListbox.getItemCount() != 1; + } + + /** + * Reset form event. + * + * @param e the e + */ + @UiHandler("resetButton") + void resetFormEvent(ClickEvent e){ + + // delete custom fields + for (CustomFieldEntry customField : customFieldEntriesList) { + customField.removeFromParent(); + } + customFieldEntriesList.clear(); + } + + /** + * Disable dataset editable fields once the dataset has been successfully created. + */ + protected void disableDatasetFields() { + + tagsPanel.freeze(); + addCustomFieldButton.setEnabled(false); + metadataTypeListbox.setEnabled(false); + + for(CustomFieldEntry ce: customFieldEntriesList) + ce.freeze(); + + // disable profile fields + for (MetaDataField metaField : listOfMetadataFields) { + for (MetaDataFieldSkeleton field : metaField.getListOfMetadataFields()) { + field.freeze(); + } + + } + + // freeze table of resources + if(resourcesTwinPanel != null) + resourcesTwinPanel.freeze(); + } + + /** + * change alert block behavior. + * + * @param textToShow the text to show + * @param type the type + * @param visible the visible + */ + private void setAlertBlock(String textToShow, AlertType type, boolean visible){ + + infoBlock.setText(textToShow); + infoBlock.setType(type); + infoBlock.setVisible(visible); + + } + + /** + * On selected license change. + * + * @param c the c + */ + @UiHandler("licenseListbox") + void onSelectedLicenseChange(ChangeEvent c){ + + showLicenseUrl(); + + } + + /** + * The body of the onSelectedLicenseChange. + */ + private void showLicenseUrl(){ + + Window.alert("Called showLicenseUrl"); + } + +} \ No newline at end of file diff --git a/src/main/java/org/gcube/portlets/widgets/mpformbuilder/client/form/generic/CreateMetadataForm.ui.xml b/src/main/java/org/gcube/portlets/widgets/mpformbuilder/client/form/generic/CreateMetadataForm.ui.xml new file mode 100644 index 0000000..2e6f849 --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/mpformbuilder/client/form/generic/CreateMetadataForm.ui.xml @@ -0,0 +1,410 @@ + + + + .form-main-style { + margin-left: 10px; + } + + .fieldset-border-style { + border: 1px groove #444; + -webkit-box-shadow: 0px 0px 0px 0px #000; + box-shadow: 0px 0px 0px 0px #000; + padding: 10px; + } + + .legend-style { + width: auto; + padding: 10px; + margin-bottom: 0px; + } + + @external .form-horizontal .input-large; + .form-horizontal .input-large .input-prepend { + width: 95%; + } + + .block-alert-style { + margin-top: 10px; + padding: 10px; + margin-bottom: 10px; + } + + .tagsPanelStyle { + display: inline-block; + } + + .selected-profile { + font-weight: bold; + } + + .label-go-to-product { + display: inline-block; + vertical-align: middle; + font-weight: bold; + } + + .the-margin-left{ + margin-left: 5px; + } + + + + + + + Insert Item Information + + * + is required + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Types: + + + none + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Continue + Reset + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Insert Item Profile Information + + * + is required + + + + + + + + + + + Custom Field(s): + + + + + + + + + + + + + + + + + + + + + Go to the Item + + + + Add Resources + + Create + + Go + Back + + + + + \ No newline at end of file diff --git a/src/main/java/org/gcube/portlets/widgets/mpformbuilder/client/openlayerwidget/GeoJsonAreaSelectionDialog.java b/src/main/java/org/gcube/portlets/widgets/mpformbuilder/client/openlayerwidget/GeoJsonAreaSelectionDialog.java new file mode 100644 index 0000000..b2dce1f --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/mpformbuilder/client/openlayerwidget/GeoJsonAreaSelectionDialog.java @@ -0,0 +1,208 @@ +/** + * + */ +package org.gcube.portlets.widgets.mpformbuilder.client.openlayerwidget; + +import org.gcube.portlets.widgets.openlayerbasicwidgets.client.event.SelectAreaDialogEvent; +import org.gcube.portlets.widgets.openlayerbasicwidgets.client.event.SelectAreaDialogEvent.SelectAreaDialogEventHandler; +import org.gcube.portlets.widgets.openlayerbasicwidgets.client.event.SelectAreaDialogEventType; +import org.gcube.portlets.widgets.openlayerbasicwidgets.client.widgets.AreaSelectionDialog; +import org.gcube.portlets.widgets.openlayerbasicwidgets.client.widgets.GeometryType; + +import com.github.gwtbootstrap.client.ui.ListBox; +import com.google.gwt.core.client.JavaScriptObject; +import com.google.gwt.core.client.JsonUtils; +import com.google.gwt.json.client.JSONObject; +import com.google.gwt.user.client.Command; + + + +/** + * The Class GeoJsonAreaSelectionDialog. + * + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * Feb 20, 2019 + */ +public class GeoJsonAreaSelectionDialog extends AreaSelectionDialog{ + + + private String wktArea; + private Command onResponseCommand; + private ListBox geometries; + + /** + * Instantiates a new geo json area selection dialog. + * + * @param geometry the geometry + */ + public GeoJsonAreaSelectionDialog(GeometryType geometry) { + super(geometry); + + //THE HANDLER + SelectAreaDialogEventHandler handler = new SelectAreaDialogEventHandler() { + + @Override + public void onResponse(SelectAreaDialogEvent event) { + print("SelectAreaDialog Response: "+event); + + if(event==null) + return; + + SelectAreaDialogEventType closedType = event.getSelectAreaDialogEventType(); + + if(closedType==null) + return; + + wktArea = null; + if(closedType.equals(SelectAreaDialogEventType.Completed)){ + wktArea = event.getArea(); + onResponseCommand.execute(); + } + } + }; + + addSelectAreaDialogEventHandler(handler); + this.getElement().addClassName("GeoJson-DialogBox"); + setZIndex(10000); + } + + + /** + * Fire command on response. + * + * @param command the command + */ + public void fireCommandOnResponse(Command command){ + this.onResponseCommand = command; + } + + + /** + * Convert wkt to geo json. + * + * @param wktData the wkt data + * @return the string + */ + private static native String convertWKTToGeoJSON(String wktData) /*-{ + try { + var ol = $wnd.ol; + var geojson_options = {}; + var wkt_format = new ol.format.WKT(); + var wktFeature = wkt_format.readFeature(wktData); + //console.log('WKT feature: '+wktFeature); + var wkt_options = {}; + var geojson_format = new ol.format.GeoJSON(wkt_options); + console.log('geojson_format: '+geojson_format); + var geoJsonFeature = geojson_format.writeFeature(wktFeature); + //console.log('GeoJSON Feature: '+geoJsnameonFeature); + return geoJsonFeature; + }catch(err) { + console.log(err.message); + return null; + } + }-*/; + + /** + * Prints the. + * + * @param txt the txt + * @return the string + */ + public static native String print(String txt) /*-{ + console.log(txt) + }-*/; + + + /** + * Wkt to geo json. + * + * @param wktTxt the wkt txt + * @return the string + * @throws Exception the exception + */ + public String wktToGeoJSON(String wktTxt) throws Exception{ + try { + String geoJSON = convertWKTToGeoJSON(wktTxt); + //Window.alert("geoJSON: "+geoJSON); + print("geoJSON: "+geoJSON); + + if(geoJSON==null) + throw new Exception(); + + JavaScriptObject toJSON = JsonUtils.safeEval(geoJSON); + JSONObject objJson = new JSONObject(toJSON); + return objJson.get("geometry").toString(); + }catch(Exception e) { + //silent + throw new Exception("Sorry, an error occurred while getting GeoJSON format for the drawn Geometry"); + } + } + + /** + * Gets the WKT to geo json. + * + * @return the WKT to geo json + * @throws Exception the exception + */ + public String getWKTToGeoJSON() throws Exception{ + + if(wktArea==null){ + print("wktArea is null"); + throw new Exception("Sorry, an error occurred while reading the drawn Geometry"); + } + //print("wktArea is: "+wktArea); + return wktToGeoJSON(wktArea); + } + + + /** + * Gets the wkt area. + * + * @return the wktArea + */ + public String getWktArea() { + + return wktArea; + } + + /** + * Gets the geometries. + * + * @return the geometries + */ + public static ListBox getGeometries() { + ListBox geometries = new ListBox(); + + //see Feature #13074 +// for (GeometryType geometry : GeometryType.values()) { +// geometries.addItem(geometry.name(),geometry.name()); +// } + + geometries.addItem(GeometryType.Point.name(), GeometryType.Point.name()); + geometries.addItem(GeometryType.LineString.name(), GeometryType.LineString.name()); + geometries.addItem(GeometryType.Triangle.name(), GeometryType.Triangle.name()); + geometries.addItem(GeometryType.Square.name(), GeometryType.Square.name()); + geometries.addItem(GeometryType.Box.name(), GeometryType.Box.name()); + return geometries; + } + + /** + * To geometry. + * + * @param name the name + * @return the geometry type + */ + public static GeometryType toGeometry(String name){ + + GeometryType theGeom = null; + try { + theGeom = GeometryType.valueOf(name); + }catch (Exception e) { + //silent + } + + return theGeom; + } + + +} diff --git a/src/main/java/org/gcube/portlets/widgets/mpformbuilder/client/ui/icons/Images.java b/src/main/java/org/gcube/portlets/widgets/mpformbuilder/client/ui/icons/Images.java new file mode 100644 index 0000000..6ab9cf9 --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/mpformbuilder/client/ui/icons/Images.java @@ -0,0 +1,13 @@ +package org.gcube.portlets.widgets.mpformbuilder.client.ui.icons; + +import com.google.gwt.resources.client.ClientBundle; +import com.google.gwt.resources.client.ImageResource; + +public interface Images extends ClientBundle { + + @Source("file.png") + ImageResource fileIcon(); + + @Source("folder.png") + ImageResource folderIcon(); +} diff --git a/src/main/java/org/gcube/portlets/widgets/mpformbuilder/client/ui/icons/file.png b/src/main/java/org/gcube/portlets/widgets/mpformbuilder/client/ui/icons/file.png new file mode 100644 index 0000000000000000000000000000000000000000..b0e069519909cfc23ce4f424cfd87d36385f70f2 GIT binary patch literal 1186 zcmV;T1YP@yP)H8P_JGyl7o}0QTh>Nz1N>M0SM390YSlza^VChD? zNQGFD_LdoPpQpo<JX``hK^LS!7$Q%%H+}kD=K*_Q)?FwF`MZg)>y#?0+-7y8|Ow2p|Mc)gpMa2zv(% zGa?u=(QL#p4CgO^MF_620oq|H4-xr0V6sp~hz4}7KEOUh%-+RHz89In z_J#MK0ll*KH3*+ZZg3C#mA5|3S>YLc{6j2d z3Pu&qU3uR7igFLJ%yvLS*ed^gEL31Xf~3knCkqKFwGaci72dxS{uWAojvT8HDdl)9 zgfPy4JKXR9S7{YdEEY$!kczw&cX#3uu;H47dOu1aHO1&c2sq6+jy1fOg*ezk`E6r_ zMv{nBNalo-c?GyEl;?rX2p&aI3ZDw0LSP2es?^E+FEnQF+k`mb0j^dOpoOIH1vwZD zTEOTcV;0~MHX%H)3_lzWb>dz$jKpBjS0VsDAtoowqSxzn>h=0}*VorK02uzK7IFuB zKZQqCMYr1(H#avT2)ZH+d!mnf67U~RO^Fw^n&@<*{>jP7*NAU|AZU|?5Jl&csIB_$ zPLOrd4k!V4cXy)EXo$13GYGj=f1!){`FSxnHz#5Qz6bn_4;$Yf9UZ+T`#3tlV!SHP zBKrNlxW8{F`&X|%7d2EIc1bz{Ve$F-`A?ghn{N&e4;vsD_`TF4N9_cH;8Xv@HtK|d z*C%luLePBz55NC~FEU^4?CjJDo&@*}t?k&fb^z5*W?*`HCJ}yndn;P4mVj-3+27xP zy|%XY2LO65rlJ^Iu#HrtgB-#_Jyd;mc2>08Z3Qn;`8q7~W@BUHcY^omfNyuG6Hye4 z5FPlSQV}yV)5`bp#l^+p!NI|oD=RC%68sZ&z%mb!Qk+!(;o%{^y1F{r+uM6hl^t*WE6haagQaN4YFZEgJxfIb7{?|@V}M*QSg79s)+>=w@XCdiE-x?tczk^P4gk^U<=~FIKz_Wsy804lG*Nkm z#IJ3P3>Fs`|7O2-To-*l9~A_F1_A+_ z|0Q)_9>3>sILk?VOZKGL#alw5M0HBnK}CK*}TO&%fB<6fZq`Z#n6!>&qly--Lflbs?#}Xw$iIH7tOK?63puk3g_Dmc{C=}+ zbb0{^-GoBh*#FKo+SqHftmdrIL9En7^czE@*hEM@6fRIa*-}|A;LVQQ{g~6Srsxo5 z9kHyANT!USRK{{z!_rp`uTv%4ZV{7W%IpR3!tS=tuu(P<*BI9M#1DL;s2Ygoe;}k# z1pCPiOviKf28)~7?pj8JC~1iDiD5qFZL)~PFDm?>3xC_n!4pZ?8$A7#Z-u2A-br;V zrR#W=szKPTLP#DXq2qomV{dTddEE4_Nbs&^FxBVLabgl~z1XlfaQoBD^InE0njZ|W zJ?QBLTzI_wb3#aBVj(pcUVG4U;zJtfCGvBYkl``z{3(qc_7XC5 { + } + + @UiField VerticalPanel fieldsPanel; + @UiField PageHeader categoryHeader; + //private List fieldsForThisCategory; + + private List fieldsForThisCategory; + + public CategoryPanel() { + initWidget(uiBinder.createAndBindUi(this)); + } + + /** + * + * @param fieldsForThisCategory + * @param title + * @param description + */ + public CategoryPanel(String title, String description) { + initWidget(uiBinder.createAndBindUi(this)); + title = title == null ? "" : title; + description = description == null ? "" : description; + categoryHeader.setTitle(title); + categoryHeader.setText(title); + categoryHeader.setSubtext(description); + categoryHeader.getElement().getStyle().setFloat(Float.LEFT); + } + + /** + * Add a field to this widget + * @param fieldWidget + */ + /*public void addField(MetaDataFieldSkeleton fieldWidget) { + if(fieldsForThisCategory == null){ + fieldsForThisCategory = new ArrayList(); + fieldWidget.setVisible(true); + fieldsPanel.setVisible(true); + } + 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/mpformbuilder/client/ui/metadata/CategoryPanel.ui.xml b/src/main/java/org/gcube/portlets/widgets/mpformbuilder/client/ui/metadata/CategoryPanel.ui.xml new file mode 100644 index 0000000..68e9845 --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/mpformbuilder/client/ui/metadata/CategoryPanel.ui.xml @@ -0,0 +1,12 @@ + + + + + + + + + + \ No newline at end of file diff --git a/src/main/java/org/gcube/portlets/widgets/mpformbuilder/client/ui/metadata/CustomFieldEntry.java b/src/main/java/org/gcube/portlets/widgets/mpformbuilder/client/ui/metadata/CustomFieldEntry.java new file mode 100644 index 0000000..42e47c7 --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/mpformbuilder/client/ui/metadata/CustomFieldEntry.java @@ -0,0 +1,107 @@ +package org.gcube.portlets.widgets.mpformbuilder.client.ui.metadata; + +import org.gcube.portlets.widgets.mpformbuilder.client.events.DeleteCustomFieldEvent; + +import com.github.gwtbootstrap.client.ui.Button; +import com.github.gwtbootstrap.client.ui.InputAddOn; +import com.github.gwtbootstrap.client.ui.TextBox; +import com.google.gwt.core.client.GWT; +import com.google.gwt.event.dom.client.ClickEvent; +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.uibinder.client.UiHandler; +import com.google.gwt.user.client.ui.Composite; +import com.google.gwt.user.client.ui.Widget; + +/** + * A custom field entry that has two textboxes, one for the key value and the other for the value. + * @author Costantino Perciante at ISTI-CNR (costantino.perciante@isti.cnr.it) + */ +public class CustomFieldEntry extends Composite { + + private static CustomFieldEntryUiBinder uiBinder = GWT + .create(CustomFieldEntryUiBinder.class); + + interface CustomFieldEntryUiBinder extends + UiBinder { + } + + @UiField InputAddOn keyFieldPrepend; + @UiField InputAddOn valueFieldPrepend; + @UiField Button removeCustomField; + + //inserted values + private String value; + private String key; + private boolean isCustomCreatedByUser; + + // event bus + private HandlerManager eventBus; + + public CustomFieldEntry(HandlerManager eventBus, String key, String value, boolean isCustomCreatedByUser) { + initWidget(uiBinder.createAndBindUi(this)); + + // save information + this.eventBus = eventBus; + this.value = value; + this.key = key; + this.isCustomCreatedByUser = isCustomCreatedByUser; + + // remove the first appendbox + if(!isCustomCreatedByUser){ + this.valueFieldPrepend.removeFromParent(); + this.keyFieldPrepend.setPrependText(key + ":"); + ((TextBox)this.keyFieldPrepend.getWidget(1)).setText(value); + } + } + + /** + * Retrieve the key value + * @return + */ + public String getKey(){ + + if(isCustomCreatedByUser){ + + return ((TextBox)this.keyFieldPrepend.getWidget(1)).getText(); + + } + + return key; + + } + + /** + * Retrieve the value + * @return + */ + public String getValue(){ + + if(isCustomCreatedByUser){ + + return ((TextBox)this.valueFieldPrepend.getWidget(1)).getText(); + + } + + return value; + } + + @UiHandler("removeCustomField") + void onRemoveCustomField(ClickEvent e){ + + // fire event + eventBus.fireEvent(new DeleteCustomFieldEvent(this)); + + } + + /** + * Remove delete button + */ + public void freeze() { + + removeCustomField.setEnabled(false); + + } + +} diff --git a/src/main/java/org/gcube/portlets/widgets/mpformbuilder/client/ui/metadata/CustomFieldEntry.ui.xml b/src/main/java/org/gcube/portlets/widgets/mpformbuilder/client/ui/metadata/CustomFieldEntry.ui.xml new file mode 100644 index 0000000..780c41a --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/mpformbuilder/client/ui/metadata/CustomFieldEntry.ui.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/java/org/gcube/portlets/widgets/mpformbuilder/client/ui/metadata/MetaDataFieldSkeleton.java b/src/main/java/org/gcube/portlets/widgets/mpformbuilder/client/ui/metadata/MetaDataFieldSkeleton.java new file mode 100644 index 0000000..0f0fda3 --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/mpformbuilder/client/ui/metadata/MetaDataFieldSkeleton.java @@ -0,0 +1,926 @@ +package org.gcube.portlets.widgets.mpformbuilder.client.ui.metadata; + +import java.util.ArrayList; +import java.util.List; + +import org.gcube.portlets.widgets.mpformbuilder.client.events.CloseCreationFormEvent; +import org.gcube.portlets.widgets.mpformbuilder.client.events.CloseCreationFormEventHandler; +import org.gcube.portlets.widgets.mpformbuilder.client.openlayerwidget.GeoJsonAreaSelectionDialog; +import org.gcube.portlets.widgets.mpformbuilder.client.ui.timeandranges.DataTimeBox; +import org.gcube.portlets.widgets.mpformbuilder.client.ui.utils.GcubeDialogExtended; +import org.gcube.portlets.widgets.mpformbuilder.shared.metadata.FieldAsGroup; +import org.gcube.portlets.widgets.mpformbuilder.shared.metadata.FieldAsTag; +import org.gcube.portlets.widgets.mpformbuilder.shared.metadata.MetadataFieldWrapper; +import org.gcube.portlets.widgets.mpformbuilder.shared.metadata.TaggingGroupingValue; + +import com.github.gwtbootstrap.client.ui.Alert; +import com.github.gwtbootstrap.client.ui.Button; +import com.github.gwtbootstrap.client.ui.CheckBox; +import com.github.gwtbootstrap.client.ui.ControlGroup; +import com.github.gwtbootstrap.client.ui.ControlLabel; +import com.github.gwtbootstrap.client.ui.Controls; +import com.github.gwtbootstrap.client.ui.Icon; +import com.github.gwtbootstrap.client.ui.ListBox; +import com.github.gwtbootstrap.client.ui.Popover; +import com.github.gwtbootstrap.client.ui.TextArea; +import com.github.gwtbootstrap.client.ui.TextBox; +import com.github.gwtbootstrap.client.ui.constants.AlertType; +import com.github.gwtbootstrap.client.ui.constants.ControlGroupType; +import com.github.gwtbootstrap.client.ui.constants.IconType; +import com.google.gwt.core.client.GWT; +import com.google.gwt.dom.client.Element; +import com.google.gwt.dom.client.SpanElement; +import com.google.gwt.dom.client.Style.Cursor; +import com.google.gwt.dom.client.Style.Display; +import com.google.gwt.dom.client.Style.Unit; +import com.google.gwt.event.dom.client.ClickEvent; +import com.google.gwt.event.dom.client.ClickHandler; +import com.google.gwt.event.logical.shared.ResizeEvent; +import com.google.gwt.event.logical.shared.ResizeHandler; +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.uibinder.client.UiHandler; +import com.google.gwt.user.client.Command; +import com.google.gwt.user.client.Window; +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.HTML; +import com.google.gwt.user.client.ui.HorizontalPanel; +import com.google.gwt.user.client.ui.Label; +import com.google.gwt.user.client.ui.SimplePanel; +import com.google.gwt.user.client.ui.VerticalPanel; +import com.google.gwt.user.client.ui.Widget; + +public class MetaDataFieldSkeleton extends Composite { + + private static MetaDataFieldSkeletonUiBinder uiBinder = GWT.create(MetaDataFieldSkeletonUiBinder.class); + + interface MetaDataFieldSkeletonUiBinder extends UiBinder { + } + + @UiField + Element mandatorySymbol; + @UiField + SpanElement name; + @UiField + SimplePanel elementPanel; + @UiField + FlowPanel noteFieldContainer; + @UiField + Popover noteFieldPopover; + @UiField + ControlLabel controlLabel; + @UiField + Controls controls; + @UiField + Icon infoIcon; + @UiField + FocusPanel focusPanelIconContainer; + @UiField + ControlGroup metafieldControlGroup; + + // private static final String REGEX_IS_NUMBER = "[0-9]+[.]?[0-9]+"; + + // the element that holds the value (it could be a checkbox, textbox or listbox, + // textarea, calendar, two calendars, more calendars) + private Widget holder; + + // the field this object represents + private MetadataFieldWrapper field; + + // the dialog box for this metadata + private GcubeDialogExtended dialog; + + // range list + private List rangesList = new ArrayList(); + + private List