From 72916696f39e6ad93387bdd7793170f9e982b10d Mon Sep 17 00:00:00 2001
From: buczekp <buczekp>
Date: Tue, 29 Sep 2009 08:38:13 +0000
Subject: [PATCH] [LMS-1122] added number of items in table after 'all' label
 in deletion dialogs; added all samples deletion

SVN: 12750
---
 .../web/client/ICommonClientService.java      | 11 +++-
 .../web/client/ICommonClientServiceAsync.java |  9 ++-
 .../client/web/client/application/Dict.java   | 13 ++++
 .../ShowRelatedDatasetsDialog.java            |  8 ++-
 .../ui/data/AbstractExternalDataGrid.java     | 21 ++++--
 .../ui/data/DataSetComputeMenu.java           | 28 ++++----
 ...DataSetListDeletionConfirmationDialog.java |  5 +-
 .../data/DataSetUploadConfirmationDialog.java | 15 +++--
 .../ui/experiment/ExperimentBrowserGrid.java  | 18 +++--
 ...erimentListDeletionConfirmationDialog.java | 15 +++--
 .../ui/grid/AbstractBrowserGrid.java          | 10 ++-
 .../ui/sample/SampleBrowserGrid.java          | 65 ++++++++++++++++++-
 .../SampleListDeletionConfirmationDialog.java | 60 ++++++++++++++++-
 .../web/server/CommonClientService.java       | 61 ++++++++++++-----
 .../sample/GenericSampleViewer.java           |  3 +-
 .../cisd/openbis/public/common-dictionary.js  | 13 ++--
 16 files changed, 281 insertions(+), 74 deletions(-)

diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/ICommonClientService.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/ICommonClientService.java
index 938eff4fe1d..f65147e240b 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/ICommonClientService.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/ICommonClientService.java
@@ -93,7 +93,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.VocabularyTermWithStats
  * unexpected exception.
  * </p>
  * 
