diff options
author | JvD_Ericsson <jeff.van.dam@est.tech> | 2023-02-21 14:07:50 +0000 |
---|---|---|
committer | Michael Morris <michael.morris@est.tech> | 2023-02-22 14:16:42 +0000 |
commit | 9b8d90c9cdc012ca444d35465dc2e77662e4becf (patch) | |
tree | ef9f5f6d99a5bcc5eb40d965829d9a5c0128ea76 | |
parent | 8aa94a97ebfff1205e85470d78202f598632dbd6 (diff) |
Support delete non-normative data types
Issue-ID: SDC-4411
Signed-off-by: JvD_Ericsson <jeff.van.dam@est.tech>
Change-Id: I246e50d848a17178369bfb643989d5447a887017
13 files changed, 244 insertions, 14 deletions
diff --git a/catalog-be/src/main/java/org/openecomp/sdc/be/servlets/DataTypeServlet.java b/catalog-be/src/main/java/org/openecomp/sdc/be/servlets/DataTypeServlet.java index 3a62600433..404c045dec 100644 --- a/catalog-be/src/main/java/org/openecomp/sdc/be/servlets/DataTypeServlet.java +++ b/catalog-be/src/main/java/org/openecomp/sdc/be/servlets/DataTypeServlet.java @@ -59,6 +59,7 @@ import org.openecomp.sdc.be.impl.ComponentsUtils; import org.openecomp.sdc.be.model.PropertyDefinition; import org.openecomp.sdc.be.model.dto.PropertyDefinitionDto; import org.openecomp.sdc.be.model.jsonjanusgraph.operations.exception.OperationException; +import org.openecomp.sdc.be.model.normatives.ElementTypeEnum; import org.openecomp.sdc.be.model.operations.impl.DataTypeOperation; import org.openecomp.sdc.common.api.Constants; import org.openecomp.sdc.common.log.enums.EcompLoggerErrorCode; @@ -185,7 +186,8 @@ public class DataTypeServlet extends BeGenericServlet { @PermissionAllowed(AafPermission.PermNames.INTERNAL_ALL_VALUE) public Response updateProperty(@Parameter(in = ParameterIn.PATH, required = true, description = "The data type id") @PathParam("id") final String id, - @RequestBody(description = "Property to update", required = true) final PropertyDefinitionDto propertyDefinitionDto) { + @RequestBody(description = "Property to update", required = true) + final PropertyDefinitionDto propertyDefinitionDto) { Optional<DataTypeDataDefinition> dataTypeOptional = dataTypeOperation.getDataTypeByUid(id); dataTypeOptional.orElseThrow(() -> { throw new OperationException(ActionStatus.DATA_TYPE_NOT_FOUND, String.format("Failed to find data type '%s'", id)); @@ -254,6 +256,33 @@ public class DataTypeServlet extends BeGenericServlet { return Response.status(Status.OK).entity(propertyDefinitionDto).build(); } + @DELETE + @Path("{dataTypeId}") + public Response deleteDatatype(@Parameter(in = ParameterIn.PATH, required = true, description = "The data type id") + @PathParam("dataTypeId") final String dataTypeId) { + final Optional<DataTypeDataDefinition> dataTypeOptional = dataTypeOperation.getDataTypeByUid(dataTypeId); + dataTypeOptional.orElseThrow(() -> { + throw new OperationException(ActionStatus.DATA_TYPE_NOT_FOUND, String.format("Failed to find data type '%s'", dataTypeId)); + }); + final DataTypeDataDefinition dataTypeDataDefinition = dataTypeOptional.get(); + if (dataTypeDataDefinition.isNormative()) { + throw new OperationException(ActionStatus.CANNOT_DELETE_SYSTEM_DEPLOYED_RESOURCES, ElementTypeEnum.DATA_TYPE.getToscaEntryName(), + dataTypeId); + } + if (StringUtils.isEmpty(dataTypeDataDefinition.getModel())) { + dataTypeDataDefinition.setModel(Constants.DEFAULT_MODEL_NAME); + } + try { + dataTypeOperation.deleteDataTypesByDataTypeId(dataTypeId); + dataTypeOperation.removeDataTypeFromAdditionalType(dataTypeDataDefinition); + } catch (Exception e) { + BeEcompErrorManager.getInstance().logBeRestApiGeneralError("Delete Datatype"); + log.debug("delete datatype failed with exception ", e); + throw e; + } + return buildOkResponse(getComponentsUtils().getResponseFormat(ActionStatus.NO_CONTENT), null); + } + private String extractNameFromPropertyId(final String propertyId) { final String[] split = propertyId.split("\\."); return split[split.length - 1]; diff --git a/catalog-model/src/main/java/org/openecomp/sdc/be/model/operations/impl/DataTypeOperation.java b/catalog-model/src/main/java/org/openecomp/sdc/be/model/operations/impl/DataTypeOperation.java index f79f1501e7..b8ddff9907 100644 --- a/catalog-model/src/main/java/org/openecomp/sdc/be/model/operations/impl/DataTypeOperation.java +++ b/catalog-model/src/main/java/org/openecomp/sdc/be/model/operations/impl/DataTypeOperation.java @@ -16,6 +16,7 @@ * SPDX-License-Identifier: Apache-2.0 * ============LICENSE_END========================================================= */ + package org.openecomp.sdc.be.model.operations.impl; import fj.data.Either; @@ -190,6 +191,18 @@ public class DataTypeOperation extends AbstractOperation { }); } + public void deleteDataTypesByDataTypeId(final String dataTypeId) { + final JanusGraph janusGraph = janusGraphGenericDao.getJanusGraph(); + final GraphTraversalSource traversal = janusGraph.traversal(); + final List<Vertex> dataTypeList = traversal.V() + .has(GraphPropertiesDictionary.UNIQUE_ID.getProperty(), dataTypeId) + .toList(); + dataTypeList.forEach(dataTypeVertex -> { + traversal.V(dataTypeVertex).out(GraphEdgeLabels.PROPERTY.getProperty()).drop().iterate(); + dataTypeVertex.remove(); + }); + } + public Optional<DataTypeDataDefinition> getDataTypeByUid(final String uniqueId) { final Either<DataTypeData, JanusGraphOperationStatus> dataTypeEither = janusGraphGenericDao .getNode(UniqueIdBuilder.getKeyByNodeType(NodeTypeEnum.DataType), uniqueId, DataTypeData.class); @@ -288,7 +301,8 @@ public class DataTypeOperation extends AbstractOperation { getDataTypeByUid(dataTypeId).orElseThrow(DataTypeOperationExceptionSupplier.dataTypeNotFound(dataTypeId)); final Either<PropertyDefinition, JanusGraphOperationStatus> resultEither = - propertyOperation.updatePropertyAssociatedToNode(NodeTypeEnum.DataType, dataTypeId, PropertyDefinitionDtoMapper.mapTo(propertyDefinitionDto)); + propertyOperation.updatePropertyAssociatedToNode(NodeTypeEnum.DataType, dataTypeId, + PropertyDefinitionDtoMapper.mapTo(propertyDefinitionDto)); if (resultEither.isRight()) { final JanusGraphOperationStatus status = resultEither.right().value(); LOGGER.debug("Could not update property '{}' on data type '{}'. JanusGraph status is '{}'", propertyName, dataTypeId, status); @@ -310,6 +324,11 @@ public class DataTypeOperation extends AbstractOperation { dataTypeDataDefinition.getName(), isAdd); } + public void removeDataTypeFromAdditionalType(final DataTypeDataDefinition dataTypeDataDefinition) { + modelOperation.removeDataTypeFromAdditionalType(ElementTypeEnum.DATA_TYPE, dataTypeDataDefinition.getModel(), + dataTypeDataDefinition.getName()); + } + public PropertyDefinitionDto deleteProperty(final DataTypeDataDefinition dataTypeDataDefinition, final String propertyId) { final List<PropertyDefinition> propertiesData = findAllProperties(dataTypeDataDefinition.getUniqueId()); final String dataTypeDataDefinitionName = dataTypeDataDefinition.getName(); @@ -336,5 +355,4 @@ public class DataTypeOperation extends AbstractOperation { propertiesData.remove(propertyDefinition); return PropertyDefinitionDtoMapper.mapFrom(propertyDataDefinition); } - } diff --git a/catalog-model/src/main/java/org/openecomp/sdc/be/model/operations/impl/ModelOperation.java b/catalog-model/src/main/java/org/openecomp/sdc/be/model/operations/impl/ModelOperation.java index 19289411c3..b57c57a9cc 100644 --- a/catalog-model/src/main/java/org/openecomp/sdc/be/model/operations/impl/ModelOperation.java +++ b/catalog-model/src/main/java/org/openecomp/sdc/be/model/operations/impl/ModelOperation.java @@ -16,6 +16,7 @@ * SPDX-License-Identifier: Apache-2.0 * ============LICENSE_END========================================================= */ + package org.openecomp.sdc.be.model.operations.impl; import static org.openecomp.sdc.be.utils.TypeUtils.ToscaTagNamesEnum.DATA_TYPES; @@ -74,9 +75,8 @@ import org.yaml.snakeyaml.Yaml; @Component("model-operation") public class ModelOperation { - private static final Logger log = Logger.getLogger(ModelOperation.class); static final Path ADDITIONAL_TYPE_DEFINITIONS_PATH = Path.of(ADDITIONAL_TYPE_DEFINITIONS); - + private static final Logger log = Logger.getLogger(ModelOperation.class); private final JanusGraphGenericDao janusGraphGenericDao; private final JanusGraphDao janusGraphDao; private final ToscaModelImportCassandraDao toscaModelImportCassandraDao; @@ -411,10 +411,9 @@ public class ModelOperation { final Map<String, Object> existingProperties = (Map<String, Object>) ((Map<String, Object>) existingTypeContent.get(newTypeToUpdate.getKey())).get(PROPERTIES.getElementName()); - final List<Entry<String, Object>> propertiesMissingFromNewDef = MapUtils.isEmpty(existingProperties) ? Collections.emptyList() - : existingProperties.entrySet().stream() - .filter(existingPropEntry -> !propertiesInNewDef.keySet().contains(existingPropEntry.getKey())) - .collect(Collectors.toList()); + final List<Entry<String, Object>> propertiesMissingFromNewDef = MapUtils.isEmpty(existingProperties) ? Collections.emptyList() : + existingProperties.entrySet().stream() + .filter(existingPropEntry -> !propertiesInNewDef.keySet().contains(existingPropEntry.getKey())).collect(Collectors.toList()); if (CollectionUtils.isNotEmpty(propertiesMissingFromNewDef)) { typesToUpate.put(newTypeToUpdate.getKey(), newTypeToUpdate.getValue()); @@ -458,6 +457,23 @@ public class ModelOperation { toscaModelImportCassandraDao.saveAll(modelName, rebuiltModelImportList); } + public void removeDataTypeFromAdditionalType(final ElementTypeEnum elementTypeEnum, final String modelName, final String name) { + final List<ToscaImportByModel> modelImportList = toscaModelImportCassandraDao.findAllByModel(modelName); + final Optional<ToscaImportByModel> additionalTypeDefinitionsImportOptional = modelImportList.stream() + .filter(t -> ADDITIONAL_TYPE_DEFINITIONS_PATH.equals(Path.of(t.getFullPath()))).findAny(); + if (additionalTypeDefinitionsImportOptional.isEmpty()) { + return; + } + final ToscaImportByModel additionalTypeDefinitionsImport = additionalTypeDefinitionsImportOptional.get(); + removeExistingTypesFromDefaultImports(elementTypeEnum, Collections.singletonMap(name, null), + Collections.singletonList(additionalTypeDefinitionsImport)); + final List<ToscaImportByModel> rebuiltModelImportList = modelImportList.stream() + .filter(toscaImportByModel -> !ADDITIONAL_TYPE_DEFINITIONS_PATH.equals(Path.of(toscaImportByModel.getFullPath()))) + .collect(Collectors.toList()); + rebuiltModelImportList.add(additionalTypeDefinitionsImport); + toscaModelImportCassandraDao.saveAll(modelName, rebuiltModelImportList); + } + private String buildPropertyAdditionalTypeDefinitionContent(final ElementTypeEnum elementTypeEnum, final String name, final PropertyDefinitionDto property, final Map<String, Object> originalContent, boolean isAdd) { diff --git a/catalog-model/src/test/java/org/openecomp/sdc/be/model/operations/impl/ModelOperationTest.java b/catalog-model/src/test/java/org/openecomp/sdc/be/model/operations/impl/ModelOperationTest.java index 1bd4d9dbac..c68ed71a07 100644 --- a/catalog-model/src/test/java/org/openecomp/sdc/be/model/operations/impl/ModelOperationTest.java +++ b/catalog-model/src/test/java/org/openecomp/sdc/be/model/operations/impl/ModelOperationTest.java @@ -630,6 +630,72 @@ class ModelOperationTest extends ModelTestBase { assertEquals(expectedAdditionalTypesImport.getContent(), actualAdditionalTypesImport.getContent()); } + @Test + void removeDataTypeFromAdditionalType() throws IOException { + var modelName = "model"; + final Path testResourcePath = Path.of("src/test/resources/modelOperation"); + + var originalAdditionalTypesImport = new ToscaImportByModel(); + originalAdditionalTypesImport.setModelId(modelName); + originalAdditionalTypesImport.setFullPath(ADDITIONAL_TYPE_DEFINITIONS_PATH.toString()); + final Path originalAdditionalTypesImportPath = testResourcePath.resolve(Path.of("original-additional_types-1.yaml")); + originalAdditionalTypesImport.setContent(Files.readString(originalAdditionalTypesImportPath)); + + final List<ToscaImportByModel> modelImports = new ArrayList<>(); + modelImports.add(originalAdditionalTypesImport); + when(toscaModelImportCassandraDao.findAllByModel(modelName)).thenReturn(modelImports); + + String dataTypeName = "tosca.datatypes.nfv.PreviouslyExistingType1"; + modelOperation.removeDataTypeFromAdditionalType(ElementTypeEnum.DATA_TYPE, modelName, dataTypeName); + ArgumentCaptor<List<ToscaImportByModel>> importListArgumentCaptor = ArgumentCaptor.forClass(List.class); + verify(toscaModelImportCassandraDao).saveAll(eq(modelName), importListArgumentCaptor.capture()); + + final List<ToscaImportByModel> actualImportList = importListArgumentCaptor.getValue(); + assertEquals(1, actualImportList.size()); + + var expectedAdditionalTypesImport = new ToscaImportByModel(); + expectedAdditionalTypesImport.setModelId(modelName); + expectedAdditionalTypesImport.setFullPath(ADDITIONAL_TYPE_DEFINITIONS_PATH.toString()); + expectedAdditionalTypesImport.setContent(Files.readString(testResourcePath.resolve(Path.of("expected-additional_types-5.yaml")))); + final ToscaImportByModel actualAdditionalTypesImport = + actualImportList.stream().filter(expectedAdditionalTypesImport::equals).findFirst().orElse(null); + assertNotNull(actualAdditionalTypesImport); + assertEquals(expectedAdditionalTypesImport.getContent(), actualAdditionalTypesImport.getContent()); + } + + @Test + void removeOnlyDataTypeFromAdditionalType() throws IOException { + var modelName = "model"; + final Path testResourcePath = Path.of("src/test/resources/modelOperation"); + + var originalAdditionalTypesImport = new ToscaImportByModel(); + originalAdditionalTypesImport.setModelId(modelName); + originalAdditionalTypesImport.setFullPath(ADDITIONAL_TYPE_DEFINITIONS_PATH.toString()); + final Path originalAdditionalTypesImportPath = testResourcePath.resolve(Path.of("original-additional_types-3.yaml")); + originalAdditionalTypesImport.setContent(Files.readString(originalAdditionalTypesImportPath)); + + final List<ToscaImportByModel> modelImports = new ArrayList<>(); + modelImports.add(originalAdditionalTypesImport); + when(toscaModelImportCassandraDao.findAllByModel(modelName)).thenReturn(modelImports); + + String dataTypeName = "tosca.datatypes.nfv.PreviouslyExistingType1"; + modelOperation.removeDataTypeFromAdditionalType(ElementTypeEnum.DATA_TYPE, modelName, dataTypeName); + ArgumentCaptor<List<ToscaImportByModel>> importListArgumentCaptor = ArgumentCaptor.forClass(List.class); + verify(toscaModelImportCassandraDao).saveAll(eq(modelName), importListArgumentCaptor.capture()); + + final List<ToscaImportByModel> actualImportList = importListArgumentCaptor.getValue(); + assertEquals(1, actualImportList.size()); + + var expectedAdditionalTypesImport = new ToscaImportByModel(); + expectedAdditionalTypesImport.setModelId(modelName); + expectedAdditionalTypesImport.setFullPath(ADDITIONAL_TYPE_DEFINITIONS_PATH.toString()); + expectedAdditionalTypesImport.setContent(Files.readString(testResourcePath.resolve(Path.of("expected-additional_types-6.yaml")))); + final ToscaImportByModel actualAdditionalTypesImport = + actualImportList.stream().filter(expectedAdditionalTypesImport::equals).findFirst().orElse(null); + assertNotNull(actualAdditionalTypesImport); + assertEquals(expectedAdditionalTypesImport.getContent(), actualAdditionalTypesImport.getContent()); + } + private ToscaImportByModel createModelImport(final String parentModelName, final String importPath) { var toscaImportByModel = new ToscaImportByModel(); toscaImportByModel.setModelId(parentModelName); diff --git a/catalog-model/src/test/resources/modelOperation/expected-additional_types-5.yaml b/catalog-model/src/test/resources/modelOperation/expected-additional_types-5.yaml new file mode 100644 index 0000000000..2fe94dc9cb --- /dev/null +++ b/catalog-model/src/test/resources/modelOperation/expected-additional_types-5.yaml @@ -0,0 +1,7 @@ +tosca_definitions_version: tosca_simple_yaml_1_3 +description: Auto-generated file that contains package custom types or types added + after system installation. +data_types: + tosca.datatypes.nfv.PreviouslyExistingType2: + derived_from: tosca.datatypes.Root + description: additional type diff --git a/catalog-model/src/test/resources/modelOperation/expected-additional_types-6.yaml b/catalog-model/src/test/resources/modelOperation/expected-additional_types-6.yaml new file mode 100644 index 0000000000..48362a9730 --- /dev/null +++ b/catalog-model/src/test/resources/modelOperation/expected-additional_types-6.yaml @@ -0,0 +1,5 @@ +tosca_definitions_version: tosca_simple_yaml_1_3 +description: Auto-generated file that contains package custom types or types added + after system installation. +data_types: { + } diff --git a/catalog-model/src/test/resources/modelOperation/original-additional_types-3.yaml b/catalog-model/src/test/resources/modelOperation/original-additional_types-3.yaml new file mode 100644 index 0000000000..98d44c4412 --- /dev/null +++ b/catalog-model/src/test/resources/modelOperation/original-additional_types-3.yaml @@ -0,0 +1,7 @@ +tosca_definitions_version: tosca_simple_yaml_1_3 +description: Auto-generated file that contains package custom types or types added + after system installation. +data_types: + tosca.datatypes.nfv.PreviouslyExistingType1: + derived_from: tosca.datatypes.Root + description: additional type diff --git a/catalog-ui/src/app/ng2/pages/type-workspace/type-workspace.component.html b/catalog-ui/src/app/ng2/pages/type-workspace/type-workspace.component.html index cdd8e41503..8986142fd9 100644 --- a/catalog-ui/src/app/ng2/pages/type-workspace/type-workspace.component.html +++ b/catalog-ui/src/app/ng2/pages/type-workspace/type-workspace.component.html @@ -20,7 +20,8 @@ --> <div class="sdc-workspace-container"> - <loader [display]="isLoading"></loader> + + <loader class="loader" [display]="isLoading"></loader> <div class="w-sdc-main-container"> <app-workspace-menu [menuHeader]="dataType.name" (onMenuUpdate)="onMenuUpdate($event)" @@ -33,7 +34,15 @@ </div> <div class="sdc-workspace-top-bar-buttons"> <button *ngIf="!isViewOnly" data-ng-disabled="!isValidForm || isDisableMode() || isLoading || unsavedChanges" (click)="createImportType()" class="tlv-btn outline green" data-tests-id="create/save">Create</button> - <span *ngIf="!isViewOnly" class="delimiter"></span> + + <span *ngIf="!dataType.normative && isViewOnly" + class="sprite-new delete-btn" + data-tests-id="delete" + sdc-smart-tooltip="Delete Type" + (click)="deleteDataType()" + [title]="'DELETE_LABEL' | translate"></span> + + <span class="delimiter"></span> <span class="sprite-new x-btn" (click)="goToBreadcrumbHome()" sdc-smart-tooltip="Close" [title]="'CLOSE_LABEL' | translate"></span> </div> </div> diff --git a/catalog-ui/src/app/ng2/pages/type-workspace/type-workspace.component.less b/catalog-ui/src/app/ng2/pages/type-workspace/type-workspace.component.less index a12642d271..91ac8d46ca 100644 --- a/catalog-ui/src/app/ng2/pages/type-workspace/type-workspace.component.less +++ b/catalog-ui/src/app/ng2/pages/type-workspace/type-workspace.component.less @@ -27,6 +27,12 @@ .sdc-workspace-container { .bg_p; + .loader { + z-index: 2; + display: flex; + position: relative; + } + .w-sdc-main-right-container { padding: 0; diff --git a/catalog-ui/src/app/ng2/pages/type-workspace/type-workspace.component.ts b/catalog-ui/src/app/ng2/pages/type-workspace/type-workspace.component.ts index e0f7ac77a0..11a11747ff 100644 --- a/catalog-ui/src/app/ng2/pages/type-workspace/type-workspace.component.ts +++ b/catalog-ui/src/app/ng2/pages/type-workspace/type-workspace.component.ts @@ -20,6 +20,7 @@ */ import {Component, Inject, Injector, OnInit} from '@angular/core'; +import {SdcMenuToken, IAppMenu} from "../../config/sdc-menu.config"; import {MenuItem, MenuItemGroup} from "../../../utils/menu-handler"; import {CacheService} from "../../services/cache.service"; import {DataTypeModel} from "../../../models/data-types"; @@ -29,7 +30,7 @@ import {TranslateService} from "../../shared/translator/translate.service"; import {HttpErrorResponse} from "@angular/common/http"; import {ServerErrorResponse} from "../../../models/server-error-response"; import {Observable} from "rxjs/Observable"; -import {SdcUiServices} from "onap-ui-angular/dist"; +import {SdcUiCommon, SdcUiComponents, SdcUiServices} from "onap-ui-angular/dist"; @Component({ selector: 'app-type-workspace', @@ -54,7 +55,9 @@ export class TypeWorkspaceComponent implements OnInit { private translateService: TranslateService, @Inject('$state') private $state: ng.ui.IStateService, @Inject('$stateParams') private stateParams, - private injector: Injector) { } + private injector: Injector, + private modalServiceSdcUI: SdcUiServices.ModalService, + @Inject(SdcMenuToken) public sdcMenu: IAppMenu) { } ngOnInit(): void { this.sdcVersion = this.cacheService.get('version'); @@ -115,6 +118,57 @@ export class TypeWorkspaceComponent implements OnInit { } } + private deleteDataType() { + const modalTitle: string = this.translateService.translate('DELETE_DATA_TYPE_TITLE_CONFIRMATION_TEXT'); + const modalMessage: string = this.translateService.translate('DELETE_DATA_TYPE_MESSAGE_CONFIRMATION_TEXT');; + const modalButton = { + testId: 'ok-button', + text: this.sdcMenu.alertMessages.okButton, + type: SdcUiCommon.ButtonType.warning, + callback: this.handleDeleteDataType(), + closeModal: true + } as SdcUiComponents.ModalButtonComponent; + this.modalServiceSdcUI.openWarningModal(modalTitle, modalMessage, 'alert-modal', [modalButton]); + } + + private handleDeleteDataType():Function { + return () => { + this.isLoading = true; + this.dataTypeService.deleteDataType(this.dataType.uniqueId).subscribe(()=> { + this.Notification.success({ + message: this.dataType.model + ' ' + this.dataType.name + ' ' + this.translateService.translate('DELETE_SUCCESS_MESSAGE_TEXT'), + title: this.translateService.translate("DELETE_SUCCESS_MESSAGE_TITLE") + }); + if (this.$state.params.previousState) { + switch (this.$state.params.previousState) { + case 'catalog': + case 'dashboard': + this.$state.go(this.$state.params.previousState); + break; + default: + this.$state.go('dashboard'); + break; + } + } + }, (error) => { + this.isLoading = false; + this.Notification.error({ + message: this.dataType.model + ' ' + this.dataType.name + ' ' + this.translateService.translate('DELETE_FAILURE_MESSAGE_TEXT'), + title: this.translateService.translate('DELETE_FAILURE_MESSAGE_TITLE') + }); + if (error instanceof HttpErrorResponse) { + const errorResponse: ServerErrorResponse = new ServerErrorResponse(error); + const modalService = this.injector.get(SdcUiServices.ModalService); + const errorDetails = { + 'Error Code': errorResponse.messageId, + 'Status Code': errorResponse.status + }; + modalService.openErrorDetailModal('Error', errorResponse.message, 'error-modal', errorDetails); + } + }); + } + } + private updateTypeBreadcrumb(): void { this.typeMenuItemGroup.updateSelectedMenuItemText(`Data Type: ${this.dataType.name}`); } diff --git a/catalog-ui/src/app/ng2/pages/type-workspace/type-workspace.module.ts b/catalog-ui/src/app/ng2/pages/type-workspace/type-workspace.module.ts index c517dd22c8..8cd3d89d6f 100644 --- a/catalog-ui/src/app/ng2/pages/type-workspace/type-workspace.module.ts +++ b/catalog-ui/src/app/ng2/pages/type-workspace/type-workspace.module.ts @@ -54,7 +54,7 @@ import {ConstraintsModule} from "../properties-assignment/constraints/constraint NgxDatatableModule, SvgIconModule, AutoCompleteModule, - ConstraintsModule + ConstraintsModule ], declarations: [ TypeWorkspaceComponent, diff --git a/catalog-ui/src/app/ng2/services/data-type.service.ts b/catalog-ui/src/app/ng2/services/data-type.service.ts index 636217fb68..d4af634cec 100644 --- a/catalog-ui/src/app/ng2/services/data-type.service.ts +++ b/catalog-ui/src/app/ng2/services/data-type.service.ts @@ -112,6 +112,15 @@ export class DataTypeService { }); } + public deleteDataType(dataTypeId: string): Observable<Object> { + const url = `${this.dataTypeUrl}/${dataTypeId}`; + let headers = new HttpHeaders({'USER_ID': this.authService.getLoggedinUser().userId}); + let options = {headers: headers}; + return this.httpClient.delete(url, options).map((res: Response) => { + return dataTypeId; + }); + } + public createImportedType(model: string, importingFile: File): Observable<any> { const url = `${this.dataTypeUploadUrl}/datatypesyaml`; const formData = new FormData(); diff --git a/catalog-ui/src/assets/languages/en_US.json b/catalog-ui/src/assets/languages/en_US.json index a98bf4c8c1..58288840d6 100644 --- a/catalog-ui/src/assets/languages/en_US.json +++ b/catalog-ui/src/assets/languages/en_US.json @@ -581,6 +581,7 @@ "CREATED_LABEL": "Created", "CREATE_LABEL": "Create", "CLOSE_LABEL": "Close", + "DELETE_LABEL": "Delete", "MODIFIED_LABEL": "Modified", "UNIQUE_ID_LABEL": "Unique Id", "=========== SERVICE IMPORT ===========": "", @@ -590,6 +591,9 @@ "IMPORT_DATA_TYPE_FAILURE_PROCESSING_MESSAGE_TEXT": "Import Failure - error importing data type", "IMPORT_DATA_TYPE_SUCCESS_MESSAGE_TEXT": "Successfully imported", "IMPORT_DATA_TYPE_TITLE_TEXT": "Import Data Type", + "=========== DATA TYPE DELETE ===========": "", + "DELETE_DATA_TYPE_TITLE_CONFIRMATION_TEXT": "Delete Data Type Confirmation", + "DELETE_DATA_TYPE_MESSAGE_CONFIRMATION_TEXT": "This data type should only be deleted if it is not in use in any resources or services. Are you sure you want to proceed?", "=========== PROPERTIES ===========": "", "PROPERTY_LIST_EMPTY_MESSAGE": "There are no properties to display", "PROPERTY_SHOWING_LABEL": "Showing Properties", |