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 4a36bab7ae32ccebf64355fb2f877b822697c467..87c73759f25746de3d81483b2a8bd72d8fe52cf4 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 @@ -364,6 +364,6 @@ public interface ICommonClientService extends IClientService throws UserFailureException; /** Deletes the specified data sets. */ - public void deleteDataSets(List<String> dataSetCodes) throws UserFailureException; + public void deleteDataSets(List<String> dataSetCodes, 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 cff6959039ddecb9f5fceda38986e75fcd0b0090..934e8abbe11168b9b366c200f2321b8e975ed8ef 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 @@ -320,6 +320,6 @@ public interface ICommonClientServiceAsync extends IClientServiceAsync public void updateSample(final String sampleIdentifier, List<SampleProperty> properties, final AsyncCallback<Void> asyncCallback) throws UserFailureException; - /** @see ICommonClientService#deleteDataSets(List) */ - public void deleteDataSets(List<String> dataSetCodes, AsyncCallback<Void> asyncCallback); + /** @see ICommonClientService#deleteDataSets(List, String) */ + public void deleteDataSets(List<String> dataSetCodes, String reason, AsyncCallback<Void> asyncCallback); } 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 75910ce195b2cb32c296af368991aa6284b40b18..eb275269f49ad3909ca57e6a9dc7f642ccbe22f5 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 @@ -20,8 +20,12 @@ import java.util.ArrayList; import java.util.List; import com.extjs.gxt.ui.client.event.ButtonEvent; +import com.extjs.gxt.ui.client.event.ComponentEvent; +import com.extjs.gxt.ui.client.event.KeyListener; import com.extjs.gxt.ui.client.event.SelectionListener; +import com.extjs.gxt.ui.client.widget.Dialog; import com.extjs.gxt.ui.client.widget.button.Button; +import com.extjs.gxt.ui.client.widget.form.TextField; import com.extjs.gxt.ui.client.widget.toolbar.AdapterToolItem; import ch.systemsx.cisd.openbis.generic.client.web.client.ICommonClientServiceAsync; @@ -35,7 +39,6 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.columns import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.AbstractSimpleBrowserGrid; import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.IBrowserGridActionInvoker; import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.ICellListener; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.widget.ConfirmationDialog; import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.DataSetUtils; import ch.systemsx.cisd.openbis.generic.client.web.client.dto.ExternalData; import ch.systemsx.cisd.openbis.generic.client.web.client.dto.IColumnDefinition; @@ -67,30 +70,19 @@ public abstract class AbstractExternalDataGrid extends AbstractSimpleBrowserGrid } } - private static final class DeletionConfirmationDialog extends ConfirmationDialog + private static final class DeletionConfirmationDialog extends Dialog { - - private static String render(List<ExternalData> dataSets) - { - StringBuilder builder = new StringBuilder(); - for (ExternalData externalData : dataSets) - { - builder.append("\n").append(externalData.getCode()); - } - return builder.toString(); - } - private final IViewContext<?> viewContext; private final List<String> dataSetCodes; private final IBrowserGridActionInvoker invoker; + private final TextField<String> reason; + public DeletionConfirmationDialog(IViewContext<?> viewContext, List<ExternalData> dataSets, IBrowserGridActionInvoker invoker) { - super(viewContext.getMessage(Dict.CONFIRM_DATASET_DELETION_TITLE), viewContext - .getMessage(Dict.CONFIRM_DATASET_DELETION_MSG, render(dataSets))); this.viewContext = viewContext; this.invoker = invoker; dataSetCodes = new ArrayList<String>(); @@ -98,14 +90,36 @@ public abstract class AbstractExternalDataGrid extends AbstractSimpleBrowserGrid { dataSetCodes.add(externalData.getCode()); } - setSize(400, 300); + setHeading(viewContext.getMessage(Dict.CONFIRM_DATASET_DELETION_TITLE)); + setButtons(Dialog.OKCANCEL); + addText(viewContext.getMessage(Dict.CONFIRM_DATASET_DELETION_MSG, dataSets.size())); + reason = new TextField<String>(); + reason.setSelectOnFocus(true); + reason.setHideLabel(true); + reason.setWidth("100%"); + reason.setMaxLength(250); + reason.addKeyListener(new KeyListener() + { + @Override + public void handleEvent(ComponentEvent ce) + { + okBtn.setEnabled(reason.isValid()); + } + }); + add(reason); + setHideOnButtonClick(true); + setModal(true); } - + @Override - protected void onYes() + protected void onButtonPressed(Button button) { - viewContext.getCommonService().deleteDataSets(dataSetCodes, - new DeletionCallback(viewContext, invoker)); + super.onButtonPressed(button); + if (button.getItemId().equals(Dialog.OK) && reason.isValid()) + { + viewContext.getCommonService().deleteDataSets(dataSetCodes, reason.getValue(), + new DeletionCallback(viewContext, invoker)); + } } } 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 a876e17d5da9930409792ed40c608d0e43f10953..d35fa5e82de90c14f02dc95c14a92ca8c8d55ea5 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 @@ -1015,13 +1015,13 @@ public final class CommonClientService extends AbstractClientService implements } - public void deleteDataSets(List<String> dataSetCodes) + public void deleteDataSets(List<String> dataSetCodes, String reason) throws ch.systemsx.cisd.openbis.generic.client.web.client.exception.UserFailureException { try { final String sessionToken = getSessionToken(); - commonServer.deleteDataSets(sessionToken, dataSetCodes); + commonServer.deleteDataSets(sessionToken, dataSetCodes, reason); } catch (final UserFailureException e) { throw UserFailureExceptionTranslator.translate(e); diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServer.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServer.java index 6e320a8fa1f92eace3a59ad84de0be96bfc023ff..6fc15a6082a043a1f01154f21b2fe2f019d9b768 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServer.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServer.java @@ -586,7 +586,7 @@ public final class CommonServer extends AbstractServer<ICommonServer> implements } } - public void deleteDataSets(String sessionToken, List<String> dataSetCodes) + public void deleteDataSets(String sessionToken, List<String> dataSetCodes, String reason) { Session session = getSessionManager().getSession(sessionToken); IExternalDataDAO externalDataDAO = getDAOFactory().getExternalDataDAO(); @@ -605,7 +605,7 @@ public final class CommonServer extends AbstractServer<ICommonServer> implements for (ExternalDataPE dataSet : dataSets) { - externalDataDAO.markAsDeleted(dataSet, session.tryGetPerson(), null); + externalDataDAO.markAsDeleted(dataSet, session.tryGetPerson(), reason); } Collection<DataStoreServerSession> sessions = dssSessionManager.getSessions(); for (DataStoreServerSession dssSession : sessions) diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServerLogger.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServerLogger.java index 6ce8b04eb35685f1520488729922a36ff6d9e31b..dc7e1cc8e11c9fee457eb60619d1eec21948c094 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServerLogger.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServerLogger.java @@ -318,9 +318,9 @@ final class CommonServerLogger extends AbstractServerLogger implements ICommonSe experimentIdentifier, attachments.size()); } - public void deleteDataSets(String sessionToken, List<String> dataSetCodes) + public void deleteDataSets(String sessionToken, List<String> dataSetCodes, String reason) { - logTracking(sessionToken, "delete_data_sets", "CODES(%s)", dataSetCodes); + logTracking(sessionToken, "delete_data_sets", "CODES(%s) REASON(%s)", dataSetCodes, reason); } public void editMaterial(String sessionToken, MaterialIdentifier identifier, diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/HibernateSearchDAO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/HibernateSearchDAO.java index 1778c6557b6bcb61c90b7b9d2b69e70a773ea02d..176f8b7de284ef8a06bae065392ecbe83cd30c87 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/HibernateSearchDAO.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/HibernateSearchDAO.java @@ -355,24 +355,24 @@ final class HibernateSearchDAO extends HibernateDaoSupport implements IHibernate Criteria criteria = getSession().createCriteria(ExternalDataPE.class); criteria.add(Restrictions.eq("deleted", false)); - criteria.setFetchMode("parents", FetchMode.JOIN); criteria.setFetchMode("procedure", FetchMode.JOIN); criteria.setFetchMode("procedure.experimentInternal", FetchMode.JOIN); - criteria.setFetchMode("procedure.experimentInternal.experimentProperties", FetchMode.JOIN); hibernateQuery.setCriteriaQuery(criteria); List<ExternalDataPE> datasets = AbstractDAO.cast(hibernateQuery.list()); datasets = filterNulls(datasets); - // NOTE: there is a limit on the number of JOINs, so we have to initialize sample properties - // manually - initSamplesWithProperties(datasets); + // NOTE: there is a limit on the number of JOINs, so we have to initialize parents, + // experiment properties, and sample properties manually. + initParentsAndExperimentPropertiesAndSamplesWithProperties(datasets); return asDataSetHits(datasets); } - private void initSamplesWithProperties(List<ExternalDataPE> datasets) + private void initParentsAndExperimentPropertiesAndSamplesWithProperties(List<ExternalDataPE> datasets) { for (ExternalDataPE dataset : datasets) { + HibernateUtils.initialize(dataset.getParents()); + HibernateUtils.initialize(dataset.getProcedure().getExperiment().getProperties()); initSamplesWithProperties(dataset.getSampleAcquiredFrom()); initSamplesWithProperties(dataset.getSampleDerivedFrom()); } diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/ICommonServer.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/ICommonServer.java index 5708300af35411c88b8e1d971d3523b5a217295b..48f017687e4531761ae24bcb9ca777a76ad1864b 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/ICommonServer.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/ICommonServer.java @@ -350,7 +350,7 @@ public interface ICommonServer extends IServer @RolesAllowed(RoleSet.GROUP_ADMIN) public void deleteDataSets(String sessionToken, @AuthorizationGuard(guardClass = DataSetCodePredicate.class) - List<String> dataSetCodes); + List<String> dataSetCodes, String reason); /** * Saves changed experiment. 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 db97336ccfb6d8a439f8a84a6ba9ce5f70d27b51..8557ad9c1a07ebd3153ee7bd8e1946fc2ec5dea6 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 @@ -233,7 +233,7 @@ var common = { data_producer_code: "Producer", button_delete_datasets: "Delete", confirm_dataset_deletion_title: "Data Sets Deletion Confirmation", - confirm_dataset_deletion_msg: "Do you really want to delete the following data sets?\n\n{0}", + confirm_dataset_deletion_msg: "You are deleting {0} data set(s). Please enter a reason:", // diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/ICommonServer.java.expected b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/ICommonServer.java.expected index 2211632a44e1ba0172185633430ce1cd094951ea..b61efa711ed9bfc0c9689820e587daea0fb8602a 100644 --- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/ICommonServer.java.expected +++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/ICommonServer.java.expected @@ -350,7 +350,7 @@ public interface ICommonServer extends IServer @RolesAllowed(RoleSet.GROUP_ADMIN) public void deleteDataSets(String sessionToken, @AuthorizationGuard(guardClass = DataSetCodePredicate.class) - List<String> dataSetCodes); + List<String> dataSetCodes, String reason); /** * Saves changed experiment.