- * @author     Franz-Josef Elmer
+ * @author Franz-Josef Elmer
  */
 public interface ICommonClientService extends IClientService
 {
@@ -545,9 +545,16 @@ public interface ICommonClientService extends IClientService
     /** Deletes the specified data set. */
     public void deleteDataSet(String singleData, String reason) throws UserFailureException;
 
-    /** Deletes the specified samples. */
+    /** Deletes the specified samples. NOTE: this is a stale version used only for samples with abundance. */
     public void deleteSamples(List<TechId> sampleIds, String reason) throws UserFailureException;
 
+    /** Deletes the specified samples. */
+    public void deleteSamples(DisplayedOrSelectedIdHolderCriteria<Sample> criteria, String reason)
+            throws UserFailureException;
+
+    /** Deletes the specified sample. */
+    public void deleteSample(TechId sampleId, String reason) throws UserFailureException;
+
     /** Deletes the specified experiments. */
     public void deleteExperiments(DisplayedOrSelectedIdHolderCriteria<Experiment> criteria,
             String reason) throws UserFailureException;
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/ICommonClientServiceAsync.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/ICommonClientServiceAsync.java
index a734b5dab2e..400d1b22850 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/ICommonClientServiceAsync.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/ICommonClientServiceAsync.java
@@ -90,7 +90,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.VocabularyTermWithStats
 /**
  * Asynchronous version of {@link ICommonClientService}.
  * 
- * @author     Franz-Josef Elmer
+ * @author Franz-Josef Elmer
  */
 public interface ICommonClientServiceAsync extends IClientServiceAsync
 {
@@ -471,6 +471,13 @@ public interface ICommonClientServiceAsync extends IClientServiceAsync
     public void deleteSamples(List<TechId> sampleIds, String value,
             AsyncCallback<Void> asyncCallback);
 
+    /** @see ICommonClientService#deleteSamples(DisplayedOrSelectedIdHolderCriteria, String) */
+    public void deleteSamples(DisplayedOrSelectedIdHolderCriteria<Sample> criteria, String value,
+            AsyncCallback<Void> asyncCallback);
+
+    /** @see ICommonClientService#deleteSample(TechId, String) */
+    public void deleteSample(TechId sampleIs, String value, AsyncCallback<Void> asyncCallback);
+
     /** @see ICommonClientService#deleteExperiments(DisplayedOrSelectedIdHolderCriteria, String) */
     public void deleteExperiments(DisplayedOrSelectedIdHolderCriteria<Experiment> criteria,
             String value, AsyncCallback<Void> asyncCallback);
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 816c3f65d33..43af6d2a1f9 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
@@ -225,6 +225,17 @@ public abstract class Dict
 
     public static final String CHILDREN_DATASETS = "children_datasets";
 
+    public static final String NO_DATASETS_SELECTED = "no_datasets_selected";
+
+    public static final String DATASETS_FROM_DIFFERENT_STORES_SELECTED =
+            "datasets_from_different_stores_selected";
+
+    public static final String PERFORM_COMPUTATION_ON_ALL_DATASETS_MSG_TEMPLATE =
+            "perform_computation_on_all_datasets_msg_template";
+
+    public static final String PERFORM_COMPUTATION_ON_SELECTED_OR_ALL_DATASETS_MSG_TEMPLATE =
+            "perform_computation_on_selected_or_all_datasets_msg_template";
+
     //
     // Entity Type Browser
     //
@@ -778,6 +789,8 @@ public abstract class Dict
 
     public static final String EXPERIMENTS_RADIO_GROUP_LABEL = "experiments_radio_group_label";
 
+    public static final String SAMPLES_RADIO_GROUP_LABEL = "samples_radio_group_label";
+
     public static final String NAME = "name";
 
     public static final String IS_PUBLIC = "is_public";
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ShowRelatedDatasetsDialog.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ShowRelatedDatasetsDialog.java
index 4229113ab27..4d6f1ef0888 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ShowRelatedDatasetsDialog.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ShowRelatedDatasetsDialog.java
@@ -77,16 +77,20 @@ public final class ShowRelatedDatasetsDialog extends
 
     private final TableExportCriteria<? extends IEntityInformationHolder> displayedEntities;
 
+    private final int displayedEntitiesCount;
+
     private Radio allOrSelectedRadio;
 
     public ShowRelatedDatasetsDialog(IViewContext<ICommonClientServiceAsync> viewContext,
             List<? extends IEntityInformationHolder> selectedEntities,
-            TableExportCriteria<? extends IEntityInformationHolder> displayedEntities)
+            TableExportCriteria<? extends IEntityInformationHolder> displayedEntities,
+            int displayedEntitiesCount)
     {
         super(viewContext, selectedEntities, viewContext
                 .getMessage(Dict.SHOW_RELATED_DATASETS_DIALOG_TITLE));
         this.viewContext = viewContext;
         this.displayedEntities = displayedEntities;
+        this.displayedEntitiesCount = displayedEntitiesCount;
         setWidth(LABEL_WIDTH + FIELD_WIDTH + 50);
     }
 
@@ -112,7 +116,7 @@ public final class ShowRelatedDatasetsDialog extends
         final String radioGroupLabel =
                 viewContext.getMessage(Dict.SHOW_RELATED_DATASETS_DIALOG_RADIO_LABEL);
         final String selectedLabel = viewContext.getMessage(Dict.ONLY_SELECTED_RADIO, data.size());
-        final String allLabel = viewContext.getMessage(Dict.ALL_RADIO, data.size());
+        final String allLabel = viewContext.getMessage(Dict.ALL_RADIO, displayedEntitiesCount);
 
         return WidgetUtils.createAllOrSelectedRadioGroup(allOrSelectedRadio =
                 WidgetUtils.createRadio(selectedLabel), WidgetUtils.createRadio(allLabel),
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/AbstractExternalDataGrid.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/AbstractExternalDataGrid.java
index 30420adaa9d..d22e413a932 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/AbstractExternalDataGrid.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/AbstractExternalDataGrid.java
@@ -68,7 +68,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.PropertyType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatabaseModificationKind.ObjectKind;
 
 /**
- * @author     Franz-Josef Elmer
+ * @author Franz-Josef Elmer
  */
 public abstract class AbstractExternalDataGrid
         extends
@@ -124,7 +124,8 @@ public abstract class AbstractExternalDataGrid
                                         IBrowserGridActionInvoker invoker)
                                 {
                                     return new DataSetUploadConfirmationDialog(dataSets,
-                                            getSelectedAndDisplayedItemsAction(), viewContext);
+                                            getSelectedAndDisplayedItemsAction(), getCount(),
+                                            viewContext);
                                 }
                             });
         addButton(uploadButton);
@@ -229,11 +230,14 @@ public abstract class AbstractExternalDataGrid
         // currently selected items
         private final List<ExternalData> selectedItems;
 
-        public SelectedAndDisplayedItems(TableExportCriteria<ExternalData> displayedItemsConfig,
-                List<ExternalData> selectedItems)
+        private final int displayedItemsCount;
+
+        public SelectedAndDisplayedItems(List<ExternalData> selectedItems,
+                TableExportCriteria<ExternalData> displayedItemsConfig, int displayedItemsCount)
         {
             this.displayedItemsConfig = displayedItemsConfig;
             this.selectedItems = selectedItems;
+            this.displayedItemsCount = displayedItemsCount;
         }
 
         public TableExportCriteria<ExternalData> getDisplayedItemsConfig()
