diff --git a/.settings/org.eclipse.wst.common.component b/.settings/org.eclipse.wst.common.component index 3b80e47..19dcf7d 100644 --- a/.settings/org.eclipse.wst.common.component +++ b/.settings/org.eclipse.wst.common.component @@ -1,10 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/CHANGELOG.md b/CHANGELOG.md index 7dd4803..ebcd8e6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,13 @@ All notable changes to this project will be documented in this file. This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [v2.0.1-SNAPSHOT] - 2021-05-04 + +#### Enhancements + +[#21188] Avoiding the catalogue widget window close if the user clicks outside it + + ## [v2.0.0] - 2021-04-12 #### Enhancements diff --git a/pom.xml b/pom.xml index d85db2e..b3b2ead 100644 --- a/pom.xml +++ b/pom.xml @@ -14,7 +14,7 @@ org.gcube.portlets.gcubeckan gcube-ckan-datacatalog war - 2.0.0 + 2.0.1-SNAPSHOT gCube CKAN Data Catalog The gCube CKAN Data Catalog portlet @@ -40,7 +40,7 @@ org.gcube.distribution maven-portal-bom - 3.6.1 + 3.6.1-SNAPSHOT pom import diff --git a/src/main/java/org/gcube/portlets/gcubeckan/gcubeckandatacatalog/client/CkanEventHandlerManager.java b/src/main/java/org/gcube/portlets/gcubeckan/gcubeckandatacatalog/client/CkanEventHandlerManager.java index b13066b..4eef43e 100644 --- a/src/main/java/org/gcube/portlets/gcubeckan/gcubeckandatacatalog/client/CkanEventHandlerManager.java +++ b/src/main/java/org/gcube/portlets/gcubeckan/gcubeckandatacatalog/client/CkanEventHandlerManager.java @@ -32,13 +32,10 @@ import org.gcube.portlets.gcubeckan.gcubeckandatacatalog.client.view.GCubeCkanDa import org.gcube.portlets.gcubeckan.gcubeckandatacatalog.shared.CkanConnectorAccessPoint; import org.gcube.portlets.widgets.ckan2zenodopublisher.client.CkanToZendoPublisherWidget; import org.gcube.portlets.widgets.ckan2zenodopublisher.shared.CatalogueItem; -import org.gcube.portlets.widgets.ckandatapublisherwidget.client.events.CloseCreationFormEvent; import org.gcube.portlets.widgets.ckandatapublisherwidget.client.ui.form.CreateDatasetForm; import org.gcube.portlets_widgets.catalogue_sharing_widget.client.ShareCatalogueWidget; import com.github.gwtbootstrap.client.ui.Modal; -import com.github.gwtbootstrap.client.ui.event.HideEvent; -import com.github.gwtbootstrap.client.ui.event.HideHandler; import com.google.gwt.core.client.GWT; import com.google.gwt.dom.client.Element; import com.google.gwt.event.shared.HandlerManager; @@ -94,9 +91,9 @@ public class CkanEventHandlerManager { eventBus.addHandler(InsertMetadataEvent.TYPE, new InsertMetadataEventHandler() { @Override - public void onInsertMetadata(InsertMetadataEvent loadSelecteReleaseEvent) { - GWT.log("loadSelecteReleaseEvent: "+loadSelecteReleaseEvent); - final Modal modal = new Modal(true, true); + public void onInsertMetadata(InsertMetadataEvent loadSelectedItemEvent) { + GWT.log("onInsertMetadata: "+loadSelectedItemEvent); + final Modal modal = new ExtModal(true, true); modal.setTitle(WIDGET_CREATE_TITLE); modal.addStyleName("insert-metadata-modal-style"); @@ -104,16 +101,23 @@ public class CkanEventHandlerManager { ((Element)modal.getElement().getChildNodes().getItem(1)).addClassName("modal-body-custom"); modal.add(new CreateDatasetForm(eventBus)); modal.setCloseVisible(true); - - // hide any popup panel opened - modal.addHideHandler(new HideHandler() { + - @Override - public void onHide(HideEvent hideEvent) { - GWT.log("HideEvent on modal fired"); - eventBus.fireEvent(new CloseCreationFormEvent()); - } - }); +// // hide any popup panel opened +// modal.addHideHandler(new HideHandler() { +// +// @Override +// public void onHide(HideEvent hideEvent) { +// GWT.log("HideEvent on modal fired"); +// GWT.log(hideEvent.toDebugString()); +// eventBus.fireEvent(new CloseCreationFormEvent()); +// +// hideEvent.preventDefault(); +// hideEvent.stopPropagation(); +// return; +// +// } +// }); GWT.log("show"); modal.show(); diff --git a/src/main/java/org/gcube/portlets/gcubeckan/gcubeckandatacatalog/client/ExtModal.java b/src/main/java/org/gcube/portlets/gcubeckan/gcubeckandatacatalog/client/ExtModal.java new file mode 100644 index 0000000..403b40d --- /dev/null +++ b/src/main/java/org/gcube/portlets/gcubeckan/gcubeckandatacatalog/client/ExtModal.java @@ -0,0 +1,133 @@ +package org.gcube.portlets.gcubeckan.gcubeckandatacatalog.client; + +import com.github.gwtbootstrap.client.ui.Modal; +import com.github.gwtbootstrap.client.ui.event.HideEvent; +import com.github.gwtbootstrap.client.ui.event.HideHandler; +import com.google.gwt.core.client.GWT; +import com.google.gwt.core.client.Scheduler; +import com.google.gwt.core.client.Scheduler.ScheduledCommand; +import com.google.gwt.dom.client.Element; +import com.google.gwt.user.client.DOM; +import com.google.gwt.user.client.Event; +import com.google.gwt.user.client.EventListener; +import com.google.gwt.user.client.Random; + +/** + * The Class ExtModal. + * + * @author Francesco Mangiacrapa at ISTI-CNR francesco.mangiacrapa@isti.cnr.it + * + * Apr 29, 2021 + * + * This Class extends the {{@link Modal} preventing the default close of + * the Modal Bootstrap when clicking outside of the modal Window + */ +public class ExtModal extends Modal { + + private String elementId; + private String closeElementId; + private Boolean closeButtoClicked = false; + final private ExtModal INSTANCE = this; + + /** + * Instantiates a new ext modal. + */ + public ExtModal() { + super(); + setElementIds(); + addDeferredCommandToPreventModalClose(); + } + + /** + * Creates an empty, hidden widget with specified show behavior. + * + * @param animated true if the widget should be animated. + */ + public ExtModal(boolean animated) { + super(animated, false); + setElementIds(); + addDeferredCommandToPreventModalClose(); + } + + /** + * Creates an empty, hidden widget with specified show behavior. + * + * @param animated true if the widget should be animated. + * @param dynamicSafe true removes from RootPanel when hidden + */ + public ExtModal(boolean animated, boolean dynamicSafe) { + super(animated, dynamicSafe); + setElementIds(); + addDeferredCommandToPreventModalClose(); + } + + private void addDeferredCommandToPreventModalClose() { + Scheduler.get().scheduleDeferred(new ScheduledCommand() { + + @Override + public void execute() { + ((Element) INSTANCE.getElement().getChildNodes().getItem(0)).getFirstChildElement() + .setId(closeElementId); + preventModalCloseWhenClickingOutside(); + + } + }); + + } + + /** + * Sets the element id. + */ + private void setElementIds() { + this.elementId = "my-modal-publish-meta" + Random.nextInt(); + this.getElement().setId(elementId); + + this.closeElementId = "my-modal-close-button" + Random.nextInt(); + } + + /** + * Prevent modal close when clicking outside. + */ + private void preventModalCloseWhenClickingOutside() { + + com.google.gwt.user.client.Element buttonCloseElement = DOM.getElementById(this.closeElementId); + + if (buttonCloseElement != null) { + + Event.sinkEvents(buttonCloseElement, Event.ONCLICK); + Event.setEventListener(buttonCloseElement, new EventListener() { + + @Override + public void onBrowserEvent(Event event) { + System.out.println("ok"); + if (Event.ONCLICK == event.getTypeInt()) { + GWT.log("close event clicked"); + closeButtoClicked = true; + } + + } + }); + } else { + GWT.log("button close element not found"); + closeButtoClicked = true; + } + + // hide any popup panel opened + this.addHideHandler(new HideHandler() { + + @Override + public void onHide(HideEvent hideEvent) { + GWT.log("HideEvent on modal fired"); + GWT.log(hideEvent.toDebugString()); + GWT.log("CloseButtonClicked is: " + closeButtoClicked); + + if (!closeButtoClicked) { + hideEvent.preventDefault(); + hideEvent.stopPropagation(); + } + } + }); + + } + +}