Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

SWC-6669: migrate legacy EntityViewScopeEditor to react component #5309

Merged
merged 2 commits into from
Mar 1, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -271,6 +271,8 @@
import org.sagebionetworks.web.client.widget.entity.EntityPageTopViewImpl;
import org.sagebionetworks.web.client.widget.entity.EntitySearchBoxView;
import org.sagebionetworks.web.client.widget.entity.EntitySearchBoxViewImpl;
import org.sagebionetworks.web.client.widget.entity.EntityViewScopeEditorModalWidgetView;
import org.sagebionetworks.web.client.widget.entity.EntityViewScopeEditorModalWidgetViewImpl;
import org.sagebionetworks.web.client.widget.entity.FavoriteWidgetView;
import org.sagebionetworks.web.client.widget.entity.FavoriteWidgetViewImpl;
import org.sagebionetworks.web.client.widget.entity.MarkdownEditorWidgetView;
Expand Down Expand Up @@ -1446,6 +1448,8 @@ protected void configure() {
bind(FileDownloadMenuItemView.class).to(FileDownloadMenuItemViewImpl.class);
bind(SqlDefinedEditorModalWidgetView.class)
.to(SqlDefinedEditorModalWidgetViewImpl.class);
bind(EntityViewScopeEditorModalWidgetView.class)
.to(EntityViewScopeEditorModalWidgetViewImpl.class);
bind(ChallengeWidgetView.class).to(ChallengeWidgetViewImpl.class);
bind(SelectTeamModalView.class).to(SelectTeamModalViewImpl.class);
bind(ApproveUserAccessModalView.class)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package org.sagebionetworks.web.client.jsinterop;

import jsinterop.annotations.JsFunction;
import jsinterop.annotations.JsNullable;
import jsinterop.annotations.JsOverlay;
import jsinterop.annotations.JsPackage;
import jsinterop.annotations.JsType;

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

@FunctionalInterface
@JsFunction
public interface Callback {
void run();
}

public String entityId;

@JsNullable
public Callback onUpdate;

@JsNullable
public Callback onCancel;

public boolean open;

@JsOverlay
public static EntityViewScopeEditorModalProps create(
String entityId,
Callback onUpdate,
Callback onCancel,
boolean open
) {
EntityViewScopeEditorModalProps props =
new EntityViewScopeEditorModalProps();
props.entityId = entityId;
props.onUpdate = onUpdate;
props.onCancel = onCancel;
props.open = open;
return props;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,7 @@ public static class SynapseComponents {
public static ReactComponentType<AccessRequirementRelatedProjectsListProps> AccessRequirementRelatedProjectsList;
public static ReactComponentType<CreateTableViewWizardProps> CreateTableViewWizard;
public static ReactComponentType<SqlDefinedTableEditorModalProps> SqlDefinedTableEditorModal;
public static ReactComponentType<EntityViewScopeEditorModalProps> EntityViewScopeEditorModal;

/**
* 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,67 @@
package org.sagebionetworks.web.client.widget.entity;

import com.google.gwt.user.client.ui.IsWidget;
import com.google.gwt.user.client.ui.Widget;
import com.google.inject.Inject;
import java.util.ArrayList;
import java.util.List;
import org.sagebionetworks.repo.model.Reference;
import org.sagebionetworks.web.client.GlobalApplicationState;
import org.sagebionetworks.web.client.jsinterop.EntityViewScopeEditorModalProps;
import org.sagebionetworks.web.client.jsinterop.SqlDefinedTableEditorModalProps;
import org.sagebionetworks.web.client.widget.table.modal.fileview.TableType;

public class EntityViewScopeEditorModalWidget implements IsWidget {

private final GlobalApplicationState globalApplicationState;
private final EntityViewScopeEditorModalWidgetView view;

private String entityId;
private EntityViewScopeEditorModalProps.Callback onCancel;
private EntityViewScopeEditorModalProps.Callback onUpdate;

@Inject
public EntityViewScopeEditorModalWidget(
EntityViewScopeEditorModalWidgetView view,
GlobalApplicationState globalApplicationState
) {
super();
this.view = view;
this.globalApplicationState = globalApplicationState;
}

public void configure(
String entityId,
EntityViewScopeEditorModalProps.Callback onUpdate,
EntityViewScopeEditorModalProps.Callback onCancel
) {
this.entityId = entityId;
this.onUpdate = onUpdate;
this.onCancel = onCancel;
EntityViewScopeEditorModalProps props =
EntityViewScopeEditorModalProps.create(
entityId,
onUpdate,
onCancel,
false
);
view.renderComponent(props);
}

public void setOpen(boolean open) {
globalApplicationState.setIsEditing(open);
EntityViewScopeEditorModalProps props =
EntityViewScopeEditorModalProps.create(
entityId,
onUpdate,
onCancel,
open
);
view.renderComponent(props);
}

@Override
public Widget asWidget() {
return view.asWidget();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package org.sagebionetworks.web.client.widget.entity;

import com.google.gwt.user.client.ui.IsWidget;
import org.sagebionetworks.web.client.jsinterop.EntityViewScopeEditorModalProps;

public interface EntityViewScopeEditorModalWidgetView extends IsWidget {
void renderComponent(EntityViewScopeEditorModalProps props);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
package org.sagebionetworks.web.client.widget.entity;

import com.google.gwt.user.client.ui.Widget;
import com.google.inject.Inject;
import org.sagebionetworks.web.client.context.SynapseReactClientFullContextPropsProvider;
import org.sagebionetworks.web.client.jsinterop.EntityViewScopeEditorModalProps;
import org.sagebionetworks.web.client.jsinterop.React;
import org.sagebionetworks.web.client.jsinterop.ReactNode;
import org.sagebionetworks.web.client.jsinterop.SRC;
import org.sagebionetworks.web.client.widget.ReactComponentDiv;

public class EntityViewScopeEditorModalWidgetViewImpl
implements EntityViewScopeEditorModalWidgetView {

private final SynapseReactClientFullContextPropsProvider propsProvider;
private final ReactComponentDiv reactComponentDiv;

@Inject
public EntityViewScopeEditorModalWidgetViewImpl(
SynapseReactClientFullContextPropsProvider propsProvider
) {
super();
this.propsProvider = propsProvider;
reactComponentDiv = new ReactComponentDiv();
}

@Override
public void renderComponent(EntityViewScopeEditorModalProps props) {
ReactNode reactNode = React.createElementWithSynapseContext(
SRC.SynapseComponents.EntityViewScopeEditorModal,
props,
propsProvider.getJsInteropContextProps()
);
reactComponentDiv.render(reactNode);
}

@Override
public Widget asWidget() {
return reactComponentDiv.asWidget();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,6 @@ public class SqlDefinedEditorModalWidget implements IsWidget {
private final GlobalApplicationState globalApplicationState;
private final SqlDefinedEditorModalWidgetView view;

private boolean open;

private String entityId;
private SqlDefinedTableEditorModalProps.Callback onCancel;
private SqlDefinedTableEditorModalProps.Callback onUpdate;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
import org.sagebionetworks.web.client.SynapseJavascriptClient;
import org.sagebionetworks.web.client.events.EntityUpdatedEvent;
import org.sagebionetworks.web.client.widget.SynapseWidgetPresenter;
import org.sagebionetworks.web.client.widget.entity.EntityViewScopeEditorModalWidget;
import org.sagebionetworks.web.client.widget.entity.controller.SynapseAlert;

/**
Expand All @@ -40,8 +41,8 @@ public class EntityViewScopeWidget
EntityViewScopeWidgetView view;
SynapseJavascriptClient jsClient;
EntityBundle bundle;
EntityContainerListWidget viewScopeWidget, editScopeWidget;
SynapseAlert synAlert;
EntityContainerListWidget viewScopeWidget;
EntityViewScopeEditorModalWidget editEntityViewScopeModalWidget;
EntityView currentView;
TableType tableType;
EventBus eventBus;
Expand All @@ -56,20 +57,19 @@ public EntityViewScopeWidget(
EntityViewScopeWidgetView view,
SynapseJavascriptClient jsClient,
EntityContainerListWidget viewScopeWidget,
EntityContainerListWidget editScopeWidget,
SynapseAlert synAlert,
EntityViewScopeEditorModalWidget editEntityViewScopeModalWidget,
EventBus eventBus
) {
this.jsClient = jsClient;
this.view = view;
this.viewScopeWidget = viewScopeWidget;
this.editScopeWidget = editScopeWidget;
this.synAlert = synAlert;
this.editEntityViewScopeModalWidget = editEntityViewScopeModalWidget;
this.eventBus = eventBus;
view.setPresenter(this);
view.setEditableEntityListWidget(editScopeWidget.asWidget());
view.setEditableEntityViewModalWidget(
editEntityViewScopeModalWidget.asWidget()
);
view.setEntityListWidget(viewScopeWidget.asWidget());
view.setSynAlert(synAlert.asWidget());
}

private List<Reference> getReferencesFromIdList(List<String> ids) {
Expand Down Expand Up @@ -105,22 +105,6 @@ public void configure(EntityBundle bundle, boolean isEditable) {
view.setVisible(isVisible);
}

private static boolean isEditMaskSupportedInWebClient(TableType tableType) {
if (tableType.getViewTypeMask() == PROJECT) {
// Masks of project Views are not editable
return false;
} else {
// If the entity view isn't a project view, then it can only have any combination of File | Folder | Table | Dataset
// If it contains any other type, it's not editable because the editor doesn't display all of the fields required for the user to update this mask.
return !(
tableType.isIncludeEntityView() ||
tableType.isIncludeSubmissionView() ||
tableType.isIncludeDockerRepo() ||
tableType.isIncludeProject()
);
}
}

@Override
public Widget asWidget() {
return view.asWidget();
Expand All @@ -137,61 +121,19 @@ public void updateViewTypeMask() {
);
}

@Override
public void onSave() {
// update scope
synAlert.clear();
view.setLoading(true);
currentView.setScopeIds(editScopeWidget.getEntityIds());
currentView.setViewTypeMask(tableType.getViewTypeMask().longValue());
currentView.setType(null);
jsClient.updateEntity(
currentView,
null,
null,
new AsyncCallback<Entity>() {
@Override
public void onSuccess(Entity entity) {
view.setLoading(false);
view.hideModal();
eventBus.fireEvent(new EntityUpdatedEvent(entity.getId()));
}

@Override
public void onFailure(Throwable caught) {
view.setLoading(false);
synAlert.handleException(caught);
}
}
);
}

@Override
public void onEditScopeAndMask() {
List<Reference> references = getReferencesFromIdList(
currentView.getScopeIds()
String entityId = currentView.getId();
editEntityViewScopeModalWidget.configure(
entityId,
() -> {
editEntityViewScopeModalWidget.setOpen(false);
eventBus.fireEvent(new EntityUpdatedEvent(currentView.getId()));
},
() -> {
editEntityViewScopeModalWidget.setOpen(false);
}
);
// configure edit list, and show modal
editScopeWidget.configure(references, true, tableType);

// The mask may not be editable since not all masks are supported in the web client
boolean isMaskEditable =
isEditable && isEditMaskSupportedInWebClient(tableType);
if (!isMaskEditable) {
synAlert.consoleError(
"View type mask is not supported by web client, blocking edit. Mask value:" +
((EntityView) currentView).getViewTypeMask()
);
}

view.setEditMaskVisible(isMaskEditable);
if (isMaskEditable) {
// update the checkbox state based on the view type mask
view.setIsFileSelected(tableType.isIncludeFiles());
view.setIsFolderSelected(tableType.isIncludeFolders());
view.setIsTableSelected(tableType.isIncludeTables());
view.setIsDatasetSelected(tableType.isIncludeDatasets());
}
view.showModal();
editEntityViewScopeModalWidget.setOpen(true);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,20 +13,10 @@ public interface EntityViewScopeWidgetView extends IsWidget {

void setEntityListWidget(IsWidget w);

void setEditableEntityListWidget(IsWidget w);

void setSynAlert(IsWidget w);

void showModal();

void hideModal();
void setEditableEntityViewModalWidget(IsWidget w); // TODO: replace setEditableEntityViewModalWidget

void setEditMaskAndScopeButtonVisible(boolean visible);

void setEditMaskVisible(boolean visible);

void setLoading(boolean loading);

boolean isFileSelected();

void setIsFileSelected(boolean selected);
Expand All @@ -44,8 +34,6 @@ public interface EntityViewScopeWidgetView extends IsWidget {
void setIsDatasetSelected(boolean selected);

public interface Presenter {
void onSave();

void onEditScopeAndMask();

void updateViewTypeMask();
Expand Down
Loading
Loading