@@ -241,6 +245,11 @@ public abstract class AbstractExternalDataGrid
             return displayedItemsConfig;
         }
 
+        public int getDisplayedItemsCount()
+        {
+            return displayedItemsCount;
+        }
+
         public List<ExternalData> getSelectedItems()
         {
             return selectedItems;
@@ -265,8 +274,8 @@ public abstract class AbstractExternalDataGrid
             {
                 public SelectedAndDisplayedItems execute()
                 {
-                    return new SelectedAndDisplayedItems(createTableExportCriteria(),
-                            getSelectedBaseObjects());
+                    return new SelectedAndDisplayedItems(getSelectedBaseObjects(),
+                            createTableExportCriteria(), getCount());
                 }
             };
     }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/DataSetComputeMenu.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/DataSetComputeMenu.java
index cd3d60c98db..d0328a5d079 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/DataSetComputeMenu.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/DataSetComputeMenu.java
@@ -366,30 +366,26 @@ public class DataSetComputeMenu extends TextToolItem
         {
             int size = data.getSelectedDataSets().size();
             String computationName = data.getPluginTaskKind().getDescription();
-            // TODO 2009-07-03, Piotr Buczek: externalize to dictionary with parameters
             if (size == 0)
             {
-                return "No Data Sets were selected. "
-                        + "Select a data store service to perform "
-                        + computationName
-                        + " computation on all Data Sets from the grid that have type and data store "
-                        + "appropriate to the selected service and click on a Run button.";
+                final String msgIntroduction = viewContext.getMessage(Dict.NO_DATASETS_SELECTED);
+                return viewContext.getMessage(
+                        Dict.PERFORM_COMPUTATION_ON_ALL_DATASETS_MSG_TEMPLATE, msgIntroduction,
+                        computationName);
             } else
             {
                 if (isSingleDatastore())
                 {
-                    return "Select between performing " + computationName + " computation only on "
-                            + "selected Data Sets (" + size
-                            + ") or on all Data Sets of appropriate types from the grid, "
-                            + "then select a data store service and click on a Run button.";
+                    return viewContext.getMessage(
+                            Dict.PERFORM_COMPUTATION_ON_SELECTED_OR_ALL_DATASETS_MSG_TEMPLATE,
+                            computationName, size);
                 } else
                 {
-                    return "Datasets from different Data Stores have been selected, "
-                            + "so no operation can be performed on all of them. "
-                            + "Select a data store service to perform "
-                            + computationName
-                            + " computation on all Data Sets from the grid that have type "
-                            + "and data store appropriate to the selected service and click on a Run button.";
+                    final String msgIntroduction =
+                            viewContext.getMessage(Dict.DATASETS_FROM_DIFFERENT_STORES_SELECTED);
+                    return viewContext.getMessage(
+                            Dict.PERFORM_COMPUTATION_ON_ALL_DATASETS_MSG_TEMPLATE, msgIntroduction,
+                            computationName);
                 }
             }
         }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/DataSetListDeletionConfirmationDialog.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/DataSetListDeletionConfirmationDialog.java
index 693a3804f07..741dbccd0ba 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/DataSetListDeletionConfirmationDialog.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/DataSetListDeletionConfirmationDialog.java
@@ -104,7 +104,8 @@ public final class DataSetListDeletionConfirmationDialog extends
     {
         return WidgetUtils.createAllOrSelectedRadioGroup(onlySelectedRadio =
                 WidgetUtils.createRadio(viewContext.getMessage(Dict.ONLY_SELECTED_RADIO, data
-                        .size())), WidgetUtils.createRadio(viewContext.getMessage(Dict.ALL_RADIO)),
-                viewContext.getMessage(Dict.DATA_SETS_RADIO_GROUP_LABEL), data.size());
+                        .size())), WidgetUtils.createRadio(viewContext.getMessage(Dict.ALL_RADIO,
+                selectedAndDisplayedItemsOrNull.getDisplayedItemsCount())), viewContext
+                .getMessage(Dict.DATA_SETS_RADIO_GROUP_LABEL), data.size());
     }
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/DataSetUploadConfirmationDialog.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/DataSetUploadConfirmationDialog.java
index 6554a06ccd9..577b411f653 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/DataSetUploadConfirmationDialog.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/DataSetUploadConfirmationDialog.java
@@ -38,9 +38,10 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.BasicConstant;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
 
 /**
- * @author     Franz-Josef Elmer
+ * @author Franz-Josef Elmer
  */
