diff --git a/src/main/java/org/sagebionetworks/web/client/PortalGinInjector.java b/src/main/java/org/sagebionetworks/web/client/PortalGinInjector.java index 89b96cb5b9..6ff7a71651 100644 --- a/src/main/java/org/sagebionetworks/web/client/PortalGinInjector.java +++ b/src/main/java/org/sagebionetworks/web/client/PortalGinInjector.java @@ -21,6 +21,7 @@ import org.sagebionetworks.web.client.presenter.ComingSoonPresenter; import org.sagebionetworks.web.client.presenter.DataAccessApprovalTokenPresenter; import org.sagebionetworks.web.client.presenter.DataAccessManagementPresenter; +import org.sagebionetworks.web.client.presenter.DataCatalogPagePresenter; import org.sagebionetworks.web.client.presenter.DownPresenter; import org.sagebionetworks.web.client.presenter.DownloadCartPresenter; import org.sagebionetworks.web.client.presenter.EmailInvitationPresenter; @@ -346,6 +347,8 @@ public interface PortalGinInjector extends Ginjector { DownloadCartPresenter getDownloadCartPresenter(); + DataCatalogPagePresenter getDataCatalogPagePresenter(); + ChangeUsernamePresenter getChangeUsernamePresenter(); TrashPresenter getTrashPresenter(); diff --git a/src/main/java/org/sagebionetworks/web/client/PortalGinModule.java b/src/main/java/org/sagebionetworks/web/client/PortalGinModule.java index 813fad0d6f..c310e0d487 100644 --- a/src/main/java/org/sagebionetworks/web/client/PortalGinModule.java +++ b/src/main/java/org/sagebionetworks/web/client/PortalGinModule.java @@ -61,6 +61,8 @@ import org.sagebionetworks.web.client.view.DataAccessApprovalTokenViewImpl; import org.sagebionetworks.web.client.view.DataAccessManagementView; import org.sagebionetworks.web.client.view.DataAccessManagementViewImpl; +import org.sagebionetworks.web.client.view.DataCatalogPageView; +import org.sagebionetworks.web.client.view.DataCatalogPageViewImpl; import org.sagebionetworks.web.client.view.DivView; import org.sagebionetworks.web.client.view.DivViewImpl; import org.sagebionetworks.web.client.view.DownView; @@ -1368,6 +1370,7 @@ protected void configure() { bind(PreviewConfigView.class).to(PreviewConfigViewImpl.class); bind(SynapseFormConfigView.class).to(SynapseFormConfigViewImpl.class); bind(DownloadCartPageView.class).to(DownloadCartPageViewImpl.class); + bind(DataCatalogPageView.class).to(DataCatalogPageViewImpl.class); bind(EditFileMetadataModalView.class) .to(EditFileMetadataModalViewImpl.class); bind(EditFileMetadataModalWidget.class) diff --git a/src/main/java/org/sagebionetworks/web/client/jsinterop/CardConfiguration.java b/src/main/java/org/sagebionetworks/web/client/jsinterop/CardConfiguration.java new file mode 100644 index 0000000000..f6942e64d6 --- /dev/null +++ b/src/main/java/org/sagebionetworks/web/client/jsinterop/CardConfiguration.java @@ -0,0 +1,30 @@ +package org.sagebionetworks.web.client.jsinterop; + +import java.util.Map; +import jsinterop.annotations.JsFunction; +import jsinterop.annotations.JsOverlay; +import jsinterop.annotations.JsPackage; +import jsinterop.annotations.JsType; +import jsinterop.base.Js; +import jsinterop.base.JsPropertyMap; + +@JsType(isNative = true, namespace = JsPackage.GLOBAL, name = "Object") +public class CardConfiguration { + + String type; + double secondaryLabelLimit; + GenericCardSchema genericCardSchema; + + @JsOverlay + public static CardConfiguration create( + String type, + int secondaryLabelLimit, + GenericCardSchema genericCardSchema + ) { + CardConfiguration config = new CardConfiguration(); + config.type = type; + config.secondaryLabelLimit = secondaryLabelLimit; + config.genericCardSchema = genericCardSchema; + return config; + } +} diff --git a/src/main/java/org/sagebionetworks/web/client/jsinterop/GenericCardSchema.java b/src/main/java/org/sagebionetworks/web/client/jsinterop/GenericCardSchema.java new file mode 100644 index 0000000000..e736a9335b --- /dev/null +++ b/src/main/java/org/sagebionetworks/web/client/jsinterop/GenericCardSchema.java @@ -0,0 +1,36 @@ +package org.sagebionetworks.web.client.jsinterop; + +import java.util.Map; +import jsinterop.annotations.JsNullable; +import jsinterop.annotations.JsOverlay; +import jsinterop.annotations.JsPackage; +import jsinterop.annotations.JsType; +import jsinterop.base.Js; +import jsinterop.base.JsPropertyMap; + +@JsType(isNative = true, namespace = JsPackage.GLOBAL, name = "Object") +public class GenericCardSchema { + + String type; + String title; + String subTitle; + String description; + String[] secondaryLabels; + + @JsOverlay + public static GenericCardSchema create( + String type, + String title, + String subTitle, + String description, + String[] secondaryLabels + ) { + GenericCardSchema config = new GenericCardSchema(); + config.type = type; + config.title = title; + config.subTitle = subTitle; + config.description = description; + config.secondaryLabels = secondaryLabels; + return config; + } +} diff --git a/src/main/java/org/sagebionetworks/web/client/jsinterop/QueryWrapperPlotNavProps.java b/src/main/java/org/sagebionetworks/web/client/jsinterop/QueryWrapperPlotNavProps.java index 04a29a41f8..4cf23dd8ce 100644 --- a/src/main/java/org/sagebionetworks/web/client/jsinterop/QueryWrapperPlotNavProps.java +++ b/src/main/java/org/sagebionetworks/web/client/jsinterop/QueryWrapperPlotNavProps.java @@ -55,8 +55,20 @@ public interface OnViewSharingSettingsHandler { @JsNullable boolean defaultShowPlots; + @JsNullable + boolean defaultShowSearchBox; + + @JsNullable + boolean hideCopyToClipboard; + + @JsNullable + boolean hideDownload; + boolean showLastUpdatedOn; + @JsNullable + CardConfiguration cardConfiguration; + @JsOverlay public static QueryWrapperPlotNavProps create( String sql, @@ -64,7 +76,14 @@ public static QueryWrapperPlotNavProps create( OnQueryCallback onQueryChange, OnQueryResultBundleCallback onQueryResultBundleChange, OnViewSharingSettingsHandler onViewSharingSettingsClicked, - boolean hideSqlEditorControl + boolean hideSqlEditorControl, + Boolean defaultShowPlots, + Boolean defaultShowSearchBox, + Boolean hideCopyToClipboard, + Boolean hideDownload, + SynapseTableProps tableConfiguration, + CardConfiguration cardConfiguration, + String name ) { QueryWrapperPlotNavProps props = new QueryWrapperPlotNavProps(); props.sql = sql; @@ -73,13 +92,35 @@ public static QueryWrapperPlotNavProps create( props.onQueryChange = onQueryChange; props.onQueryResultBundleChange = onQueryResultBundleChange; props.onViewSharingSettingsClicked = onViewSharingSettingsClicked; - props.tableConfiguration = SynapseTableProps.create(); + if (tableConfiguration != null) { + props.tableConfiguration = tableConfiguration; + } props.shouldDeepLink = false; props.name = "Items"; + if (name != null) { + props.name = name; + } props.downloadCartPageUrl = "DownloadCart:0"; props.showLastUpdatedOn = false; // SWC-6138 - hide charts by default props.defaultShowPlots = false; + if (defaultShowPlots != null) { + //unbox + props.defaultShowPlots = defaultShowPlots; + } + if (defaultShowSearchBox != null) { + //unbox + props.defaultShowSearchBox = defaultShowSearchBox; + } + if (hideCopyToClipboard != null) { + //unbox + props.hideCopyToClipboard = hideCopyToClipboard; + } + if (hideDownload != null) { + //unbox + props.hideDownload = hideDownload; + } + props.cardConfiguration = cardConfiguration; return props; } } diff --git a/src/main/java/org/sagebionetworks/web/client/mvp/AppActivityMapper.java b/src/main/java/org/sagebionetworks/web/client/mvp/AppActivityMapper.java index 419abf13c3..f61289bdda 100644 --- a/src/main/java/org/sagebionetworks/web/client/mvp/AppActivityMapper.java +++ b/src/main/java/org/sagebionetworks/web/client/mvp/AppActivityMapper.java @@ -17,6 +17,7 @@ import org.sagebionetworks.web.client.place.Challenges; import org.sagebionetworks.web.client.place.ChangeUsername; import org.sagebionetworks.web.client.place.ComingSoon; +import org.sagebionetworks.web.client.place.DataCatalogPagePlace; import org.sagebionetworks.web.client.place.Down; import org.sagebionetworks.web.client.place.EmailInvitation; import org.sagebionetworks.web.client.place.ErrorPlace; @@ -105,6 +106,7 @@ public AppActivityMapper( openAccessPlaces.add(AccessRequirementPlace.class); openAccessPlaces.add(TrustCenterPlace.class); openAccessPlaces.add(PlansPlace.class); + openAccessPlaces.add(DataCatalogPagePlace.class); excludeFromLastPlace = new ArrayList(); excludeFromLastPlace.add(Home.class); diff --git a/src/main/java/org/sagebionetworks/web/client/mvp/AppPlaceHistoryMapper.java b/src/main/java/org/sagebionetworks/web/client/mvp/AppPlaceHistoryMapper.java index 06af1b7f77..8ff884be5e 100644 --- a/src/main/java/org/sagebionetworks/web/client/mvp/AppPlaceHistoryMapper.java +++ b/src/main/java/org/sagebionetworks/web/client/mvp/AppPlaceHistoryMapper.java @@ -15,6 +15,7 @@ import org.sagebionetworks.web.client.place.ComingSoon; import org.sagebionetworks.web.client.place.DataAccessApprovalTokenPlace; import org.sagebionetworks.web.client.place.DataAccessManagementPlace; +import org.sagebionetworks.web.client.place.DataCatalogPagePlace; import org.sagebionetworks.web.client.place.Down; import org.sagebionetworks.web.client.place.DownloadCartPlace; import org.sagebionetworks.web.client.place.EmailInvitation; @@ -102,6 +103,7 @@ TrustCenterPlace.Tokenizer.class, ChatPlace.Tokenizer.class, PlansPlace.Tokenizer.class, + DataCatalogPagePlace.Tokenizer.class, } ) public interface AppPlaceHistoryMapper extends PlaceHistoryMapper {} diff --git a/src/main/java/org/sagebionetworks/web/client/place/DataCatalogPagePlace.java b/src/main/java/org/sagebionetworks/web/client/place/DataCatalogPagePlace.java new file mode 100644 index 0000000000..06862361ac --- /dev/null +++ b/src/main/java/org/sagebionetworks/web/client/place/DataCatalogPagePlace.java @@ -0,0 +1,33 @@ +package org.sagebionetworks.web.client.place; + +import com.google.gwt.place.shared.Place; +import com.google.gwt.place.shared.PlaceTokenizer; +import com.google.gwt.place.shared.Prefix; + +public class DataCatalogPagePlace extends Place { + + private String token; + + public DataCatalogPagePlace(String token) { + this.token = token; + } + + public String toToken() { + return token; + } + + @Prefix("DataCatalog") + public static class Tokenizer + implements PlaceTokenizer { + + @Override + public String getToken(DataCatalogPagePlace place) { + return place.toToken(); + } + + @Override + public DataCatalogPagePlace getPlace(String token) { + return new DataCatalogPagePlace(token); + } + } +} diff --git a/src/main/java/org/sagebionetworks/web/client/presenter/BulkPresenterProxy.java b/src/main/java/org/sagebionetworks/web/client/presenter/BulkPresenterProxy.java index d1b0e97789..bac1f965e1 100644 --- a/src/main/java/org/sagebionetworks/web/client/presenter/BulkPresenterProxy.java +++ b/src/main/java/org/sagebionetworks/web/client/presenter/BulkPresenterProxy.java @@ -32,6 +32,7 @@ import org.sagebionetworks.web.client.place.ComingSoon; import org.sagebionetworks.web.client.place.DataAccessApprovalTokenPlace; import org.sagebionetworks.web.client.place.DataAccessManagementPlace; +import org.sagebionetworks.web.client.place.DataCatalogPagePlace; import org.sagebionetworks.web.client.place.Down; import org.sagebionetworks.web.client.place.DownloadCartPlace; import org.sagebionetworks.web.client.place.EmailInvitation; @@ -548,6 +549,24 @@ public void onSuccess() { presenter.start(panel, eventBus); } + @Override + public void onFailure(Throwable caught) { + loadError(caught); + } + } + ); + } else if (place instanceof DataCatalogPagePlace) { + GWT.runAsync( + DataCatalogPagePlace.class, + new RunAsyncCallback() { + @Override + public void onSuccess() { + DataCatalogPagePresenter presenter = + ginjector.getDataCatalogPagePresenter(); + presenter.setPlace((DataCatalogPagePlace) place); + presenter.start(panel, eventBus); + } + @Override public void onFailure(Throwable caught) { loadError(caught); diff --git a/src/main/java/org/sagebionetworks/web/client/presenter/DataCatalogPagePresenter.java b/src/main/java/org/sagebionetworks/web/client/presenter/DataCatalogPagePresenter.java new file mode 100644 index 0000000000..b55170b838 --- /dev/null +++ b/src/main/java/org/sagebionetworks/web/client/presenter/DataCatalogPagePresenter.java @@ -0,0 +1,32 @@ +package org.sagebionetworks.web.client.presenter; + +import com.google.gwt.activity.shared.AbstractActivity; +import com.google.gwt.event.shared.EventBus; +import com.google.gwt.user.client.ui.AcceptsOneWidget; +import com.google.inject.Inject; +import org.sagebionetworks.web.client.view.DataCatalogPageView; + +public class DataCatalogPagePresenter + extends AbstractActivity + implements + Presenter { + + private DataCatalogPageView view; + + @Inject + public DataCatalogPagePresenter(DataCatalogPageView view) { + this.view = view; + } + + @Override + public void start(AcceptsOneWidget panel, EventBus eventBus) { + panel.setWidget(view.asWidget()); + } + + @Override + public void setPlace( + final org.sagebionetworks.web.client.place.DataCatalogPagePlace place + ) { + view.render(); + } +} diff --git a/src/main/java/org/sagebionetworks/web/client/view/DataCatalogPageView.java b/src/main/java/org/sagebionetworks/web/client/view/DataCatalogPageView.java new file mode 100644 index 0000000000..83c4f11b57 --- /dev/null +++ b/src/main/java/org/sagebionetworks/web/client/view/DataCatalogPageView.java @@ -0,0 +1,7 @@ +package org.sagebionetworks.web.client.view; + +import com.google.gwt.user.client.ui.IsWidget; + +public interface DataCatalogPageView extends IsWidget { + public void render(); +} diff --git a/src/main/java/org/sagebionetworks/web/client/view/DataCatalogPageViewImpl.java b/src/main/java/org/sagebionetworks/web/client/view/DataCatalogPageViewImpl.java new file mode 100644 index 0000000000..d19a6cb832 --- /dev/null +++ b/src/main/java/org/sagebionetworks/web/client/view/DataCatalogPageViewImpl.java @@ -0,0 +1,76 @@ +package org.sagebionetworks.web.client.view; + +import com.google.gwt.user.client.Window; +import com.google.gwt.user.client.ui.SimplePanel; +import com.google.gwt.user.client.ui.Widget; +import com.google.inject.Inject; +import java.util.HashMap; +import java.util.Map; +import org.sagebionetworks.web.client.context.SynapseReactClientFullContextPropsProvider; +import org.sagebionetworks.web.client.jsinterop.CardConfiguration; +import org.sagebionetworks.web.client.jsinterop.GenericCardSchema; +import org.sagebionetworks.web.client.widget.header.Header; +import org.sagebionetworks.web.client.widget.table.explore.QueryWrapperPlotNav; + +public class DataCatalogPageViewImpl implements DataCatalogPageView { + + SimplePanel container; + + private Header headerWidget; + private SynapseReactClientFullContextPropsProvider propsProvider; + + @Inject + public DataCatalogPageViewImpl( + Header headerWidget, + SynapseReactClientFullContextPropsProvider propsProvider + ) { + container = new SimplePanel(); + container.addStyleName("padding-30"); + this.headerWidget = headerWidget; + this.propsProvider = propsProvider; + } + + @Override + public void render() { + Window.scrollTo(0, 0); // scroll user to top of page + headerWidget.configure(); + + String[] secondaryLabels = { "contributors", "individuals", "id", "link" }; + GenericCardSchema genericCardSchema = GenericCardSchema.create( + "dataset", + "name", + "community", + "description", + secondaryLabels + ); + CardConfiguration cardConfiguration = CardConfiguration.create( + "GENERIC_CARD", + 4, + genericCardSchema + ); + + QueryWrapperPlotNav plotNav = new QueryWrapperPlotNav( + propsProvider, + "SELECT * FROM syn61609402 WHERE includedInDataCatalog = 'true'", + null, + null, + newBundle -> {}, + null, + true, + false, + true, + true, + true, + null, + cardConfiguration, + "Data Catalog" + ); + container.clear(); + container.setWidget(plotNav); + } + + @Override + public Widget asWidget() { + return container.asWidget(); + } +} diff --git a/src/main/java/org/sagebionetworks/web/client/widget/table/explore/QueryWrapperPlotNav.java b/src/main/java/org/sagebionetworks/web/client/widget/table/explore/QueryWrapperPlotNav.java index 949aa987f7..e7e8af6085 100644 --- a/src/main/java/org/sagebionetworks/web/client/widget/table/explore/QueryWrapperPlotNav.java +++ b/src/main/java/org/sagebionetworks/web/client/widget/table/explore/QueryWrapperPlotNav.java @@ -1,6 +1,8 @@ package org.sagebionetworks.web.client.widget.table.explore; +import java.util.Map; import org.sagebionetworks.web.client.context.SynapseReactClientFullContextPropsProvider; +import org.sagebionetworks.web.client.jsinterop.CardConfiguration; import org.sagebionetworks.web.client.jsinterop.QueryWrapperPlotNavProps; import org.sagebionetworks.web.client.jsinterop.QueryWrapperPlotNavProps.OnQueryCallback; import org.sagebionetworks.web.client.jsinterop.QueryWrapperPlotNavProps.OnQueryResultBundleCallback; @@ -8,6 +10,7 @@ import org.sagebionetworks.web.client.jsinterop.React; import org.sagebionetworks.web.client.jsinterop.ReactElement; import org.sagebionetworks.web.client.jsinterop.SRC; +import org.sagebionetworks.web.client.jsinterop.SynapseTableProps; import org.sagebionetworks.web.client.widget.ReactComponent; public class QueryWrapperPlotNav extends ReactComponent { @@ -19,7 +22,14 @@ public QueryWrapperPlotNav( OnQueryCallback onQueryChange, OnQueryResultBundleCallback onQueryResultBundleChange, OnViewSharingSettingsHandler onViewSharingSettingsHandler, - boolean hideSqlEditorControl + boolean hideSqlEditorControl, + Boolean defaultShowPlots, + Boolean defaultShowSearchBox, + Boolean hideCopyToClipboard, + Boolean hideDownload, + SynapseTableProps tableConfiguration, + CardConfiguration cardConfiguration, + String name ) { QueryWrapperPlotNavProps props = QueryWrapperPlotNavProps.create( sql, @@ -27,7 +37,14 @@ public QueryWrapperPlotNav( onQueryChange, onQueryResultBundleChange, onViewSharingSettingsHandler, - hideSqlEditorControl + hideSqlEditorControl, + defaultShowPlots, + defaultShowSearchBox, + hideCopyToClipboard, + hideDownload, + tableConfiguration, + cardConfiguration, + name ); ReactElement component = React.createElementWithSynapseContext( diff --git a/src/main/java/org/sagebionetworks/web/client/widget/table/v2/TableEntityWidgetViewImpl.java b/src/main/java/org/sagebionetworks/web/client/widget/table/v2/TableEntityWidgetViewImpl.java index 40ae6eff47..6dd768dc47 100755 --- a/src/main/java/org/sagebionetworks/web/client/widget/table/v2/TableEntityWidgetViewImpl.java +++ b/src/main/java/org/sagebionetworks/web/client/widget/table/v2/TableEntityWidgetViewImpl.java @@ -21,6 +21,7 @@ import org.sagebionetworks.web.client.jsinterop.React; import org.sagebionetworks.web.client.jsinterop.ReactElement; import org.sagebionetworks.web.client.jsinterop.SRC; +import org.sagebionetworks.web.client.jsinterop.SynapseTableProps; import org.sagebionetworks.web.client.utils.Callback; import org.sagebionetworks.web.client.widget.FullWidthAlert; import org.sagebionetworks.web.client.widget.IconSvg; @@ -225,7 +226,14 @@ public void configureQueryWrapperPlotNav( onQueryChange, onQueryResultBundleChange, onViewSharingSettingsHandler, - hideSqlEditorControl + hideSqlEditorControl, + null, + null, + null, + null, + SynapseTableProps.create(), + null, + null ); plotNavContainer.clear(); plotNavContainer.add(plotNav);