diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/AbstractAsyncCallback.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/AbstractAsyncCallback.java index ef197805befcd2119071284c9fc5681457dd1f0f..64a1973d770348c21381197a19fed3847105f2ec 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/AbstractAsyncCallback.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/AbstractAsyncCallback.java @@ -48,11 +48,18 @@ public abstract class AbstractAsyncCallback<T> implements AsyncCallback<T> List<IOnSuccessAction<T>> successActions = new ArrayList<IOnSuccessAction<T>>(); + List<IDelegatedAction> failureActions = new ArrayList<IDelegatedAction>(); + public void addOnSuccessAction(IOnSuccessAction<T> action) { successActions.add(action); } + public void addOnFailureAction(IDelegatedAction action) + { + failureActions.add(action); + } + public static final ICallbackListener<Object> DEFAULT_CALLBACK_LISTENER = new CallbackListenerAdapter<Object>() { @@ -254,6 +261,10 @@ public abstract class AbstractAsyncCallback<T> implements AsyncCallback<T> callbackListener.onFailureOf(viewContext, this, msg, caught); } finishOnFailure(caught); + for (IDelegatedAction a : failureActions) + { + a.execute(); + } } private String getMessage(String messageKey, Object... params) diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/Dict.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/Dict.java index c9e68e143170b084e51714869020a86da88101f8..e2f8ab3d6ef52de97670acc099b3147730b70986 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/Dict.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/Dict.java @@ -121,6 +121,8 @@ public abstract class Dict public static final String BUTTON_SAVE = "button_save"; + public static final String BUTTON_SAVE_AND_UPLOAD = "button_save_and_upload"; + public static final String BUTTON_CHOOSE = "button_choose"; public static final String BUTTON_CANCEL = "button_cancel"; diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/IOnSuccessAction.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/IOnSuccessAction.java index fb27a04e29e86adf0468028368ac1936c5b0bfa8..6affc2b89ea25f7760afaabcf98af3bbf43ccfc9 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/IOnSuccessAction.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/IOnSuccessAction.java @@ -16,7 +16,7 @@ package ch.systemsx.cisd.openbis.generic.client.web.client.application; -interface IOnSuccessAction<T> +public interface IOnSuccessAction<T> { void execute(T result); } \ No newline at end of file diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/ComponentProvider.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/ComponentProvider.java index 8890e9f0b441da000acd067e9e7556852e28c86d..321ccad3d9a240515e3073a4181e7e16ba91ffea 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/ComponentProvider.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/ComponentProvider.java @@ -1362,7 +1362,7 @@ public final class ComponentProvider }; } - public AbstractTabItemFactory getDataSetUploadTab() + public AbstractTabItemFactory getDataSetUploadTab(final String initialSampleIdentifierOrNull) { return new AbstractTabItemFactory() { @@ -1370,14 +1370,14 @@ public final class ComponentProvider public ITabItem create() { DatabaseModificationAwareComponent component = - DataSetUploadForm.create(viewContext); + DataSetUploadForm.create(viewContext, initialSampleIdentifierOrNull); return createRegistrationTab(getTabTitle(), component); } @Override public String getId() { - return DataSetUploadForm.ID; + return DataSetUploadForm.createId(initialSampleIdentifierOrNull); } @Override diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/menu/dataset/DataSetMenu.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/menu/dataset/DataSetMenu.java index 806636e7e1659de300013c0e5e863acc0773c72d..454c95e9f448e4ad087a60c9b571572e4b53a377 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/menu/dataset/DataSetMenu.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/menu/dataset/DataSetMenu.java @@ -57,7 +57,7 @@ public class DataSetMenu extends TopMenuItem if (cifexConfigured) { submenu.add(new ActionMenu(TopMenu.ActionMenuKind.DATA_SET_MENU_UPLOAD, - messageProvider, componentProvider.getDataSetUploadTab())); + messageProvider, componentProvider.getDataSetUploadTab(null))); } setMenu(submenu); } diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/AbstractRegistrationForm.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/AbstractRegistrationForm.java index d2441302fd7ba3950f0ae8356c01f12cf106ebf9..61f3f03791adf5dfd54c07b2206ad96748ad18df 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/AbstractRegistrationForm.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/AbstractRegistrationForm.java @@ -93,6 +93,8 @@ public abstract class AbstractRegistrationForm extends ContentPanel protected LayoutContainer rightPanel; + private Button resetButton; + protected AbstractRegistrationForm(final IMessageProvider messageProvider, final String id) { this(messageProvider, id, DEFAULT_LABEL_WIDTH, DEFAULT_FIELD_WIDTH); @@ -191,7 +193,7 @@ public abstract class AbstractRegistrationForm extends ContentPanel } } }); - final Button resetButton = new Button(messageProvider.getMessage(Dict.BUTTON_RESET)); + resetButton = new Button(messageProvider.getMessage(Dict.BUTTON_RESET)); resetButton.addSelectionListener(new SelectionListener<ButtonEvent>() { diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/DataSetUploadForm.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/DataSetUploadForm.java index 76516c48e64f444eeff92d13174bb8fb1f24facb..b042b54a44403d6ab99d17a28aa7321df1815d9d 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/DataSetUploadForm.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/DataSetUploadForm.java @@ -33,16 +33,16 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework. import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.AbstractRegistrationForm; import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.field.CheckBoxField; import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.field.ExperimentChooserField; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.field.SampleChooserField; import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.field.ExperimentChooserField.ExperimentChooserFieldAdaptor; +import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.field.SampleChooserField; import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.field.SampleChooserField.SampleChooserFieldAdaptor; import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.widget.FieldUtil; import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.WindowUtils; import ch.systemsx.cisd.openbis.generic.client.web.client.dto.ExperimentIdentifier; import ch.systemsx.cisd.openbis.generic.shared.basic.BasicConstant; import ch.systemsx.cisd.openbis.generic.shared.basic.DataSetUploadInfo; -import ch.systemsx.cisd.openbis.generic.shared.basic.URLMethodWithParameters; import ch.systemsx.cisd.openbis.generic.shared.basic.DataSetUploadInfo.DataSetUploadInfoHelper; +import ch.systemsx.cisd.openbis.generic.shared.basic.URLMethodWithParameters; /** * Panel that allows to specify information necessary to upload data sets and redirects user to @@ -53,10 +53,6 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.DataSetUploadInfo.DataSetUp public class DataSetUploadForm extends AbstractRegistrationForm { - private static final String ID_SUFFIX = "data-set-upload-panel"; - - public static final String ID = GenericConstants.ID_PREFIX + ID_SUFFIX; - private final String cifexURL; private final String cifexRecipient; @@ -76,11 +72,32 @@ public class DataSetUploadForm extends AbstractRegistrationForm private final DataSetParentsArea parentsArea; - // + // + + public static String createId(String suffix) + { + return GenericConstants.ID_PREFIX + createSimpleId(suffix); + } + + private static String createSimpleId(String suffix) + { + + String withoutSuffix = "data-set-upload-panel"; + if (suffix == null) + { + return withoutSuffix; + } else + { + // TODO 2010-11-23, IA: use existing identifier escaper + return withoutSuffix + + suffix.toUpperCase().replace("/", "x").replace(":", "xx").replace(".", "xxx"); + } + } - public DataSetUploadForm(IViewContext<ICommonClientServiceAsync> viewContext) + public DataSetUploadForm(IViewContext<ICommonClientServiceAsync> viewContext, + String sampleIdentifierOrNull) { - super(viewContext, ID_SUFFIX); + super(viewContext, createSimpleId(sampleIdentifierOrNull)); cifexURL = viewContext.getModel().getApplicationInfo().getCIFEXURL(); cifexRecipient = viewContext.getModel().getApplicationInfo().getCifexRecipient(); saveButton.setText(viewContext.getMessage(Dict.BUTTON_UPLOAD_DATA_VIA_CIFEX)); @@ -91,14 +108,16 @@ public class DataSetUploadForm extends AbstractRegistrationForm // both sample and experiment choosers are mandatory but only one will be shown sampleChooser = - SampleChooserField.create(viewContext.getMessage(Dict.SAMPLE), true, null, false, - false, true, viewContext, SampleTypeDisplayID.DATA_SET_UPLOAD_SAMPLE_CHOOSER); + SampleChooserField.create(viewContext.getMessage(Dict.SAMPLE), true, + sampleIdentifierOrNull, false, false, true, viewContext, + SampleTypeDisplayID.DATA_SET_UPLOAD_SAMPLE_CHOOSER); formPanel.add(sampleChooser.getField()); experimentChooser = ExperimentChooserField.create(viewContext.getMessage(Dict.EXPERIMENT), true, null, viewContext); formPanel.add(experimentChooser.getField()); - formPanel.add(parentsArea = new DataSetParentsArea(viewContext, ID_SUFFIX)); + formPanel.add(parentsArea = + new DataSetParentsArea(viewContext, createSimpleId(sampleIdentifierOrNull))); parentsArea.setMaxLength(1500); connectedWithSampleCheckbox.addListener(Events.Change, new Listener<FieldEvent>() @@ -110,11 +129,14 @@ public class DataSetUploadForm extends AbstractRegistrationForm }); updateFieldsVisibility(); - formPanel.add(dataSetTypeSelectionWidget = - new DataSetTypeSelectionWidget(viewContext, ID_SUFFIX)); + formPanel + .add(dataSetTypeSelectionWidget = + new DataSetTypeSelectionWidget(viewContext, + createSimpleId(sampleIdentifierOrNull))); FieldUtil.markAsMandatory(dataSetTypeSelectionWidget); formPanel.add(fileTypeSelectionWidget = - new FileFormatTypeSelectionWidget(viewContext, ID_SUFFIX)); + new FileFormatTypeSelectionWidget(viewContext, + createSimpleId(sampleIdentifierOrNull))); FieldUtil.markAsMandatory(fileTypeSelectionWidget); if (StringUtils.isBlank(cifexRecipient) || StringUtils.isBlank(cifexURL)) { @@ -132,9 +154,9 @@ public class DataSetUploadForm extends AbstractRegistrationForm } public static DatabaseModificationAwareComponent create( - IViewContext<ICommonClientServiceAsync> viewContext) + IViewContext<ICommonClientServiceAsync> viewContext, String sampleIdentifierOrNull) { - DataSetUploadForm form = new DataSetUploadForm(viewContext); + DataSetUploadForm form = new DataSetUploadForm(viewContext, sampleIdentifierOrNull); IDatabaseModificationObserver observer = form.createDatabaseModificationObserver(); return new DatabaseModificationAwareComponent(form, observer); } diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/AbstractGenericSampleRegisterEditForm.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/AbstractGenericSampleRegisterEditForm.java index 3b23f84230a0bb90fca28912198a947b5280ed4a..26d6432f722020c04814cacb38ab14b0eb4f1de3 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/AbstractGenericSampleRegisterEditForm.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/AbstractGenericSampleRegisterEditForm.java @@ -24,25 +24,32 @@ import java.util.List; import com.extjs.gxt.ui.client.event.ButtonEvent; import com.extjs.gxt.ui.client.event.Events; import com.extjs.gxt.ui.client.event.SelectionListener; +import com.extjs.gxt.ui.client.widget.button.Button; import com.extjs.gxt.ui.client.widget.form.FormPanel; +import ch.systemsx.cisd.common.shared.basic.utils.StringUtils; import ch.systemsx.cisd.openbis.generic.client.web.client.ICommonClientServiceAsync; import ch.systemsx.cisd.openbis.generic.client.web.client.application.ActionContext; import ch.systemsx.cisd.openbis.generic.client.web.client.application.Dict; import ch.systemsx.cisd.openbis.generic.client.web.client.application.FormPanelListener; +import ch.systemsx.cisd.openbis.generic.client.web.client.application.IOnSuccessAction; import ch.systemsx.cisd.openbis.generic.client.web.client.application.IViewContext; +import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.ComponentProvider; import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.DatabaseModificationAwareField; +import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.DispatcherHelper; import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.SampleTypeDisplayID; +import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.AbstractRegistrationForm; import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.GroupSelectionWidget; import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.field.ExperimentChooserField; +import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.field.ExperimentChooserField.ExperimentChooserFieldAdaptor; import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.field.IChosenEntityListener; import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.field.SampleChooserButton; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.field.SampleChooserField; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.field.ExperimentChooserField.ExperimentChooserFieldAdaptor; import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.field.SampleChooserButton.SampleChooserButtonAdaptor; +import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.field.SampleChooserField; import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.field.SampleChooserField.SampleChooserFieldAdaptor; import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.file.AttachmentsFileFieldManager; import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.widget.FieldUtil; +import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.IDelegatedAction; import ch.systemsx.cisd.openbis.generic.client.web.client.dto.ExperimentIdentifier; import ch.systemsx.cisd.openbis.generic.shared.basic.IIdAndCodeHolder; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityKind; @@ -90,6 +97,8 @@ abstract public class AbstractGenericSampleRegisterEditForm extends protected ParentSamplesArea parentsArea; + private String openUploadWindowWithSampleOrNull = null; + protected AbstractGenericSampleRegisterEditForm( IViewContext<IGenericClientServiceAsync> viewContext, ActionContext actionContext) { @@ -107,6 +116,15 @@ abstract public class AbstractGenericSampleRegisterEditForm extends sesionKeys.add(attachmentsSessionKey); addUploadFeatures(sesionKeys); extractInitialValues(actionContext); + boolean cifexConfigured = + StringUtils + .isBlank(viewContext.getModel().getApplicationInfo().getCifexRecipient()) == false + && StringUtils.isBlank(viewContext.getModel().getApplicationInfo() + .getCIFEXURL()) == false; + if (cifexConfigured) + { + formPanel.addButton(createSaveAndUploadButton()); + } } private void extractInitialValues(ActionContext context) @@ -156,6 +174,57 @@ abstract public class AbstractGenericSampleRegisterEditForm extends }); } + private Button createSaveAndUploadButton() + { + Button button = new Button(viewContext.getMessage(Dict.BUTTON_SAVE_AND_UPLOAD)); + button.addSelectionListener(new SelectionListener<ButtonEvent>() + { + @Override + public final void componentSelected(final ButtonEvent ce) + { + if (formPanel.isValid()) + { + openUploadWindowWithSampleOrNull = createSampleIdentifier(); + if (attachmentsManager.filesDefined() > 0) + { + setUploadEnabled(false); + formPanel.submit(); + } else + { + save(); + } + } + } + }); + return button; + } + + protected <R, T extends AbstractRegistrationForm.AbstractRegistrationCallback<R>> T enrichWithPostRegistration( + T callback) + { + callback.addOnFailureAction(new IDelegatedAction() + { + public void execute() + { + openUploadWindowWithSampleOrNull = null; + } + }); + callback.addOnSuccessAction(new IOnSuccessAction<R>() + { + public void execute(R result) + { + if (StringUtils.isBlank(openUploadWindowWithSampleOrNull) == false) + { + DispatcherHelper.dispatchNaviEvent(new ComponentProvider(viewContext + .getCommonViewContext()) + .getDataSetUploadTab(openUploadWindowWithSampleOrNull)); + } + openUploadWindowWithSampleOrNull = null; + } + }); + return callback; + } + protected abstract void save(); @Override diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/GenericSampleEditForm.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/GenericSampleEditForm.java index 75e92d1c25267cc86d4b0b78117d3852c0ae8b34..11af1fd867f0d28c7c7ba3041484934da9a29872 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/GenericSampleEditForm.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/GenericSampleEditForm.java @@ -73,7 +73,7 @@ public final class GenericSampleEditForm extends AbstractGenericSampleRegisterEd new SampleUpdates(attachmentsSessionKey, techIdOrNull, properties, attachments, experimentIdent, originalSample.getModificationDate(), createSampleIdentifier(), containerOrNull, parents), - new UpdateSampleCallback(viewContext)); + enrichWithPostRegistration(new UpdateSampleCallback(viewContext))); } private final class UpdateSampleCallback extends diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/GenericSampleRegistrationForm.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/GenericSampleRegistrationForm.java index 56525050b3ab4bfbdd8ed69e875a9f79d360e4d6..6079d1c4bbd5ae67984efa58c8b92ac0df81ac20 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/GenericSampleRegistrationForm.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/GenericSampleRegistrationForm.java @@ -95,8 +95,7 @@ public final class GenericSampleRegistrationForm extends AbstractGenericSampleRe { String experimentIdentifier = (experimentField != null && experimentField.tryToGetValue() != null) ? experimentField - .tryToGetValue().getIdentifier() - : null; + .tryToGetValue().getIdentifier() : null; final String containerOrNull = StringUtils.trimToNull(container.getValue()); final NewSample newSample = @@ -107,7 +106,7 @@ public final class GenericSampleRegistrationForm extends AbstractGenericSampleRe newSample.setAttachments(attachmentsManager.extractAttachments()); newSample.setExperimentIdentifier(experimentIdentifier); viewContext.getService().registerSample(attachmentsSessionKey, newSample, - new RegisterSampleCallback(viewContext)); + enrichWithPostRegistration(new RegisterSampleCallback(viewContext))); } @Override diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/public/common-dictionary.js b/openbis/source/java/ch/systemsx/cisd/openbis/public/common-dictionary.js index cd9a8c4b9757c1893a18efc00fbf08c02cc006db..8a3a4e99e532766719cfad51de29dbd7f4c2f2d0 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/public/common-dictionary.js +++ b/openbis/source/java/ch/systemsx/cisd/openbis/public/common-dictionary.js @@ -76,6 +76,7 @@ var common = { button_add: "Add {0}", button_save: "Save", + button_save_and_upload: "Save + Upload Data Set", button_choose: "Choose", button_cancel: "Cancel", button_reset: "Clear",