-final class DataSetUploadConfirmationDialog extends AbstractDataConfirmationDialog<List<ExternalData>>
+final class DataSetUploadConfirmationDialog extends
+        AbstractDataConfirmationDialog<List<ExternalData>>
 {
     private static final int FIELD_WIDTH_IN_UPLOAD_DIALOG = 200;
 
@@ -48,6 +49,8 @@ final class DataSetUploadConfirmationDialog extends AbstractDataConfirmationDial
 
     private final IViewContext<?> viewContext;
 
+    private final int displayedItemsCount;
+
     private final IDelegatedActionWithResult<SelectedAndDisplayedItems> selectedAndDisplayedItemsAction;
 
     private String cifexURL;
@@ -64,10 +67,11 @@ final class DataSetUploadConfirmationDialog extends AbstractDataConfirmationDial
 
     public DataSetUploadConfirmationDialog(List<ExternalData> dataSets,
             IDelegatedActionWithResult<SelectedAndDisplayedItems> selectedAndDisplayedItemsAction,
-            IViewContext<?> viewContext)
+            int displayedItemsCount, IViewContext<?> viewContext)
     {
         super(viewContext, dataSets, viewContext.getMessage(Dict.CONFIRM_DATASET_UPLOAD_TITLE));
         this.viewContext = viewContext;
+        this.displayedItemsCount = displayedItemsCount;
         this.selectedAndDisplayedItemsAction = selectedAndDisplayedItemsAction;
         cifexURL = viewContext.getModel().getApplicationInfo().getCIFEXURL();
         addText(viewContext.getMessage(Dict.CONFIRM_DATASET_UPLOAD_MSG, dataSets.size(), cifexURL));
@@ -129,8 +133,9 @@ final class DataSetUploadConfirmationDialog extends AbstractDataConfirmationDial
     {
         return WidgetUtils.createAllOrSelectedRadioGroup(uploadSelectedRadio =
                 WidgetUtils.createRadio(viewContext.getMessage(Dict.ONLY_SELECTED_RADIO, data
-                        .size())), WidgetUtils.createRadio(viewContext.getMessage(Dict.ALL_RADIO)),
-                viewContext.getMessage(Dict.DATA_SETS_RADIO_GROUP_LABEL), data.size());
+                        .size())), WidgetUtils.createRadio(viewContext.getMessage(Dict.ALL_RADIO,
+                displayedItemsCount)), viewContext.getMessage(Dict.DATA_SETS_RADIO_GROUP_LABEL),
+                data.size());
     }
 
     private boolean getUploadSelected()
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/experiment/ExperimentBrowserGrid.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/experiment/ExperimentBrowserGrid.java
index 7b36485349a..f6c317067c7 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/experiment/ExperimentBrowserGrid.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/experiment/ExperimentBrowserGrid.java
@@ -301,11 +301,14 @@ public class ExperimentBrowserGrid extends
 
         private List<Experiment> selectedItems;
 
-        public DisplayedAndSelectedExperiments(
-                TableExportCriteria<Experiment> displayedItemsConfig, List<Experiment> selectedItems)
+        private final int displayedItemsCount;
+
+        public DisplayedAndSelectedExperiments(List<Experiment> selectedItems,
+                TableExportCriteria<Experiment> displayedItemsConfig, int displayedItemsCount)
         {
-            this.displayedItemsConfig = displayedItemsConfig;
             this.selectedItems = selectedItems;
+            this.displayedItemsConfig = displayedItemsConfig;
+            this.displayedItemsCount = displayedItemsCount;
         }
 
         public List<Experiment> getSelectedItems()
@@ -313,6 +316,11 @@ public class ExperimentBrowserGrid extends
             return selectedItems;
         }
 
+        public int getDisplayedItemsCount()
+        {
+            return displayedItemsCount;
+        }
+
         public TableExportCriteria<Experiment> getDisplayedItemsConfig()
         {
             return displayedItemsConfig;
@@ -338,8 +346,8 @@ public class ExperimentBrowserGrid extends
             {
                 public DisplayedAndSelectedExperiments execute()
                 {
-                    return new DisplayedAndSelectedExperiments(createTableExportCriteria(),
-                            getSelectedBaseObjects());
+                    return new DisplayedAndSelectedExperiments(getSelectedBaseObjects(),
+                            createTableExportCriteria(), getCount());
                 }
             };
     }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/experiment/ExperimentListDeletionConfirmationDialog.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/experiment/ExperimentListDeletionConfirmationDialog.java
index b7edb6c5012..428be913104 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/experiment/ExperimentListDeletionConfirmationDialog.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/experiment/ExperimentListDeletionConfirmationDialog.java
@@ -41,11 +41,11 @@ public final class ExperimentListDeletionConfirmationDialog extends
 
     private final AbstractAsyncCallback<Void> callback;
 
