Skip to content

Commit

Permalink
Merge pull request #5309 from jinjunoh/SWC-6669
Browse files Browse the repository at this point in the history
  • Loading branch information
nickgros authored Mar 1, 2024
2 parents 4df43e3 + c5af8bc commit 27e1b01
Show file tree
Hide file tree
Showing 13 changed files with 337 additions and 319 deletions.
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 @@ -67,6 +67,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

0 comments on commit 27e1b01

Please sign in to comment.