ML- Added a radio button to enter new model table name (#10343)

This commit is contained in:
Leila Lali
2020-05-11 17:29:28 -07:00
committed by GitHub
parent 21e6ba92c2
commit 301ce1cf87
17 changed files with 231 additions and 94 deletions

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 187 KiB

View File

@@ -0,0 +1,14 @@
<svg width="100" height="100" viewBox="0 0 100 100" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M82 89.9991H18L12.824 70.7051H87.176L82 89.9991Z" fill="#198AB3"/>
<path d="M40.118 10V40.118L12.824 70.706L18 90L59.882 40.118V10H40.118Z" fill="url(#paint0_linear)"/>
<path d="M82 90.0006L52.824 59.8826L65.059 45.7656L87.176 70.7066L82 90.0006Z" fill="#32BEDD"/>
<defs>
<linearGradient id="paint0_linear" x1="12.824" y1="50" x2="59.976" y2="50" gradientUnits="userSpaceOnUse">
<stop stop-color="#50C7E8"/>
<stop offset="0.25" stop-color="#4CC3E4"/>
<stop offset="0.51" stop-color="#41B6DA"/>
<stop offset="0.77" stop-color="#2FA2C8"/>
<stop offset="1" stop-color="#1989B2"/>
</linearGradient>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 719 B

View File

@@ -0,0 +1,18 @@
<svg width="100" height="100" viewBox="0 0 100 100" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M54.768 11.1816H20.489C19.7681 11.1816 19.0768 11.468 18.5671 11.9777C18.0574 12.4874 17.771 13.1788 17.771 13.8996V87.3196C17.7713 88.0403 18.0577 88.7314 18.5674 89.2409C19.0771 89.7504 19.7683 90.0366 20.489 90.0366H79.511C79.8678 90.0368 80.2212 89.9666 80.5509 89.8301C80.8806 89.6936 81.1802 89.4935 81.4325 89.2411C81.6848 88.9888 81.8849 88.6893 82.0214 88.3596C82.1579 88.0298 82.2281 87.6765 82.228 87.3196V38.7386C82.2281 38.3818 82.158 38.0283 82.0215 37.6986C81.885 37.3688 81.6849 37.0692 81.4326 36.8168C81.1802 36.5644 80.8807 36.3642 80.551 36.2276C80.2213 36.091 79.8679 36.0206 79.511 36.0206H59.916C59.5654 36.0206 59.2183 35.9516 58.8944 35.8174C58.5705 35.6832 58.2762 35.4865 58.0284 35.2386C57.7805 34.9906 57.5839 34.6963 57.4499 34.3723C57.3158 34.0484 57.2469 33.7012 57.247 33.3506V13.8996C57.2608 13.2152 57.0113 12.5516 56.55 12.0458C56.0887 11.5401 55.4508 11.2307 54.768 11.1816Z" fill="white"/>
<path d="M53.29 14.6147V33.0647C53.29 34.86 54.0031 36.5819 55.2725 37.8515C56.5419 39.1211 58.2636 39.8344 60.059 39.8347H78.605V86.6047H21.4V14.6147H53.337H53.29ZM54.768 10.6097H20.06C19.3401 10.5985 18.6452 10.8733 18.1278 11.3739C17.6103 11.8744 17.3126 12.5599 17.3 13.2797V87.8917C17.2999 88.2486 17.37 88.602 17.5065 88.9318C17.643 89.2615 17.8431 89.5612 18.0954 89.8136C18.3477 90.066 18.6473 90.2662 18.977 90.4028C19.3067 90.5394 19.6601 90.6097 20.017 90.6097H79.94C80.2968 90.6162 80.6515 90.5523 80.9836 90.4216C81.3157 90.291 81.6189 90.0962 81.8757 89.8483C82.1325 89.6004 82.3379 89.3044 82.4802 88.977C82.6225 88.6497 82.6989 88.2976 82.705 87.9407V38.5477C82.7051 38.1908 82.6349 37.8374 82.4985 37.5076C82.362 37.1779 82.1619 36.8783 81.9096 36.6259C81.6572 36.3734 81.3577 36.1732 81.028 36.0366C80.6983 35.9 80.3449 35.8297 79.988 35.8297H60.059C59.3383 35.8294 58.6472 35.543 58.1377 35.0333C57.6282 34.5236 57.342 33.8324 57.342 33.1117V13.3277C57.343 12.6311 57.0765 11.9607 56.5975 11.455C56.1185 10.9492 55.4636 10.6466 54.768 10.6097Z" fill="url(#paint0_linear)"/>
<path d="M81.656 36.3066L56.388 11.1816V31.5396C56.3883 32.804 56.8907 34.0165 57.7849 34.9105C58.679 35.8044 59.8916 36.3066 61.156 36.3066H81.656Z" fill="#32BEDD"/>
<path d="M37.81 59.5107L49.023 48.2987C49.2742 48.0462 49.6154 47.9037 49.9716 47.9024C50.3277 47.901 50.6699 48.0411 50.923 48.2917L50.93 48.2987L62.191 59.5537C62.2781 59.6388 62.3377 59.748 62.362 59.8673C62.3864 59.9866 62.3743 60.1105 62.3275 60.2229C62.2806 60.3352 62.2011 60.431 62.0992 60.4976C61.9973 60.5643 61.8777 60.5988 61.756 60.5967H54.846C54.772 60.591 54.6976 60.5999 54.627 60.6229C54.5565 60.646 54.4911 60.6827 54.4348 60.731C54.3784 60.7793 54.3321 60.8382 54.2985 60.9044C54.2649 60.9706 54.2447 61.0427 54.239 61.1167C54.239 61.1317 54.239 61.1467 54.239 61.1617V75.2427C54.239 75.3695 54.1886 75.4911 54.099 75.5807C54.0094 75.6704 53.8878 75.7207 53.761 75.7207H46.2C46.0732 75.7207 45.9516 75.6704 45.862 75.5807C45.7724 75.4911 45.722 75.3695 45.722 75.2427V61.3357C45.7831 61.1989 45.7874 61.0434 45.734 60.9033C45.6805 60.7633 45.5737 60.6501 45.437 60.5887C45.4029 60.5736 45.3674 60.5619 45.331 60.5537H38.2C38.0822 60.5469 37.9689 60.506 37.874 60.4361C37.779 60.3661 37.7064 60.27 37.6649 60.1595C37.6235 60.0491 37.6151 59.9289 37.6407 59.8138C37.6662 59.6986 37.7247 59.5933 37.809 59.5107H37.81Z" fill="url(#paint1_linear)"/>
<defs>
<linearGradient id="paint0_linear" x1="50" y1="90.6097" x2="50" y2="10.6097" gradientUnits="userSpaceOnUse">
<stop offset="0.31" stop-color="#32BEDD"/>
<stop offset="0.688" stop-color="#47D7F5"/>
<stop offset="1" stop-color="#50E6FF"/>
</linearGradient>
<linearGradient id="paint1_linear" x1="37.6262" y1="2154.37" x2="1339.21" y2="1510.07" gradientUnits="userSpaceOnUse">
<stop offset="0.31" stop-color="#32BEDD"/>
<stop offset="0.688" stop-color="#47D7F5"/>
<stop offset="1" stop-color="#50E6FF"/>
</linearGradient>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 3.9 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 9.5 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 124 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 166 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 101 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 107 KiB

View File

@@ -124,6 +124,8 @@ export const extLangUpdateFailedError = localize('extLang.updateFailedError', "F
export const modelUpdateFailedError = localize('models.modelUpdateFailedError', "Failed to update the model");
export const databaseName = localize('databaseName', "Models database");
export const tableName = localize('tableName', "Models table");
export const existingTableName = localize('existingTableName', "Existing table");
export const newTableName = localize('newTableName', "New table");
export const modelName = localize('models.name', "Name");
export const modelFileName = localize('models.fileName', "File");
export const modelDescription = localize('models.description', "Description");
@@ -211,20 +213,20 @@ export const sqlMlDocTitle = localize('sqlMlDocTitle', "SQL machine learning doc
export const sqlMlDocDesc = localize('sqlMlDocDesc', "Learn how to use machine learning in SQL Server and SQL on Azure, to run Python and R scripts on relational data.");
export const sqlMlsDocTitle = localize('sqlMlsDocTitle', "SQL Server Machine Learning Services (Python and R)");
export const sqlMlsDocDesc = localize('sqlMlsDocDesc', "Get started with Machine Learning Services on SQL Server and how to install it on Windows and Linux.");
export const sqlMlsAzureDocTitle = localize('sqlMlsAzureDocTitle', "Machine Learning Services in Azure SQL Managed Instance (preview)");
export const sqlMlsAzureDocDesc = localize('sqlMlsAzureDocDesc', "Get started with Machine Learning Services in Azure SQL Managed Instances.");
export const sqlMlsMIDocTitle = localize('sqlMlsMIDocTitle', "Machine Learning Services in Azure SQL Managed Instance (preview)");
export const sqlMlsMIDocDesc = localize('sqlMlsMIDocDesc', "Get started with Machine Learning Services in Azure SQL Managed Instances.");
export const mlsInstallOdbcDocTitle = localize('mlsInstallObdcDocTitle', "Install the Microsoft ODBC driver for SQL Server");
export const mlsInstallOdbcDocDesc = localize('mlsInstallOdbcDocDesc', "This document explains how to install the Microsoft ODBC Driver for SQL Server.");
export const onnxOnEdgeOdbcDocTitle = localize('onnxOnEdgeOdbcDocTitle', "Machine learning and AI with ONNX in SQL Database Edge Preview");
export const onnxOnEdgeOdbcDocDesc = localize('onnxOnEdgeOdbcDocDesc', "Get started with machine learning in Azure SQL Database Edge");
// Links
//
export const mlsDocuments = 'https://docs.microsoft.com/sql/advanced-analytics/?view=sql-server-ver15';
export const odbcDriverWindowsDocuments = 'https://docs.microsoft.com/sql/connect/odbc/windows/microsoft-odbc-driver-for-sql-server-on-windows?view=sql-server-ver15';
export const odbcDriverLinuxDocuments = 'https://docs.microsoft.com/sql/connect/odbc/linux-mac/installing-the-microsoft-odbc-driver-for-sql-server?view=sql-server-ver15';
export const mlDocLink = 'https://docs.microsoft.com/sql/machine-learning/';
export const mlsDocLink = 'https://docs.microsoft.com/sql/machine-learning/what-is-sql-server-machine-learning';
export const mlsAzureDocLink = 'https://docs.microsoft.com/azure/sql-database/sql-database-managed-instance-machine-learning-services-overview';
export const installMlsWindowsDocs = 'https://docs.microsoft.com/sql/advanced-analytics/install/sql-machine-learning-services-windows-install?view=sql-server-ver15';
export const odbcDriverDocuments = 'https://go.microsoft.com/fwlink/?linkid=2129818';
export const mlDocLink = 'https://go.microsoft.com/fwlink/?linkid=2128671';
export const mlsDocLink = 'https://go.microsoft.com/fwlink/?linkid=2128672';
export const mlsAzureDocLink = 'https://go.microsoft.com/fwlink/?linkid=2128673';
export const onnxOnEdgeDocs = 'https://go.microsoft.com/fwlink/?linkid=2128882';
// CSS Styles
//

View File

@@ -3,7 +3,6 @@
* Licensed under the Source EULA. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
import * as vscode from 'vscode';
import * as azdata from 'azdata';
import { QueryRunner } from '../common/queryRunner';
import * as constants from '../common/constants';
@@ -22,13 +21,6 @@ export class PackageManagementService {
) {
}
/**
* Opens server config documents
*/
public async openDocuments(): Promise<boolean> {
return await this._apiWrapper.openExternal(vscode.Uri.parse(constants.mlsDocuments));
}
/**
* Returns true if mls is installed in the give SQL server instance
*/

View File

@@ -177,7 +177,7 @@ AS (
)
SELECT
${this.getPredictColumnNames(columns, 'predict_input')}, ${this.getPredictInputColumnNames(outputColumns, 'p')}
FROM PREDICT(MODEL = @model, DATA = predict_input)
FROM PREDICT(MODEL = @model, DATA = predict_input, runtime=onnx)
WITH (
${this.getOutputParameters(outputColumns)}
) AS p
@@ -198,7 +198,7 @@ AS (
)
SELECT
${this.getPredictColumnNames(columns, 'predict_input')}, ${this.getOutputColumnNames(outputColumns, 'p')}
FROM PREDICT(MODEL = ${modelBytes}, DATA = predict_input)
FROM PREDICT(MODEL = ${modelBytes}, DATA = predict_input, runtime=onnx)
WITH (
${this.getOutputParameters(outputColumns)}
) AS p

View File

@@ -24,13 +24,6 @@ function createContext(): TestContext {
}
describe('Package Management Service', () => {
it('openDocuments should open document in browser successfully', async function (): Promise<void> {
const context = createContext();
context.apiWrapper.setup(x => x.openExternal(TypeMoq.It.isAny())).returns(() => Promise.resolve(true));
let serverConfigManager = new PackageManagementService(context.apiWrapper.object, context.queryRunner.object);
should.equal(await serverConfigManager.openDocuments(), true);
});
it('isMachineLearningServiceEnabled should return true if external script is enabled', async function (): Promise<void> {
const context = createContext();
context.queryRunner.setup(x => x.isMachineLearningServiceEnabled(TypeMoq.It.isAny())).returns(() => Promise.resolve(true));

View File

@@ -115,6 +115,10 @@ export function createViewContext(): ViewTestContext {
onCardSelectedChanged: onClick.event
});
let group: () => azdata.GroupContainer = () => Object.assign({}, componentBase, container, {
collapsed: false,
});
let declarativeTableBuilder: azdata.ComponentBuilder<azdata.DeclarativeTableComponent> = {
component: () => declarativeTable(),
withProperties: () => declarativeTableBuilder,
@@ -172,6 +176,15 @@ export function createViewContext(): ViewTestContext {
withProperties: () => cardBuilder,
withValidation: () => cardBuilder
};
let groupBuilder: azdata.GroupBuilder = {
component: () => {
return group();
},
withProperties: () => groupBuilder,
withValidation: () => groupBuilder,
withItems: () => groupBuilder,
withLayout: () => groupBuilder
};
let imageBuilder: azdata.ComponentBuilder<azdata.ImageComponent> = {
component: () => {
@@ -223,7 +236,7 @@ export function createViewContext(): ViewTestContext {
dashboardWidget: undefined!,
dashboardWebview: undefined!,
formContainer: () => formBuilder,
groupContainer: undefined!,
groupContainer: () => groupBuilder,
toolbarContainer: undefined!,
loadingComponent: () => loadingBuilder,
fileBrowserTree: undefined!,

View File

@@ -62,9 +62,13 @@ export class LocalModelsComponent extends ModelViewBase implements IDataComponen
.withLayout({
flexFlow: 'row',
justifyContent: 'space-between',
width: this.componentMaxLength + 200
width: this.componentMaxLength
}).withItems([
this._localPath, this._localBrowse]
this._localPath, this._localBrowse], {
CSSStyles: {
'padding-right': '5px'
}
}
).component();
this._form = modelBuilder.formContainer().withFormItems([{

View File

@@ -40,6 +40,7 @@ export class ModelSourcesComponent extends ModelViewBase implements IDataCompone
label: constants.localModelSource,
selected: this._sourceType === ModelSourceType.Local,
cardType: azdata.CardType.VerticalButton,
iconPath: { light: this.asAbsolutePath('images/fileUpload.svg'), dark: this.asAbsolutePath('images/fileUpload.svg') },
width: 50
}).component();
this._amlModel = modelBuilder.card()
@@ -49,6 +50,7 @@ export class ModelSourcesComponent extends ModelViewBase implements IDataCompone
label: constants.azureModelSource,
selected: this._sourceType === ModelSourceType.Azure,
cardType: azdata.CardType.VerticalButton,
iconPath: { light: this.asAbsolutePath('images/aml.svg'), dark: this.asAbsolutePath('images/aml.svg') },
width: 50
}).component();
@@ -59,6 +61,7 @@ export class ModelSourcesComponent extends ModelViewBase implements IDataCompone
label: constants.registeredModelsSource,
selected: this._sourceType === ModelSourceType.RegisteredModels,
cardType: azdata.CardType.VerticalButton,
iconPath: { light: this.asAbsolutePath('images/imported.svg'), dark: this.asAbsolutePath('images/imported.svg') },
width: 50
}).component();

View File

@@ -29,6 +29,7 @@ export class TableSelectionComponent extends ModelViewBase implements IDataCompo
private _dbTableComponent: azdata.FlexContainer | undefined;
private tableMaxLength = this.componentMaxLength * 2 + 70;
private _onSelectedChanged: vscode.EventEmitter<void> = new vscode.EventEmitter<void>();
private _existingTablesSelected: boolean = true;
public readonly onSelectedChanged: vscode.Event<void> = this._onSelectedChanged.event;
/**
@@ -45,24 +46,66 @@ export class TableSelectionComponent extends ModelViewBase implements IDataCompo
public registerComponent(modelBuilder: azdata.ModelBuilder, databaseTitle: string, tableTitle: string): azdata.Component {
this._databases = modelBuilder.dropDown().withProperties({
width: this.componentMaxLength,
editable: this._settings.editable,
fireOnTextChange: this._settings.editable
}).component();
this._tables = modelBuilder.dropDown().withProperties({
width: this.componentMaxLength,
editable: this._settings.editable,
fireOnTextChange: this._settings.editable
width: this.componentMaxLength - 10,
}).component();
this._databases.onValueChanged(async () => {
await this.onDatabaseSelected();
});
const existingTableButton = modelBuilder.radioButton().withProperties({
name: 'tableName',
value: 'existing',
label: 'Existing table',
checked: true
}).component();
const newTableButton = modelBuilder.radioButton().withProperties({
name: 'tableName',
value: 'new',
label: 'New table',
checked: false
}).component();
const newTableName = modelBuilder.inputBox().withProperties({
width: this.componentMaxLength - 10,
enabled: false
}).component();
const group = modelBuilder.groupContainer().withItems([
existingTableButton,
this._tables,
newTableButton,
newTableName
], {
CSSStyles: {
'padding-top': '5px'
}
}).component();
existingTableButton.onDidClick(() => {
if (this._tables) {
this._tables.enabled = existingTableButton.checked;
}
newTableName.enabled = !existingTableButton.checked;
this._existingTablesSelected = existingTableButton.checked || false;
});
newTableButton.onDidClick(() => {
if (this._tables) {
this._tables.enabled = !newTableButton.checked;
}
newTableName.enabled = newTableButton.checked;
this._existingTablesSelected = existingTableButton.checked || false;
});
newTableName.onTextChanged(async () => {
this._selectedTableName = newTableName.value || '';
await this.onTableSelected();
});
this._tables.onValueChanged(async (value) => {
// There's an issue with dropdown doesn't set the value in editable mode. this is the workaround
if (this._tables && value) {
this._selectedTableName = this._settings.editable ? value : value.selected;
this._selectedTableName = value.selected;
}
await this.onTableSelected();
});
@@ -73,22 +116,32 @@ export class TableSelectionComponent extends ModelViewBase implements IDataCompo
}], { info: databaseTitle }).withLayout({
padding: '0px'
}).component();
const tableForm = modelBuilder.formContainer().withFormItems([{
title: tableTitle,
component: this._tables
}], { info: tableTitle }).withLayout({
padding: '0px'
}).component();
const tableForm = modelBuilder.formContainer();
if (this._settings.editable) {
tableForm.addFormItem({
title: tableTitle,
component: group
}, { info: tableTitle });
} else {
tableForm.addFormItem({
title: tableTitle,
component: this._tables
}, { info: tableTitle });
}
this._dbTableComponent = modelBuilder.flexContainer().withItems([
databaseForm,
tableForm
tableForm.withLayout({
padding: '0px'
}).component()
], {
flex: '0 0 auto',
CSSStyles: {
'align-items': 'flex-start'
}
}).withLayout({
flexFlow: 'row',
flexFlow: this._settings.editable ? 'column' : 'row',
justifyContent: 'space-between',
width: this.tableMaxLength
}).component();
@@ -163,31 +216,33 @@ export class TableSelectionComponent extends ModelViewBase implements IDataCompo
}
private async onDatabaseSelected(): Promise<void> {
this._tableNames = await this.listTableNames(this.databaseName || '');
let tableNames = this._tableNames;
if (this._existingTablesSelected) {
this._tableNames = await this.listTableNames(this.databaseName || '');
let tableNames = this._tableNames;
if (this._tableNames && !this._settings.preSelected && !this._tableNames.find(x => x.tableName === constants.selectTableTitle)) {
const firstRow: DatabaseTable = { tableName: constants.selectTableTitle, databaseName: '', schema: '' };
tableNames = [firstRow].concat(this._tableNames);
}
if (this._tables && tableNames && tableNames.length > 0) {
this._tables.values = tableNames.map(t => this.getTableFullName(t));
if (this.importTable) {
const selectedTable = tableNames.find(t => t.tableName === this.importTable?.tableName && t.schema === this.importTable?.schema);
if (selectedTable) {
this._selectedTableName = this.getTableFullName(selectedTable);
this._tables.value = this.getTableFullName(selectedTable);
} else {
this._selectedTableName = this._settings.editable ? this.getTableFullName(this.importTable) : this.getTableFullName(tableNames[0]);
}
} else {
this._selectedTableName = this.getTableFullName(tableNames[0]);
if (this._tableNames && !this._settings.preSelected && !this._tableNames.find(x => x.tableName === constants.selectTableTitle)) {
const firstRow: DatabaseTable = { tableName: constants.selectTableTitle, databaseName: '', schema: '' };
tableNames = [firstRow].concat(this._tableNames);
}
if (this._tables && tableNames && tableNames.length > 0) {
this._tables.values = tableNames.map(t => this.getTableFullName(t));
if (this.importTable) {
const selectedTable = tableNames.find(t => t.tableName === this.importTable?.tableName && t.schema === this.importTable?.schema);
if (selectedTable) {
this._selectedTableName = this.getTableFullName(selectedTable);
this._tables.value = this.getTableFullName(selectedTable);
} else {
this._selectedTableName = this._settings.editable ? this.getTableFullName(this.importTable) : this.getTableFullName(tableNames[0]);
}
} else {
this._selectedTableName = this.getTableFullName(tableNames[0]);
}
this._tables.value = this._selectedTableName;
} else if (this._tables) {
this._tables.values = [];
this._tables.value = '';
}
this._tables.value = this._selectedTableName;
} else if (this._tables) {
this._tables.values = [];
this._tables.value = '';
}
await this.onTableSelected();
}

View File

@@ -8,7 +8,6 @@ import * as vscode from 'vscode';
import { ApiWrapper } from '../../common/apiWrapper';
import * as path from 'path';
import * as constants from '../../common/constants';
import * as utils from '../../common/utils';
import { PredictService } from '../../prediction/predictService';
interface IActionMetadata {
@@ -182,12 +181,12 @@ export class DashboardWidget {
});
const videosContainer = this.createVideoLinkContainers(view, [
{
iconPath: { light: 'images/video1.svg', dark: 'images/video1.svg' },
iconPath: { light: 'images/aiMlSqlServer.svg', dark: 'images/aiMlSqlServer.svg' },
description: 'Artificial intelligence and machine learning with SQL Server 2019',
link: 'https://www.youtube.com/watch?v=sE99cSoFOHs'
},
{
iconPath: { light: 'images/video2.svg', dark: 'images/video2.svg' },
iconPath: { light: 'images/sqlServerMl.svg', dark: 'images/sqlServerMl.svg' },
description: 'SQL Server Machine Learning Services',
link: 'https://www.youtube.com/watch?v=R4GCBoxADyQ'
}
@@ -199,7 +198,7 @@ export class DashboardWidget {
const moreVideosContainer = this.createVideoLinkContainers(view, [
{
iconPath: { light: 'images/video2.svg', dark: 'images/video2.svg' },
iconPath: { light: 'images/notebooksIntro.svg', dark: 'images/notebooksIntro.svg' },
description: 'Introduction to Azure Data Studio Notebooks',
link: 'https://www.youtube.com/watch?v=Nt4kIHQ0IOc'
}
@@ -316,7 +315,7 @@ export class DashboardWidget {
'background-position': 'top',
'width': `${maxWidth}px`,
'height': '110px',
'background-size': `{maxWidth}px 120px`
'background-size': `${maxWidth}px 120px`
}
});
videosContainer.addItem(descriptionComponent);
@@ -349,15 +348,15 @@ export class DashboardWidget {
link: constants.mlsDocLink
},
{
title: constants.sqlMlsAzureDocTitle,
description: constants.sqlMlsAzureDocDesc,
link: constants.mlsAzureDocLink
title: constants.onnxOnEdgeOdbcDocTitle,
description: constants.onnxOnEdgeOdbcDocDesc,
link: constants.onnxOnEdgeDocs
}];
const moreLink = {
title: constants.mlsInstallOdbcDocTitle,
description: constants.mlsInstallOdbcDocDesc,
link: utils.isWindows() ? constants.odbcDriverWindowsDocuments : constants.odbcDriverLinuxDocuments
link: constants.odbcDriverDocuments
};
const styles = {
'padding': '10px'
@@ -499,7 +498,7 @@ export class DashboardWidget {
}
private createTaskButton(view: azdata.ModelView, taskMetaData: IActionMetadata): azdata.Component {
const maxHeight = 106;
const maxHeight = 116;
const maxWidth = 250;
const mainContainer = view.modelBuilder.divContainer().withLayout({
width: maxWidth,