-    private Radio onlySelectedRadio;
+    private final DisplayedAndSelectedExperiments selectedAndDisplayedItemsOrNull;
 
-    private DisplayedAndSelectedExperiments selectedAndDisplayedItemsOrNull;
+    private final Experiment singleDataOrNull;
 
-    private Experiment singleDataOrNull;
+    private Radio onlySelectedRadio;
 
     public ExperimentListDeletionConfirmationDialog(
             IViewContext<ICommonClientServiceAsync> viewContext,
@@ -55,7 +55,7 @@ public final class ExperimentListDeletionConfirmationDialog extends
         super(viewContext, selectedAndDisplayedItems.getSelectedItems());
         this.viewContext = viewContext;
         this.callback = callback;
-        singleDataOrNull = null;
+        this.singleDataOrNull = null;
         this.selectedAndDisplayedItemsOrNull = selectedAndDisplayedItems;
     }
 
@@ -66,7 +66,7 @@ public final class ExperimentListDeletionConfirmationDialog extends
         super(viewContext, Collections.singletonList(experiment));
         this.viewContext = viewContext;
         this.callback = callback;
-        singleDataOrNull = experiment;
+        this.singleDataOrNull = experiment;
         this.selectedAndDisplayedItemsOrNull = null;
     }
 
@@ -105,8 +105,9 @@ public final class ExperimentListDeletionConfirmationDialog extends
     {
         return WidgetUtils.createAllOrSelectedRadioGroup(onlySelectedRadio =
                 WidgetUtils.createRadio(viewContext.getMessage(Dict.ONLY_SELECTED_RADIO, data
-                        .size())), WidgetUtils.createRadio(viewContext.getMessage(Dict.ALL_RADIO)),
-                viewContext.getMessage(Dict.EXPERIMENTS_RADIO_GROUP_LABEL), data.size());
+                        .size())), WidgetUtils.createRadio(viewContext.getMessage(Dict.ALL_RADIO,
+                selectedAndDisplayedItemsOrNull.getDisplayedItemsCount())), viewContext
+                .getMessage(Dict.EXPERIMENTS_RADIO_GROUP_LABEL), data.size());
     }
 
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/grid/AbstractBrowserGrid.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/grid/AbstractBrowserGrid.java
index 09fd49efc02..e86c6af5959 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/grid/AbstractBrowserGrid.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/grid/AbstractBrowserGrid.java
@@ -1219,6 +1219,12 @@ public abstract class AbstractBrowserGrid<T/* Entity */, M extends BaseEntityMod
         return translateSortInfo(store.getSortField(), store.getSortDir(), columnDefinitions);
     }
 
+    /** @return the number of all objects cached in the browser */
+    public int getCount()
+    {
+        return grid.getStore().getCount();
+    }
+
     private void refreshColumnsSettings()
     {
         grid.setLoadMask(false);
@@ -1534,8 +1540,8 @@ public abstract class AbstractBrowserGrid<T/* Entity */, M extends BaseEntityMod
         } else
         {
             // > 0 entity selected - show dialog with all/selected radio
-            new ShowRelatedDatasetsDialog(viewContext, selectedEntities, displayedEntities).show();
+            new ShowRelatedDatasetsDialog(viewContext, selectedEntities, displayedEntities, browser
+                    .getCount()).show();
         }
     }
-
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/sample/SampleBrowserGrid.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/sample/SampleBrowserGrid.java
index 100b2627232..44409ded58e 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/sample/SampleBrowserGrid.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/sample/SampleBrowserGrid.java
@@ -28,6 +28,7 @@ import com.extjs.gxt.ui.client.widget.Dialog;
 import com.extjs.gxt.ui.client.widget.LayoutContainer;
 import com.extjs.gxt.ui.client.widget.button.Button;
 import com.extjs.gxt.ui.client.widget.grid.GridCellRenderer;
+import com.google.gwt.user.client.rpc.IsSerializable;
 
 import ch.systemsx.cisd.openbis.generic.client.web.client.ICommonClientServiceAsync;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.AbstractAsyncCallback;
