From 55543a0070f317c82b6df297bb15979bc49bf6c5 Mon Sep 17 00:00:00 2001 From: pkupczyk <piotr.kupczyk@id.ethz.ch> Date: Thu, 18 Jun 2020 15:10:04 +0200 Subject: [PATCH] NG_UI : type browser : when deleting an entity type also remove all LOCAL property types related with that entity type --- .../types/browser/TypeBrowserController.js | 58 ++++++++++++++----- openbis_ng_ui/src/js/services/openbis/dto.js | 4 ++ openbis_ng_ui/srcTest/js/common/fixture.js | 9 +++ .../browser/TypeBrowserController.test.js | 31 ++++++++-- .../srcTest/js/services/openbis/api.js | 9 ++- .../srcTest/js/services/openbis/dto.js | 8 +++ 6 files changed, 100 insertions(+), 19 deletions(-) diff --git a/openbis_ng_ui/src/js/components/types/browser/TypeBrowserController.js b/openbis_ng_ui/src/js/components/types/browser/TypeBrowserController.js index 23c271012bf..f514883e52a 100644 --- a/openbis_ng_ui/src/js/components/types/browser/TypeBrowserController.js +++ b/openbis_ng_ui/src/js/components/types/browser/TypeBrowserController.js @@ -103,39 +103,69 @@ export default class TypeBrowserController extends BrowserController { const { type, id } = node.object const reason = 'deleted via ng_ui' - let promise = null + const operations = [] if (type === objectType.OBJECT_TYPE) { const options = new openbis.SampleTypeDeletionOptions() options.setReason(reason) - promise = openbis.deleteSampleTypes( - [new openbis.EntityTypePermId(id)], - options + operations.push( + new openbis.DeleteSampleTypesOperation( + [new openbis.EntityTypePermId(id)], + options + ) ) } else if (type === objectType.COLLECTION_TYPE) { const options = new openbis.ExperimentTypeDeletionOptions() options.setReason(reason) - promise = openbis.deleteExperimentTypes( - [new openbis.EntityTypePermId(id)], - options + operations.push( + new openbis.DeleteExperimentTypesOperation( + [new openbis.EntityTypePermId(id)], + options + ) ) } else if (type === objectType.DATA_SET_TYPE) { const options = new openbis.DataSetTypeDeletionOptions() options.setReason(reason) - promise = openbis.deleteDataSetTypes( - [new openbis.EntityTypePermId(id)], - options + operations.push( + new openbis.DeleteDataSetTypesOperation( + [new openbis.EntityTypePermId(id)], + options + ) ) } else if (type === objectType.MATERIAL_TYPE) { const options = new openbis.MaterialTypeDeletionOptions() options.setReason(reason) - promise = openbis.deleteMaterialTypes( - [new openbis.EntityTypePermId(id)], - options + operations.push( + new openbis.DeleteMaterialTypesOperation( + [new openbis.EntityTypePermId(id)], + options + ) ) } - return promise + const criteria = new openbis.PropertyTypeSearchCriteria() + criteria.withCode().thatStartsWith(id + '.') + const fo = new openbis.PropertyTypeFetchOptions() + + return openbis + .searchPropertyTypes(criteria, fo) + .then(results => { + const ids = results + .getObjects() + .map(propertyType => propertyType.getPermId()) + if (!_.isEmpty(ids)) { + const options = new openbis.PropertyTypeDeletionOptions() + options.setReason(reason) + operations.push( + new openbis.DeletePropertyTypesOperation(ids, options) + ) + } + }) + .then(() => { + const options = new openbis.SynchronousOperationExecutionOptions() + options.setExecuteInOrder(true) + return openbis.executeOperations(operations, options) + }) .then(() => { this.context.dispatch(actions.objectDelete(this.getPage(), type, id)) }) diff --git a/openbis_ng_ui/src/js/services/openbis/dto.js b/openbis_ng_ui/src/js/services/openbis/dto.js index 8df06c95c32..322b26f357d 100644 --- a/openbis_ng_ui/src/js/services/openbis/dto.js +++ b/openbis_ng_ui/src/js/services/openbis/dto.js @@ -4,6 +4,7 @@ const CLASS_FULL_NAMES = [ 'as/dto/dataset/create/CreateDataSetTypesOperation', 'as/dto/dataset/create/DataSetTypeCreation', 'as/dto/dataset/delete/DataSetTypeDeletionOptions', + 'as/dto/dataset/delete/DeleteDataSetTypesOperation', 'as/dto/dataset/fetchoptions/DataSetFetchOptions', 'as/dto/dataset/fetchoptions/DataSetTypeFetchOptions', 'as/dto/dataset/search/DataSetSearchCriteria', @@ -16,6 +17,7 @@ const CLASS_FULL_NAMES = [ 'as/dto/experiment/create/CreateExperimentTypesOperation', 'as/dto/experiment/create/ExperimentTypeCreation', 'as/dto/experiment/delete/ExperimentTypeDeletionOptions', + 'as/dto/experiment/delete/DeleteExperimentTypesOperation', 'as/dto/experiment/fetchoptions/ExperimentFetchOptions', 'as/dto/experiment/fetchoptions/ExperimentTypeFetchOptions', 'as/dto/experiment/search/ExperimentSearchCriteria', @@ -26,6 +28,7 @@ const CLASS_FULL_NAMES = [ 'as/dto/material/create/CreateMaterialTypesOperation', 'as/dto/material/create/MaterialTypeCreation', 'as/dto/material/delete/MaterialTypeDeletionOptions', + 'as/dto/material/delete/DeleteMaterialTypesOperation', 'as/dto/material/fetchoptions/MaterialFetchOptions', 'as/dto/material/fetchoptions/MaterialTypeFetchOptions', 'as/dto/material/search/MaterialSearchCriteria', @@ -60,6 +63,7 @@ const CLASS_FULL_NAMES = [ 'as/dto/sample/create/CreateSampleTypesOperation', 'as/dto/sample/create/SampleTypeCreation', 'as/dto/sample/delete/SampleTypeDeletionOptions', + 'as/dto/sample/delete/DeleteSampleTypesOperation', 'as/dto/sample/fetchoptions/SampleFetchOptions', 'as/dto/sample/fetchoptions/SampleTypeFetchOptions', 'as/dto/sample/fetchoptions/SampleTypeFetchOptions', diff --git a/openbis_ng_ui/srcTest/js/common/fixture.js b/openbis_ng_ui/srcTest/js/common/fixture.js index b3a2cb50c99..0322e50ef4a 100644 --- a/openbis_ng_ui/srcTest/js/common/fixture.js +++ b/openbis_ng_ui/srcTest/js/common/fixture.js @@ -31,14 +31,23 @@ TEST_PLUGIN_DTO.setName('TEST_PLUGIN') const TEST_PROPERTY_TYPE_1_DTO = new openbis.PropertyType() TEST_PROPERTY_TYPE_1_DTO.setCode('TEST_PROPERTY_TYPE_1') +TEST_PROPERTY_TYPE_1_DTO.setPermId( + new openbis.PropertyTypePermId(TEST_PROPERTY_TYPE_1_DTO.getCode()) +) TEST_PROPERTY_TYPE_1_DTO.setDataType(openbis.DataType.VARCHAR) const TEST_PROPERTY_TYPE_2_DTO = new openbis.PropertyType() TEST_PROPERTY_TYPE_2_DTO.setCode('TEST_PROPERTY_TYPE_2') +TEST_PROPERTY_TYPE_2_DTO.setPermId( + new openbis.PropertyTypePermId(TEST_PROPERTY_TYPE_2_DTO.getCode()) +) TEST_PROPERTY_TYPE_2_DTO.setDataType(openbis.DataType.VARCHAR) const TEST_PROPERTY_TYPE_3_DTO = new openbis.PropertyType() TEST_PROPERTY_TYPE_3_DTO.setCode('TEST_PROPERTY_TYPE_3') +TEST_PROPERTY_TYPE_3_DTO.setPermId( + new openbis.PropertyTypePermId(TEST_PROPERTY_TYPE_3_DTO.getCode()) +) TEST_PROPERTY_TYPE_3_DTO.setDataType(openbis.DataType.VARCHAR) const TEST_PROPERTY_ASSIGNMENT_1 = new openbis.PropertyAssignment() diff --git a/openbis_ng_ui/srcTest/js/components/types/browser/TypeBrowserController.test.js b/openbis_ng_ui/srcTest/js/components/types/browser/TypeBrowserController.test.js index cfae9cf9723..5205faadeae 100644 --- a/openbis_ng_ui/srcTest/js/components/types/browser/TypeBrowserController.test.js +++ b/openbis_ng_ui/srcTest/js/components/types/browser/TypeBrowserController.test.js @@ -105,6 +105,7 @@ describe('browser', () => { }) test('remove node', async () => { + openbis.mockSearchPropertyTypes([fixture.TEST_PROPERTY_TYPE_1_DTO]) openbis.deleteSampleTypes.mockReturnValue(Promise.resolve()) await controller.load() @@ -121,10 +122,32 @@ describe('browser', () => { await controller.nodeRemoveConfirm() expect(controller.isRemoveNodeDialogOpen()).toBe(false) - const id = new openbis.EntityTypePermId(fixture.TEST_SAMPLE_TYPE_DTO.code) - const options = new openbis.SampleTypeDeletionOptions() - options.setReason('deleted via ng_ui') - expect(openbis.deleteSampleTypes).toHaveBeenCalledWith([id], options) + + const createDeleteTypeOperation = typeCode => { + const id = new openbis.EntityTypePermId(typeCode) + const options = new openbis.SampleTypeDeletionOptions() + options.setReason('deleted via ng_ui') + return new openbis.DeleteSampleTypesOperation([id], options) + } + + const createDeletePropertyTypeOperation = propertyTypeCode => { + const id = new openbis.PropertyTypePermId(propertyTypeCode) + const options = new openbis.PropertyTypeDeletionOptions() + options.setReason('deleted via ng_ui') + return new openbis.DeletePropertyTypesOperation([id], options) + } + + const options = new openbis.SynchronousOperationExecutionOptions() + options.setExecuteInOrder(true) + + expect(openbis.executeOperations).toHaveBeenCalledWith( + [ + createDeleteTypeOperation(fixture.TEST_SAMPLE_TYPE_DTO.code), + createDeletePropertyTypeOperation(fixture.TEST_PROPERTY_TYPE_1_DTO.code) + ], + options + ) + expectDeleteTypeAction( objectType.OBJECT_TYPE, fixture.TEST_SAMPLE_TYPE_DTO.code diff --git a/openbis_ng_ui/srcTest/js/services/openbis/api.js b/openbis_ng_ui/srcTest/js/services/openbis/api.js index f0e78c76601..e906fdf6264 100644 --- a/openbis_ng_ui/srcTest/js/services/openbis/api.js +++ b/openbis_ng_ui/srcTest/js/services/openbis/api.js @@ -69,6 +69,12 @@ const mockSearchMaterialTypes = materialTypes => { searchMaterialTypes.mockReturnValue(Promise.resolve(searchResult)) } +const mockSearchPropertyTypes = propertyTypes => { + const searchResult = new dto.SearchResult() + searchResult.setObjects(propertyTypes) + searchPropertyTypes.mockReturnValue(Promise.resolve(searchResult)) +} + export default { login, logout, @@ -105,5 +111,6 @@ export default { mockSearchGroups, mockSearchMaterialTypes, mockSearchPersons, - mockSearchSampleTypes + mockSearchSampleTypes, + mockSearchPropertyTypes } diff --git a/openbis_ng_ui/srcTest/js/services/openbis/dto.js b/openbis_ng_ui/srcTest/js/services/openbis/dto.js index c4354f87742..262e59c26a7 100644 --- a/openbis_ng_ui/srcTest/js/services/openbis/dto.js +++ b/openbis_ng_ui/srcTest/js/services/openbis/dto.js @@ -17,7 +17,11 @@ import DataSetTypeFetchOptions from 'as/dto/dataset/fetchoptions/DataSetTypeFetc import DataSetTypeSearchCriteria from 'as/dto/dataset/search/DataSetTypeSearchCriteria' import DataSetTypeUpdate from 'as/dto/dataset/update/DataSetTypeUpdate' import DataType from 'as/dto/property/DataType' +import DeleteDataSetTypesOperation from 'as/dto/dataset/delete/DeleteDataSetTypesOperation' +import DeleteExperimentTypesOperation from 'as/dto/experiment/delete/DeleteExperimentTypesOperation' +import DeleteMaterialTypesOperation from 'as/dto/material/delete/DeleteMaterialTypesOperation' import DeletePropertyTypesOperation from 'as/dto/property/delete/DeletePropertyTypesOperation' +import DeleteSampleTypesOperation from 'as/dto/sample/delete/DeleteSampleTypesOperation' import EntityKind from 'as/dto/entitytype/EntityKind' import EntityTypePermId from 'as/dto/entitytype/id/EntityTypePermId' import ExperimentFetchOptions from 'as/dto/experiment/fetchoptions/ExperimentFetchOptions' @@ -105,7 +109,11 @@ const dto = { DataSetTypeSearchCriteria, DataSetTypeUpdate, DataType, + DeleteDataSetTypesOperation, + DeleteExperimentTypesOperation, + DeleteMaterialTypesOperation, DeletePropertyTypesOperation, + DeleteSampleTypesOperation, EntityKind, EntityTypePermId, ExperimentFetchOptions, -- GitLab