Skip to content

Commit

Permalink
Merge pull request #5229 from nickgros/SWC-6610
Browse files Browse the repository at this point in the history
SWC-6610 - Add ColumnModelsEditorV2Widget
  • Loading branch information
nickgros authored Nov 15, 2023
2 parents faf77a3 + 99fd4da commit 6fdcb4b
Show file tree
Hide file tree
Showing 23 changed files with 794 additions and 232 deletions.
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
"react-router-dom": "^5.3.4",
"react-transition-group": "2.6.0",
"sass": "^1.63.6",
"synapse-react-client": "3.1.61",
"synapse-react-client": "3.1.64",
"universal-cookie": "^4.0.4",
"spark-md5": "^3.0.2",
"papaparse": "^5.4.1"
Expand Down
2 changes: 1 addition & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
<webappDirectory>
${project.build.directory}/${project.build.finalName}
</webappDirectory>
<synapse.version>462.0</synapse.version>
<synapse.version>475.0</synapse.version>
<gwtVersion>2.10.0</gwtVersion>
<org.springframework.version>5.3.28</org.springframework.version>
<guiceVersion>3.0</guiceVersion>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -256,6 +256,8 @@
import org.sagebionetworks.web.client.widget.table.v2.results.cell.UserIdListRendererCellView;
import org.sagebionetworks.web.client.widget.table.v2.schema.ColumnModelTableRowEditorWidget;
import org.sagebionetworks.web.client.widget.table.v2.schema.ColumnModelTableRowViewer;
import org.sagebionetworks.web.client.widget.table.v2.schema.ColumnModelsEditorV2Widget;
import org.sagebionetworks.web.client.widget.table.v2.schema.ColumnModelsEditorV2WidgetView;
import org.sagebionetworks.web.client.widget.table.v2.schema.ColumnModelsView;
import org.sagebionetworks.web.client.widget.table.v2.schema.ColumnModelsWidget;
import org.sagebionetworks.web.client.widget.table.v2.schema.ImportTableViewColumnsButton;
Expand Down Expand Up @@ -882,4 +884,7 @@ public interface PortalGinInjector extends Ginjector {
TwoFactorAuthPresenter getTwoFactorAuthPresenter();

FollowingPagePresenter getFollowingPagePresenter();

ColumnModelsEditorV2Widget getColumnModelsEditorV2Widget();
ColumnModelsEditorV2WidgetView getColumnModelsEditorV2WidgetView();
}
Original file line number Diff line number Diff line change
Expand Up @@ -711,6 +711,8 @@
import org.sagebionetworks.web.client.widget.table.v2.schema.ColumnModelTableRowEditorWidgetImpl;
import org.sagebionetworks.web.client.widget.table.v2.schema.ColumnModelTableRowViewer;
import org.sagebionetworks.web.client.widget.table.v2.schema.ColumnModelTableRowViewerImpl;
import org.sagebionetworks.web.client.widget.table.v2.schema.ColumnModelsEditorV2WidgetView;
import org.sagebionetworks.web.client.widget.table.v2.schema.ColumnModelsEditorV2WidgetViewImpl;
import org.sagebionetworks.web.client.widget.table.v2.schema.ColumnModelsView;
import org.sagebionetworks.web.client.widget.table.v2.schema.ColumnModelsViewBase;
import org.sagebionetworks.web.client.widget.table.v2.schema.ColumnModelsViewBaseImpl;
Expand Down Expand Up @@ -1190,6 +1192,8 @@ protected void configure() {
.to(ColumnModelTableRowEditorWidgetImpl.class);
bind(ColumnModelTableRowViewer.class)
.to(ColumnModelTableRowViewerImpl.class);
bind(ColumnModelsEditorV2WidgetView.class)
.to(ColumnModelsEditorV2WidgetViewImpl.class);
bind(TableEntityWidgetView.class).to(TableEntityWidgetViewImpl.class);
bind(RowView.class).to(RowViewImpl.class);
bind(TablePageView.class).to(TablePageViewImpl.class);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
import jsinterop.annotations.JsOverlay;
import jsinterop.annotations.JsPackage;
import jsinterop.annotations.JsType;
import org.sagebionetworks.schema.adapter.JSONObjectAdapter;
import org.sagebionetworks.repo.model.AccessRequirement;

@JsType(isNative = true, namespace = JsPackage.GLOBAL, name = "Object")
public class AccessRequirementListProps extends ReactComponentProps {
Expand All @@ -23,7 +23,7 @@ public interface Callback {
@JsOverlay
public static AccessRequirementListProps create(
Callback onHide,
List<JSONObjectAdapter> accessRequirements,
List<AccessRequirement> accessRequirements,
String entityId
) {
AccessRequirementListProps props = new AccessRequirementListProps();
Expand All @@ -33,7 +33,7 @@ public static AccessRequirementListProps create(
props.accessRequirementFromProps =
accessRequirements
.stream()
.map(o -> JSON.parse(o.toJSONString()))
.map(JSONEntityUtils::toJsInteropCompatibleObject)
.toArray();
return props;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,4 +7,6 @@
public class JSON {

public static native Object parse(String json);

public static native String stringify(Object obj);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package org.sagebionetworks.web.client.jsinterop;

import org.sagebionetworks.gwt.client.schema.adapter.JSONObjectGwt;
import org.sagebionetworks.schema.adapter.JSONEntity;
import org.sagebionetworks.schema.adapter.JSONObjectAdapter;
import org.sagebionetworks.schema.adapter.JSONObjectAdapterException;

public interface JSONEntityUtils {
/**
* Converts a JSONEntity to a JsInterop compatible object.
* @param entity
* @return a JsInterop compatible object that represents the passed entity.
*/
public static Object toJsInteropCompatibleObject(JSONEntity entity) {
JSONObjectAdapter adapter = new JSONObjectGwt();
try {
entity.writeToJSONObject(adapter);
} catch (JSONObjectAdapterException e) {
throw new RuntimeException(e);
}
// This is a quick-and-dirty implementation--serialize the object to a string and use JSON.parse to deserialize it
// It would be more efficient to update the JSONObjectGwt instance to directly create and return a native object.
return JSON.parse(adapter.toJSONString());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,8 @@ public static native <P extends ReactComponentProps> ReactNode createElement(
ReactNode[] children
);

public static native <T> T createRef();

/**
* Similar to {@link #createElementWithSynapseContext} but only includes the theme. Any components rendered will NOT get the full Synapse context, including
* access token + auth state, experimental mode status, and time display settings.
Expand All @@ -36,10 +38,11 @@ > ReactNode createElementWithThemeContext(
ReactComponentType<P> component,
P props
) {
SynapseReactClientFullContextProviderProps emptyContext = SynapseReactClientFullContextProviderProps.create(
SynapseContextJsObject.create(null, false, false),
null
);
SynapseReactClientFullContextProviderProps emptyContext =
SynapseReactClientFullContextProviderProps.create(
SynapseContextJsObject.create(null, false, false),
null
);
return createElementWithSynapseContext(component, props, emptyContext);
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package org.sagebionetworks.web.client.jsinterop;

import jsinterop.annotations.JsPackage;
import jsinterop.annotations.JsType;

@JsType(isNative = true, namespace = JsPackage.GLOBAL, name = "Object")
public class ReactRef<T> {

public T current;
}
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,7 @@ public static class SynapseComponents {
public static ReactComponentType<TwoFactorEnrollmentFormProps> TwoFactorEnrollmentForm;
public static ReactComponentType<EmptyProps> SubscriptionPage;
public static ReactComponentType<AccessRequirementListProps> AccessRequirementList;
public static ReactComponentType<TableColumnSchemaFormProps> TableColumnSchemaForm;

/**
* Pushes a global toast message. In SWC, you should use {@link DisplayUtils#notify}, rather than calling this method directly.
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package org.sagebionetworks.web.client.jsinterop;

import java.util.List;
import jsinterop.annotations.JsNullable;
import jsinterop.annotations.JsOverlay;
import jsinterop.annotations.JsPackage;
import jsinterop.annotations.JsType;
import org.sagebionetworks.repo.model.EntityType;
import org.sagebionetworks.repo.model.table.ColumnModel;
import org.sagebionetworks.repo.model.table.ViewScope;

@JsType(isNative = true, namespace = JsPackage.GLOBAL, name = "Object")
public class TableColumnSchemaFormProps extends ReactComponentProps {

String entityType;

@JsNullable
Object viewScope;

Object[] initialData;
ReactRef<TableColumnSchemaFormRef> ref;

@JsOverlay
public static TableColumnSchemaFormProps create(
EntityType entityType,
ViewScope viewScope,
List<ColumnModel> initialData,
ReactRef<TableColumnSchemaFormRef> ref
) {
TableColumnSchemaFormProps props = new TableColumnSchemaFormProps();
props.entityType = entityType.name();
if (viewScope != null) {
props.viewScope = JSONEntityUtils.toJsInteropCompatibleObject(viewScope);
}
props.initialData =
initialData
.stream()
.map(JSONEntityUtils::toJsInteropCompatibleObject)
.toArray();
props.ref = ref;
return props;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package org.sagebionetworks.web.client.jsinterop;

import jsinterop.annotations.JsPackage;
import jsinterop.annotations.JsType;

@JsType(isNative = true, namespace = JsPackage.GLOBAL, name = "Object")
public class TableColumnSchemaFormRef {

/**
* The TableColumnSchemaForm component exposes an imperative handle to get the current state of the form's ColumnModels
*
* @return JSON representations of ColumnModel objects
*/
public native Object[] getEditedColumnModels();

/**
* Returns true iff the form is valid
*/
public native boolean validate();
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,7 @@
import com.google.gwt.user.client.ui.SimplePanel;
import com.google.gwt.user.client.ui.Widget;
import com.google.inject.Inject;
import java.util.ArrayList;
import java.util.List;
import java.util.Collections;
import javax.annotation.Nullable;
import org.gwtbootstrap3.client.ui.Alert;
import org.gwtbootstrap3.client.ui.Button;
Expand All @@ -19,7 +18,6 @@
import org.sagebionetworks.repo.model.RestrictableObjectDescriptor;
import org.sagebionetworks.repo.model.RestrictableObjectType;
import org.sagebionetworks.schema.adapter.JSONObjectAdapter;
import org.sagebionetworks.schema.adapter.JSONObjectAdapterException;
import org.sagebionetworks.web.client.DisplayUtils;
import org.sagebionetworks.web.client.GlobalApplicationState;
import org.sagebionetworks.web.client.context.SynapseReactClientFullContextPropsProvider;
Expand Down Expand Up @@ -363,38 +361,29 @@ public void showRequestAccessModal(
ManagedACTAccessRequirement accessRequirement,
@Nullable RestrictableObjectDescriptor targetSubject
) {
try {
JSONObjectAdapter arAsJson = accessRequirement.writeToJSONObject(
jsonObjectAdapter
);
List<JSONObjectAdapter> arList = new ArrayList<JSONObjectAdapter>();
arList.add(arAsJson);
AccessRequirementListProps.Callback onHide = () -> {
presenter.refreshApprovalState();
hideRequestAccessModal();
};
String entityId = null;
if (
targetSubject != null &&
targetSubject.getType() == RestrictableObjectType.ENTITY
) {
entityId = targetSubject.getId();
}
AccessRequirementListProps props = AccessRequirementListProps.create(
onHide,
arList,
entityId
);
requestDataAccessWidget.render(
React.createElementWithSynapseContext(
SRC.SynapseComponents.AccessRequirementList,
props,
propsProvider.getJsInteropContextProps()
)
);
} catch (JSONObjectAdapterException e) {
presenter.handleException(e);
AccessRequirementListProps.Callback onHide = () -> {
presenter.refreshApprovalState();
hideRequestAccessModal();
};
String entityId = null;
if (
targetSubject != null &&
targetSubject.getType() == RestrictableObjectType.ENTITY
) {
entityId = targetSubject.getId();
}
AccessRequirementListProps props = AccessRequirementListProps.create(
onHide,
Collections.singletonList(accessRequirement),
entityId
);
requestDataAccessWidget.render(
React.createElementWithSynapseContext(
SRC.SynapseComponents.AccessRequirementList,
props,
propsProvider.getJsInteropContextProps()
)
);
}

public void hideRequestAccessModal() {
Expand Down
Loading

0 comments on commit 6fdcb4b

Please sign in to comment.