@@ -56,7 +57,9 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.en
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.entity.PropertyTypesFilterUtil;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.listener.OpenEntityDetailsTabAction;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.widget.IDataRefreshCallback;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.IDelegatedActionWithResult;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.DefaultResultSetConfig;
+import ch.systemsx.cisd.openbis.generic.client.web.client.dto.DisplayedOrSelectedIdHolderCriteria;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.ListEntityDisplayCriteriaKind;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.ListSampleDisplayCriteria;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.ResultSet;
@@ -367,7 +370,8 @@ public class SampleBrowserGrid extends
                                 IBrowserGridActionInvoker invoker)
                         {
                             return new SampleListDeletionConfirmationDialog(viewContext, samples,
-                                    createDeletionCallback(invoker));
+                                    createDeletionCallback(invoker),
+                                    getDisplayedAndSelectedItemsAction().execute());
                         }
                     }));
         allowMultipleSelection(); // we allow deletion of multiple samples
@@ -587,4 +591,63 @@ public class SampleBrowserGrid extends
         return EntityKind.SAMPLE;
     }
 
+    // NOTE: this is quite generic code compared with DisplayedAndSelectedExperiments - refactor?
+    public final class DisplayedAndSelectedSamples implements IsSerializable
+    {
+
+        private TableExportCriteria<Sample> displayedItemsConfig;
+
+        private List<Sample> selectedItems;
+
+        private final int displayedItemsCount;
+
+        public DisplayedAndSelectedSamples(List<Sample> selectedItems,
+                TableExportCriteria<Sample> displayedItemsConfig, int displayedItemsCount)
+        {
+            this.selectedItems = selectedItems;
+            this.displayedItemsConfig = displayedItemsConfig;
+            this.displayedItemsCount = displayedItemsCount;
+        }
+
+        public List<Sample> getSelectedItems()
+        {
+            return selectedItems;
+        }
+
+        public int getDisplayedItemsCount()
+        {
+            return displayedItemsCount;
+        }
+
+        public TableExportCriteria<Sample> getDisplayedItemsConfig()
+        {
+            return displayedItemsConfig;
+        }
+
+        public DisplayedOrSelectedIdHolderCriteria<Sample> createCriteria(boolean selected)
+        {
+            if (selected)
+            {
+                return DisplayedOrSelectedIdHolderCriteria.createSelectedItems(getSelectedItems());
+            } else
+            {
+                return DisplayedOrSelectedIdHolderCriteria
+                        .createDisplayedItems(getDisplayedItemsConfig());
+            }
+        }
+
+    }
+
+    protected final IDelegatedActionWithResult<DisplayedAndSelectedSamples> getDisplayedAndSelectedItemsAction()
+    {
+        return new IDelegatedActionWithResult<DisplayedAndSelectedSamples>()
+            {
+                public DisplayedAndSelectedSamples execute()
+                {
+                    return new DisplayedAndSelectedSamples(getSelectedBaseObjects(),
+                            createTableExportCriteria(), getCount());
+                }
+            };
+    }
+
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/sample/SampleListDeletionConfirmationDialog.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/sample/SampleListDeletionConfirmationDialog.java
index 886c7a4b451..35c0d7314ce 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/sample/SampleListDeletionConfirmationDialog.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/sample/SampleListDeletionConfirmationDialog.java
@@ -18,10 +18,17 @@ package ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.sample
 
 import java.util.List;
 
+import com.extjs.gxt.ui.client.widget.form.Radio;
+import com.extjs.gxt.ui.client.widget.form.RadioGroup;
+
 import ch.systemsx.cisd.openbis.generic.client.web.client.ICommonClientServiceAsync;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.AbstractAsyncCallback;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.Dict;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.IViewContext;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.sample.SampleBrowserGrid.DisplayedAndSelectedSamples;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.widget.AbstractDataListDeletionConfirmationDialog;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.WidgetUtils;
+import ch.systemsx.cisd.openbis.generic.client.web.client.dto.DisplayedOrSelectedIdHolderCriteria;
 import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityKind;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample;
@@ -34,20 +41,50 @@ public final class SampleListDeletionConfirmationDialog extends
 
     private final AbstractAsyncCallback<Void> callback;
 
