From 2820fb4f15f344e47ecf7a433df589db3fb1a96d Mon Sep 17 00:00:00 2001 From: Leila Lali Date: Thu, 8 Oct 2020 16:46:26 -0700 Subject: [PATCH] Fixed a bug with deleting models from list in import model wizard (#12798) --- .../machine-learning/src/common/constants.ts | 1 + .../views/models/modelDetailsPage.test.ts | 90 +++++++++++++++++++ .../src/views/models/modelDetailsPage.ts | 6 +- .../models/modelsDetailsTableComponent.ts | 7 +- 4 files changed, 101 insertions(+), 3 deletions(-) create mode 100644 extensions/machine-learning/src/test/views/models/modelDetailsPage.test.ts diff --git a/extensions/machine-learning/src/common/constants.ts b/extensions/machine-learning/src/common/constants.ts index 7af943d5a5..061d115d0f 100644 --- a/extensions/machine-learning/src/common/constants.ts +++ b/extensions/machine-learning/src/common/constants.ts @@ -213,6 +213,7 @@ export const invalidModelImportTargetError = localize('models.invalidModelImport export const columnDataTypeMismatchWarning = localize('models.columnDataTypeMismatchWarning', "The data type of the source table column does not match the required input field’s type."); export const outputColumnDataTypeNotSupportedWarning = localize('models.outputColumnDataTypeNotSupportedWarning', "The data type of output column does not match the output field’s type."); export const modelNameRequiredError = localize('models.modelNameRequiredError', "Model name is required."); +export const modelsRequiredError = localize('models.modelsRequiredError', "Please select at least one model to import."); export const updateModelFailedError = localize('models.updateModelFailedError', "Failed to update the model"); export const modelSchemaIsAcceptedMessage = localize('models.modelSchemaIsAcceptedMessage', "Table meets requirements!"); export const selectModelsTableMessage = localize('models.selectModelsTableMessage', "Select models table"); diff --git a/extensions/machine-learning/src/test/views/models/modelDetailsPage.test.ts b/extensions/machine-learning/src/test/views/models/modelDetailsPage.test.ts new file mode 100644 index 0000000000..3a659b3a7f --- /dev/null +++ b/extensions/machine-learning/src/test/views/models/modelDetailsPage.test.ts @@ -0,0 +1,90 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the Source EULA. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import * as should from 'should'; +import 'mocha'; +import { createContext, ParentDialog } from './utils'; +import { ModelDetailsPage } from '../../../views/models/modelDetailsPage'; + +describe('Model Details Page', () => { + it('Should create view components successfully ', async function (): Promise { + let testContext = createContext(); + let parent = new ParentDialog(testContext.apiWrapper.object); + + let view = new ModelDetailsPage(testContext.apiWrapper.object, parent); + view.registerComponent(testContext.view.modelBuilder); + should.notEqual(view.component, undefined); + }); + + it('Should load data successfully ', async function (): Promise { + let testContext = createContext(); + let parent = new ParentDialog(testContext.apiWrapper.object); + + let view = new ModelDetailsPage(testContext.apiWrapper.object, parent); + view.modelsViewData = [ + { + modelData: 'motel1' + } + ]; + view.registerComponent(testContext.view.modelBuilder); + + await view.refresh(); + should.notEqual(view.data, undefined); + should.equal(view.data?.length, 1); + }); + + it('Should not validate the page if not model is selected ', async function (): Promise { + let testContext = createContext(); + let parent = new ParentDialog(testContext.apiWrapper.object); + + let view = new ModelDetailsPage(testContext.apiWrapper.object, parent); + view.modelsViewData = [ + ]; + view.registerComponent(testContext.view.modelBuilder); + + await view.refresh(); + await should(view.validate()).be.resolvedWith(false); + }); + + it('Should not validate the page if model does not have name', async function (): Promise { + let testContext = createContext(); + let parent = new ParentDialog(testContext.apiWrapper.object); + + let view = new ModelDetailsPage(testContext.apiWrapper.object, parent); + view.modelsViewData = [ + { + modelData: 'motel1', + modelDetails: { + modelName: '' + } + } + ]; + + view.registerComponent(testContext.view.modelBuilder); + + await view.refresh(); + await should(view.validate()).be.resolvedWith(false); + }); + + it('Should validate the page if model is valid', async function (): Promise { + let testContext = createContext(); + let parent = new ParentDialog(testContext.apiWrapper.object); + + let view = new ModelDetailsPage(testContext.apiWrapper.object, parent); + view.modelsViewData = [ + { + modelData: 'motel1', + modelDetails: { + modelName: 'name' + } + } + ]; + + view.registerComponent(testContext.view.modelBuilder); + + await view.refresh(); + await should(view.validate()).be.resolvedWith(true); + }); +}); diff --git a/extensions/machine-learning/src/views/models/modelDetailsPage.ts b/extensions/machine-learning/src/views/models/modelDetailsPage.ts index 4efcc6fac4..30e2f7eec9 100644 --- a/extensions/machine-learning/src/views/models/modelDetailsPage.ts +++ b/extensions/machine-learning/src/views/models/modelDetailsPage.ts @@ -73,7 +73,11 @@ export class ModelDetailsPage extends ModelViewBase implements IPageView, IDataC } public validate(): Promise { - if (this.data && this.data.length > 0 && !this.data.find(x => !x.modelDetails?.modelName)) { + if (!this.data || this.data.length === 0) { + this.showErrorMessage(constants.modelsRequiredError); + return Promise.resolve(false); + } + else if (this.data && this.data.length > 0 && !this.data.find(x => !x.modelDetails?.modelName)) { return Promise.resolve(true); } else { this.showErrorMessage(constants.modelNameRequiredError); diff --git a/extensions/machine-learning/src/views/models/modelsDetailsTableComponent.ts b/extensions/machine-learning/src/views/models/modelsDetailsTableComponent.ts index 8bc3a318f2..0e785d8546 100644 --- a/extensions/machine-learning/src/views/models/modelsDetailsTableComponent.ts +++ b/extensions/machine-learning/src/views/models/modelsDetailsTableComponent.ts @@ -31,7 +31,7 @@ export class ModelsDetailsTableComponent extends ModelViewBase implements IDataC .withProperties( { columns: [ - { // Name + { // File Name displayName: constants.modelFileName, ariaLabel: constants.modelFileName, valueType: azdata.DeclarativeDataType.string, @@ -57,7 +57,7 @@ export class ModelsDetailsTableComponent extends ModelViewBase implements IDataC ...constants.cssStyles.tableRow }, }, - { // Created + { // Description displayName: constants.modelDescription, ariaLabel: constants.modelDescription, valueType: azdata.DeclarativeDataType.component, @@ -121,6 +121,9 @@ export class ModelsDetailsTableComponent extends ModelViewBase implements IDataC let tableData: any[][] = []; tableData = tableData.concat(models.map(model => this.createTableRow(model))); this._table.data = tableData; + if (tableData.length === 0) { + this._table.dataValues = tableData; + } } }