Support delete non-normative data types 71/133371/3
authorJvD_Ericsson <jeff.van.dam@est.tech>
Tue, 21 Feb 2023 14:07:50 +0000 (14:07 +0000)
committerMichael Morris <michael.morris@est.tech>
Wed, 22 Feb 2023 14:16:42 +0000 (14:16 +0000)
Issue-ID: SDC-4411
Signed-off-by: JvD_Ericsson <jeff.van.dam@est.tech>
Change-Id: I246e50d848a17178369bfb643989d5447a887017

13 files changed:
catalog-be/src/main/java/org/openecomp/sdc/be/servlets/DataTypeServlet.java
catalog-model/src/main/java/org/openecomp/sdc/be/model/operations/impl/DataTypeOperation.java
catalog-model/src/main/java/org/openecomp/sdc/be/model/operations/impl/ModelOperation.java
catalog-model/src/test/java/org/openecomp/sdc/be/model/operations/impl/ModelOperationTest.java
catalog-model/src/test/resources/modelOperation/expected-additional_types-5.yaml [new file with mode: 0644]
catalog-model/src/test/resources/modelOperation/expected-additional_types-6.yaml [new file with mode: 0644]
catalog-model/src/test/resources/modelOperation/original-additional_types-3.yaml [new file with mode: 0644]
catalog-ui/src/app/ng2/pages/type-workspace/type-workspace.component.html
catalog-ui/src/app/ng2/pages/type-workspace/type-workspace.component.less
catalog-ui/src/app/ng2/pages/type-workspace/type-workspace.component.ts
catalog-ui/src/app/ng2/pages/type-workspace/type-workspace.module.ts
catalog-ui/src/app/ng2/services/data-type.service.ts
catalog-ui/src/assets/languages/en_US.json

index 3a62600..404c045 100644 (file)
@@ -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];
index f79f150..b8ddff9 100644 (file)
@@ -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);
     }
-
 }
index 1928941..b57c57a 100644 (file)
@@ -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) {
index 1bd4d9d..c68ed71 100644 (file)
@@ -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 (file)
index 0000000..2fe94dc
--- /dev/null
@@ -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 (file)
index 0000000..48362a9
--- /dev/null
@@ -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 (file)
index 0000000..98d44c4
--- /dev/null
@@ -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
index cdd8e41..8986142 100644 (file)
@@ -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)"
         </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>
index a12642d..91ac8d4 100644 (file)
 .sdc-workspace-container {
     .bg_p;
 
+    .loader {
+        z-index: 2;
+        display: flex;
+        position: relative;
+    }
+
     .w-sdc-main-right-container {
 
         padding: 0;
index e0f7ac7..11a1174 100644 (file)
@@ -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}`);
   }
index c517dd2..8cd3d89 100644 (file)
@@ -54,7 +54,7 @@ import {ConstraintsModule} from "../properties-assignment/constraints/constraint
         NgxDatatableModule,
         SvgIconModule,
         AutoCompleteModule,
-       ConstraintsModule
+        ConstraintsModule
     ],
     declarations: [
         TypeWorkspaceComponent,
index 636217f..d4af634 100644 (file)
@@ -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();
index a98bf4c..5828884 100644 (file)
   "CREATED_LABEL": "Created",
   "CREATE_LABEL": "Create",
   "CLOSE_LABEL": "Close",
+  "DELETE_LABEL": "Delete",
   "MODIFIED_LABEL": "Modified",
   "UNIQUE_ID_LABEL": "Unique Id",
   "=========== SERVICE IMPORT ===========": "",
   "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",