+    private final DisplayedAndSelectedSamples selectedAndDisplayedItemsOrNull;
+
+    private final Sample singleDataOrNull;
+
+    private Radio onlySelectedRadio;
+
     public SampleListDeletionConfirmationDialog(
             IViewContext<ICommonClientServiceAsync> viewContext, List<Sample> data,
-            AbstractAsyncCallback<Void> callback)
+            AbstractAsyncCallback<Void> callback,
+            DisplayedAndSelectedSamples selectedAndDisplayedItems)
     {
         super(viewContext, data);
         this.viewContext = viewContext;
         this.callback = callback;
+        this.singleDataOrNull = null;
+        this.selectedAndDisplayedItemsOrNull = selectedAndDisplayedItems;
+    }
+
+    public SampleListDeletionConfirmationDialog(
+            IViewContext<ICommonClientServiceAsync> viewContext, List<Sample> data,
+            AbstractAsyncCallback<Void> callback, Sample sample)
+    {
+        super(viewContext, data);
+        this.viewContext = viewContext;
+        this.callback = callback;
+        this.singleDataOrNull = sample;
+        this.selectedAndDisplayedItemsOrNull = null;
     }
 
     @Override
     protected void executeConfirmedAction()
     {
-        viewContext.getCommonService().deleteSamples(TechId.createList(data), reason.getValue(),
-                callback);
+        if (selectedAndDisplayedItemsOrNull != null)
+        {
+            final boolean onlySelected = WidgetUtils.isSelected(onlySelectedRadio);
+            final DisplayedOrSelectedIdHolderCriteria<Sample> uploadCriteria =
+                    selectedAndDisplayedItemsOrNull.createCriteria(onlySelected);
+            viewContext.getCommonService().deleteSamples(uploadCriteria, reason.getValue(),
+                    callback);
+        } else
+        {
+            viewContext.getCommonService().deleteSample(TechId.create(singleDataOrNull),
+                    reason.getValue(), callback);
+        }
     }
 
     @Override
@@ -56,4 +93,21 @@ public final class SampleListDeletionConfirmationDialog extends
         return EntityKind.SAMPLE.getDescription();
     }
 
+    @Override
+    protected void extendForm()
+    {
+        super.extendForm();
+        if (selectedAndDisplayedItemsOrNull != null)
+            formPanel.add(createRadio());
+    }
+
+    private final RadioGroup createRadio()
+    {
+        return WidgetUtils.createAllOrSelectedRadioGroup(onlySelectedRadio =
+                WidgetUtils.createRadio(viewContext.getMessage(Dict.ONLY_SELECTED_RADIO, data
+                        .size())), WidgetUtils.createRadio(viewContext.getMessage(Dict.ALL_RADIO,
+                selectedAndDisplayedItemsOrNull.getDisplayedItemsCount())), viewContext
+                .getMessage(Dict.SAMPLES_RADIO_GROUP_LABEL), data.size());
+    }
+
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/CommonClientService.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/CommonClientService.java
index 26b807eeb9c..90242a367d0 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/CommonClientService.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/CommonClientService.java
@@ -138,7 +138,7 @@ import ch.systemsx.cisd.openbis.generic.shared.translator.VocabularyTermTranslat
 /**
  * The {@link ICommonClientService} implementation.
  * 
- * @author     Franz-Josef Elmer
+ * @author Franz-Josef Elmer
  */
 public final class CommonClientService extends AbstractClientService implements
         ICommonClientService, IDataStoreBaseURLProvider
@@ -1448,6 +1448,20 @@ public final class CommonClientService extends AbstractClientService implements
         }
     }
 
+    public void deleteDataSet(String singleData, String reason)
+            throws ch.systemsx.cisd.openbis.generic.client.web.client.exception.UserFailureException
+    {
+        try
+        {
+            final String sessionToken = getSessionToken();
+            List<String> dataSetCodes = Collections.singletonList(singleData);
+            commonServer.deleteDataSets(sessionToken, dataSetCodes, reason);
+        } catch (final UserFailureException e)
+        {
+            throw UserFailureExceptionTranslator.translate(e);
+        }
+    }
+
     public void deleteDataSets(
             DisplayedOrSelectedDatasetCriteria displayedOrSelectedDatasetCriteria, String reason)
             throws ch.systemsx.cisd.openbis.generic.client.web.client.exception.UserFailureException
@@ -1463,7 +1477,7 @@ public final class CommonClientService extends AbstractClientService implements
         }
     }
 
-    public void deleteSamples(List<TechId> sampleIds, String reason)
+	public void deleteSamples(List<TechId> sampleIds, String reason)
             throws ch.systemsx.cisd.openbis.generic.client.web.client.exception.UserFailureException
     {
         try
@@ -1476,6 +1490,33 @@ public final class CommonClientService extends AbstractClientService implements
         }
     }
 
+    public void deleteSample(TechId sampleId, String reason)
+            throws ch.systemsx.cisd.openbis.generic.client.web.client.exception.UserFailureException
+    {
+        try
+        {
+            final String sessionToken = getSessionToken();
+            commonServer.deleteSamples(sessionToken, Collections.singletonList(sampleId), reason);
+        } catch (final UserFailureException e)
+        {
+            throw UserFailureExceptionTranslator.translate(e);
+        }
+    }
+
+    public void deleteSamples(DisplayedOrSelectedIdHolderCriteria<Sample> criteria, String reason)
+            throws ch.systemsx.cisd.openbis.generic.client.web.client.exception.UserFailureException
+    {
+        try
+        {
+            final String sessionToken = getSessionToken();
+            List<TechId> experimentIds = extractTechIds(criteria);
+            commonServer.deleteSamples(sessionToken, experimentIds, reason);
+        } catch (final UserFailureException e)
+        {
+            throw UserFailureExceptionTranslator.translate(e);
+        }
+    }
+
     public void deleteExperiment(TechId experimentId, String reason)
             throws ch.systemsx.cisd.openbis.generic.client.web.client.exception.UserFailureException
     {
@@ -2071,21 +2112,6 @@ public final class CommonClientService extends AbstractClientService implements
 
     }
 
-    public void deleteDataSet(String singleData, String reason)
-            throws ch.systemsx.cisd.openbis.generic.client.web.client.exception.UserFailureException
-    {
-        try
-        {
-            final String sessionToken = getSessionToken();
-            List<String> dataSetCodes = Collections.singletonList(singleData);
-            commonServer.deleteDataSets(sessionToken, dataSetCodes, reason);
-        } catch (final UserFailureException e)
-        {
-            throw UserFailureExceptionTranslator.translate(e);
-        }
-
-    }
-
     private <T extends IIdHolder> List<TechId> extractTechIds(
             DisplayedOrSelectedIdHolderCriteria<T> displayedOrSelectedEntitiesCriteria)
     {
@@ -2177,4 +2203,5 @@ public final class CommonClientService extends AbstractClientService implements
             throw UserFailureExceptionTranslator.translate(e);
         }
     }
+
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/GenericSampleViewer.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/GenericSampleViewer.java
index 23fe7e6f3bd..b1382a6bf3d 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/GenericSampleViewer.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/GenericSampleViewer.java
@@ -130,7 +130,8 @@ public final class GenericSampleViewer extends AbstractViewer<IGenericClientServ
                 public void execute()
                 {
                     new SampleListDeletionConfirmationDialog(viewContext.getCommonViewContext(),
-                            getOriginalDataAsSingleton(), createDeletionCallback()).show();
+                            getOriginalDataAsSingleton(), createDeletionCallback(),
+                            getOriginalData()).show();
                 }
             }));
     }
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 81f5108098b..d3bf7a8e6f8 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
@@ -121,7 +121,7 @@ var common = {
   matching_field: "Matching Field",
   too_generic: "Query string '{0}' is too generic.",
   show_related_datasets: "Show Related Data Sets",
-  show_related_datasets_message: "Select between showing Data Sets related to selected ({0}) entities or to all entities from the grid and click on OK button.",
+  show_related_datasets_message: "Select between showing Data Sets related to selected ({0}) entities or to all entities from the table and click on OK button.",
   show_related_datasets_radio_label: "Related entities",
   
   //
@@ -156,6 +156,10 @@ var common = {
   //
   
   children_datasets: "Children",
+  no_datasets_selected: "No Data Sets were selected.",
+  datasets_from_different_stores_selected: "Data Sets from different Data Stores were selected, so no operation can be performed on all of them.",
+  perform_computation_on_all_datasets_msg_template: "{0} Select a data store service to perform {1} computation on all Data Sets from the table that have type and data store appropriate to the selected service and click on a Run button.",
+  perform_computation_on_selected_or_all_datasets_msg_template: "Select between performing {0} computation only on selected Data Sets ({1}) or on all Data Sets of appropriate types from the table, then select a data store service and click on a Run button.",
   
   //
   // Entity Type Browser
@@ -464,7 +468,7 @@ incorrect_experiment_syntax: "Incorrect experiment specification. Please provide
 // Grid Column Chooser
 //
 
-  GRID_COLUMN_CHOOSER_TITLE: "Configure grid columns",
+  GRID_COLUMN_CHOOSER_TITLE: "Configure table columns",
   GRID_COLUMN_NAME_HEADER: "Column",
   GRID_IS_COLUMN_VISIBLE_HEADER: "Visible?",
   GRID_COLUMN_HAS_FILTER_HEADER: "Has Filter?",
@@ -488,10 +492,11 @@ incorrect_experiment_syntax: "Incorrect experiment specification. Please provide
  remove_persons_from_authorization_group_confirmation_message: "Do you really want to remove {0} users ({1}) from the user group '{2}'?",
 
  
-all_radio: "all",
-data_sets_radio_group_label: "Data Sets",
+all_radio: "all ({0})",
 only_selected_radio: "selected ({0})",
+data_sets_radio_group_label: "Data Sets",
 experiments_radio_group_label: "Experiments",
+samples_radio_group_label: "Samples",
 
 //
 // Filters 
-- 
GitLab