mirror of
https://github.com/ckaczor/azuredatastudio.git
synced 2026-02-17 02:51:36 -05:00
ADS Migration UI Fixes (#15011)
* wip database count * wip * added warnings count * changed warnings to issue details when DB selected * updated selected dbs * issues -> issue * fix issues/warnings
This commit is contained in:
@@ -341,7 +341,6 @@ export const SERVER = localize('sql.migration.server', "Server");
|
|||||||
export const USERNAME = localize('sql.migration.username', "Username");
|
export const USERNAME = localize('sql.migration.username', "Username");
|
||||||
|
|
||||||
//Assessment Dialog
|
//Assessment Dialog
|
||||||
export const DATABASES = localize('sql.migration.databases', "Databases");
|
|
||||||
export const ISSUES = localize('sql.migration.issues', "Issues");
|
export const ISSUES = localize('sql.migration.issues', "Issues");
|
||||||
export const SEARCH = localize('sql.migration.search', "Search");
|
export const SEARCH = localize('sql.migration.search', "Search");
|
||||||
export const INSTANCE = localize('sql.migration.instance', "Instance");
|
export const INSTANCE = localize('sql.migration.instance', "Instance");
|
||||||
@@ -355,6 +354,7 @@ export const RECOMMENDATION = localize('sql.migration.recommendation', "Recommen
|
|||||||
export const MORE_INFO = localize('sql.migration.more.info', "More Info");
|
export const MORE_INFO = localize('sql.migration.more.info', "More Info");
|
||||||
export const TARGET_PLATFORM = localize('sql.migration.target.platform', "Target Platform");
|
export const TARGET_PLATFORM = localize('sql.migration.target.platform', "Target Platform");
|
||||||
export const WARNINGS_DETAILS = localize('sql.migration.warnings.details', "Warnings Details");
|
export const WARNINGS_DETAILS = localize('sql.migration.warnings.details', "Warnings Details");
|
||||||
|
export const ISSUES_DETAILS = localize('sql.migration.issues.details', "Issue Details");
|
||||||
export const SELECT_DB_PROMPT = localize('sql.migration.select.prompt', "Click on SQL Server Instance or any of the databases on the left to view its details.");
|
export const SELECT_DB_PROMPT = localize('sql.migration.select.prompt', "Click on SQL Server Instance or any of the databases on the left to view its details.");
|
||||||
export function IMPACT_OBJECT_TYPE(objectType: string): string {
|
export function IMPACT_OBJECT_TYPE(objectType: string): string {
|
||||||
return localize('sql.migration.impact.object.type', "Type: {0}", objectType);
|
return localize('sql.migration.impact.object.type', "Type: {0}", objectType);
|
||||||
@@ -362,6 +362,15 @@ export function IMPACT_OBJECT_TYPE(objectType: string): string {
|
|||||||
export function IMPACT_OBJECT_NAME(objectName: string): string {
|
export function IMPACT_OBJECT_NAME(objectName: string): string {
|
||||||
return localize('sql.migration.impact.object.name', "Name: {0}", objectName);
|
return localize('sql.migration.impact.object.name', "Name: {0}", objectName);
|
||||||
}
|
}
|
||||||
|
export function DATABASES(selectedCount: number, totalCount: number): string {
|
||||||
|
return localize('sql.migration.databases', "Databases ({0}/{1})", selectedCount, totalCount);
|
||||||
|
}
|
||||||
|
export function ISSUES_COUNT(totalCount: number): string {
|
||||||
|
return localize('sql.migration.issues.count', "Issues ({0})", totalCount);
|
||||||
|
}
|
||||||
|
export function WARNINGS_COUNT(totalCount: number): string {
|
||||||
|
return localize('sql.migration.warnings.count', "Warnings ({0})", totalCount);
|
||||||
|
}
|
||||||
export const AUTHENTICATION_TYPE = localize('sql.migration.authentication.type', "Authentication Type");
|
export const AUTHENTICATION_TYPE = localize('sql.migration.authentication.type', "Authentication Type");
|
||||||
export const SQL_LOGIN = localize('sql.migration.sql.login', "SQL Login");
|
export const SQL_LOGIN = localize('sql.migration.sql.login', "SQL Login");
|
||||||
export const WINDOWS_AUTHENTICATION = localize('sql.migration.windows.auth', "Windows Authentication");
|
export const WINDOWS_AUTHENTICATION = localize('sql.migration.windows.auth', "Windows Authentication");
|
||||||
|
|||||||
@@ -54,6 +54,7 @@ export class SqlDatabaseTree {
|
|||||||
private _recommendation!: azdata.TextComponent;
|
private _recommendation!: azdata.TextComponent;
|
||||||
private _dbName!: azdata.TextComponent;
|
private _dbName!: azdata.TextComponent;
|
||||||
private _recommendationText!: azdata.TextComponent;
|
private _recommendationText!: azdata.TextComponent;
|
||||||
|
private _recommendationTitle!: azdata.TextComponent;
|
||||||
private _descriptionText!: azdata.TextComponent;
|
private _descriptionText!: azdata.TextComponent;
|
||||||
private _impactedObjects!: SqlMigrationImpactedObjectInfo[];
|
private _impactedObjects!: SqlMigrationImpactedObjectInfo[];
|
||||||
private _objectDetailsType!: azdata.TextComponent;
|
private _objectDetailsType!: azdata.TextComponent;
|
||||||
@@ -61,6 +62,7 @@ export class SqlDatabaseTree {
|
|||||||
private _objectDetailsSample!: azdata.TextComponent;
|
private _objectDetailsSample!: azdata.TextComponent;
|
||||||
private _moreInfo!: azdata.HyperlinkComponent;
|
private _moreInfo!: azdata.HyperlinkComponent;
|
||||||
private _assessmentTitle!: azdata.TextComponent;
|
private _assessmentTitle!: azdata.TextComponent;
|
||||||
|
private _databaseTableValues!: azdata.DeclarativeTableCellValue[][];
|
||||||
|
|
||||||
private _activeIssues!: SqlMigrationAssessmentResultItem[];
|
private _activeIssues!: SqlMigrationAssessmentResultItem[];
|
||||||
private _selectedIssue!: SqlMigrationAssessmentResultItem;
|
private _selectedIssue!: SqlMigrationAssessmentResultItem;
|
||||||
@@ -68,6 +70,7 @@ export class SqlDatabaseTree {
|
|||||||
|
|
||||||
private _serverName!: string;
|
private _serverName!: string;
|
||||||
private _dbNames!: string[];
|
private _dbNames!: string[];
|
||||||
|
private _databaseCount!: azdata.TextComponent;
|
||||||
|
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
@@ -107,10 +110,23 @@ export class SqlDatabaseTree {
|
|||||||
|
|
||||||
component.addItem(this.createSearchComponent(), { flex: '0 0 auto' });
|
component.addItem(this.createSearchComponent(), { flex: '0 0 auto' });
|
||||||
component.addItem(this.createInstanceComponent(), { flex: '0 0 auto' });
|
component.addItem(this.createInstanceComponent(), { flex: '0 0 auto' });
|
||||||
|
component.addItem(this.createDatabaseCount(), { flex: '0 0 auto' });
|
||||||
component.addItem(this.createDatabaseComponent(dbs), { flex: '1 1 auto', CSSStyles: { 'overflow-y': 'auto' } });
|
component.addItem(this.createDatabaseComponent(dbs), { flex: '1 1 auto', CSSStyles: { 'overflow-y': 'auto' } });
|
||||||
return component;
|
return component;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private createDatabaseCount(): azdata.TextComponent {
|
||||||
|
this._databaseCount = this._view.modelBuilder.text().withProps({
|
||||||
|
CSSStyles: {
|
||||||
|
'font-size': '11px',
|
||||||
|
'font-weight': 'bold',
|
||||||
|
'margin': '0px 8px 0px 36px'
|
||||||
|
},
|
||||||
|
value: constants.DATABASES(this.selectedDbs.length, this._model._serverDatabases.length)
|
||||||
|
}).component();
|
||||||
|
return this._databaseCount;
|
||||||
|
}
|
||||||
|
|
||||||
private createDatabaseComponent(dbs: string[]): azdata.DivContainer {
|
private createDatabaseComponent(dbs: string[]): azdata.DivContainer {
|
||||||
|
|
||||||
this._databaseTable = this._view.modelBuilder.declarativeTable().withProps(
|
this._databaseTable = this._view.modelBuilder.declarativeTable().withProps(
|
||||||
@@ -130,7 +146,7 @@ export class SqlDatabaseTree {
|
|||||||
headerCssStyles: headerLeft,
|
headerCssStyles: headerLeft,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
displayName: constants.DATABASES,
|
displayName: constants.DATABASE,
|
||||||
valueType: azdata.DeclarativeDataType.component,
|
valueType: azdata.DeclarativeDataType.component,
|
||||||
width: 100,
|
width: 100,
|
||||||
isReadOnly: true,
|
isReadOnly: true,
|
||||||
@@ -146,12 +162,19 @@ export class SqlDatabaseTree {
|
|||||||
]
|
]
|
||||||
}
|
}
|
||||||
).component();
|
).component();
|
||||||
|
this._databaseTable.onDataChanged(() => {
|
||||||
|
this._databaseCount.updateProperties({
|
||||||
|
'value': constants.DATABASES(this.selectedDbs().length, this._model._serverDatabases.length)
|
||||||
|
});
|
||||||
|
});
|
||||||
this._databaseTable.onRowSelected(({ row }) => {
|
this._databaseTable.onRowSelected(({ row }) => {
|
||||||
|
|
||||||
this._databaseTable.focus();
|
this._databaseTable.focus();
|
||||||
this._activeIssues = this._model._assessmentResults?.databaseAssessments[row].issues;
|
this._activeIssues = this._model._assessmentResults?.databaseAssessments[row].issues;
|
||||||
this._selectedIssue = this._model._assessmentResults?.databaseAssessments[row].issues[0];
|
this._selectedIssue = this._model._assessmentResults?.databaseAssessments[row].issues[0];
|
||||||
this._dbName.value = this._dbNames[row];
|
this._dbName.value = this._dbNames[row];
|
||||||
|
this._recommendationTitle.value = constants.ISSUES_COUNT(this._activeIssues.length);
|
||||||
|
this._recommendation.value = constants.ISSUES_DETAILS;
|
||||||
this._resultComponent.updateCssStyles({
|
this._resultComponent.updateCssStyles({
|
||||||
'display': 'block'
|
'display': 'block'
|
||||||
});
|
});
|
||||||
@@ -227,7 +250,8 @@ export class SqlDatabaseTree {
|
|||||||
this._dbMessageContainer.updateCssStyles({
|
this._dbMessageContainer.updateCssStyles({
|
||||||
'display': 'none'
|
'display': 'none'
|
||||||
});
|
});
|
||||||
|
this._recommendation.value = constants.WARNINGS_DETAILS;
|
||||||
|
this._recommendationTitle.value = constants.WARNINGS_COUNT(this._activeIssues.length);
|
||||||
if (this._model._targetType === MigrationTargetType.SQLMI) {
|
if (this._model._targetType === MigrationTargetType.SQLMI) {
|
||||||
this.refreshResults();
|
this.refreshResults();
|
||||||
}
|
}
|
||||||
@@ -578,7 +602,7 @@ export class SqlDatabaseTree {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private createAssessmentResultsTitle(): azdata.TextComponent {
|
private createAssessmentResultsTitle(): azdata.TextComponent {
|
||||||
this._recommendation = this._view.modelBuilder.text().withProps({
|
this._recommendationTitle = this._view.modelBuilder.text().withProps({
|
||||||
value: constants.WARNINGS,
|
value: constants.WARNINGS,
|
||||||
CSSStyles: {
|
CSSStyles: {
|
||||||
'font-size': '13px',
|
'font-size': '13px',
|
||||||
@@ -589,7 +613,7 @@ export class SqlDatabaseTree {
|
|||||||
}
|
}
|
||||||
}).component();
|
}).component();
|
||||||
|
|
||||||
return this._recommendation;
|
return this._recommendationTitle;
|
||||||
}
|
}
|
||||||
|
|
||||||
private createAssessmentDetailsTitle(): azdata.TextComponent {
|
private createAssessmentDetailsTitle(): azdata.TextComponent {
|
||||||
@@ -722,7 +746,7 @@ export class SqlDatabaseTree {
|
|||||||
|
|
||||||
public async initialize(): Promise<void> {
|
public async initialize(): Promise<void> {
|
||||||
let instanceTableValues: azdata.DeclarativeTableCellValue[][] = [];
|
let instanceTableValues: azdata.DeclarativeTableCellValue[][] = [];
|
||||||
let databaseTableValues: azdata.DeclarativeTableCellValue[][] = [];
|
this._databaseTableValues = [];
|
||||||
const excludedDatabases = ['master', 'msdb', 'tempdb', 'model'];
|
const excludedDatabases = ['master', 'msdb', 'tempdb', 'model'];
|
||||||
this._dbNames = (await azdata.connection.listDatabases(this._model.sourceConnectionId)).filter(db => !excludedDatabases.includes(db));
|
this._dbNames = (await azdata.connection.listDatabases(this._model.sourceConnectionId)).filter(db => !excludedDatabases.includes(db));
|
||||||
const selectedDbs = (this._targetType === MigrationTargetType.SQLVM) ? this._model._vmDbs : this._model._miDbs;
|
const selectedDbs = (this._targetType === MigrationTargetType.SQLVM) ? this._model._vmDbs : this._model._miDbs;
|
||||||
@@ -742,7 +766,7 @@ export class SqlDatabaseTree {
|
|||||||
]
|
]
|
||||||
];
|
];
|
||||||
this._dbNames.forEach((db) => {
|
this._dbNames.forEach((db) => {
|
||||||
databaseTableValues.push(
|
this._databaseTableValues.push(
|
||||||
[
|
[
|
||||||
{
|
{
|
||||||
value: selectedDbs.includes(db),
|
value: selectedDbs.includes(db),
|
||||||
@@ -776,7 +800,7 @@ export class SqlDatabaseTree {
|
|||||||
return db2.issues.length - db1.issues.length;
|
return db2.issues.length - db1.issues.length;
|
||||||
});
|
});
|
||||||
this._model._assessmentResults.databaseAssessments.forEach((db) => {
|
this._model._assessmentResults.databaseAssessments.forEach((db) => {
|
||||||
databaseTableValues.push(
|
this._databaseTableValues.push(
|
||||||
[
|
[
|
||||||
{
|
{
|
||||||
value: selectedDbs.includes(db.name),
|
value: selectedDbs.includes(db.name),
|
||||||
@@ -795,7 +819,7 @@ export class SqlDatabaseTree {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
this._instanceTable.dataValues = instanceTableValues;
|
this._instanceTable.dataValues = instanceTableValues;
|
||||||
this._databaseTable.dataValues = databaseTableValues;
|
this._databaseTable.dataValues = this._databaseTableValues;
|
||||||
}
|
}
|
||||||
|
|
||||||
private createIconTextCell(icon: IconPath, text: string): azdata.FlexContainer {
|
private createIconTextCell(icon: IconPath, text: string): azdata.FlexContainer {
|
||||||
|
|||||||
@@ -116,6 +116,7 @@ export class MigrationStateModel implements Model, vscode.Disposable {
|
|||||||
public _blobContainers!: azureResource.BlobContainer[];
|
public _blobContainers!: azureResource.BlobContainer[];
|
||||||
public _refreshNetworkShareLocation!: azureResource.BlobContainer[];
|
public _refreshNetworkShareLocation!: azureResource.BlobContainer[];
|
||||||
public _targetDatabaseNames!: string[];
|
public _targetDatabaseNames!: string[];
|
||||||
|
public _serverDatabases!: string[];
|
||||||
|
|
||||||
public _sqlMigrationService!: SqlMigrationService;
|
public _sqlMigrationService!: SqlMigrationService;
|
||||||
public _sqlMigrationServices!: SqlMigrationService[];
|
public _sqlMigrationServices!: SqlMigrationService[];
|
||||||
@@ -169,9 +170,9 @@ export class MigrationStateModel implements Model, vscode.Disposable {
|
|||||||
ownerUri
|
ownerUri
|
||||||
);
|
);
|
||||||
|
|
||||||
const serverDatabases = await (await azdata.connection.listDatabases(this.sourceConnectionId)).filter((name) => !excludeDbs.includes(name));
|
this._serverDatabases = await (await azdata.connection.listDatabases(this.sourceConnectionId)).filter((name) => !excludeDbs.includes(name));
|
||||||
const serverLevelAssessments: mssql.SqlMigrationAssessmentResultItem[] = [];
|
const serverLevelAssessments: mssql.SqlMigrationAssessmentResultItem[] = [];
|
||||||
const databaseLevelAssessments = serverDatabases.map(db => {
|
const databaseLevelAssessments = this._serverDatabases.map(db => {
|
||||||
return {
|
return {
|
||||||
name: db,
|
name: db,
|
||||||
issues: <mssql.SqlMigrationAssessmentResultItem[]>[]
|
issues: <mssql.SqlMigrationAssessmentResultItem[]>[]
|
||||||
@@ -180,7 +181,7 @@ export class MigrationStateModel implements Model, vscode.Disposable {
|
|||||||
|
|
||||||
assessmentResults?.items.forEach((item) => {
|
assessmentResults?.items.forEach((item) => {
|
||||||
if (item.appliesToMigrationTargetPlatform === MigrationTargetType.SQLMI) {
|
if (item.appliesToMigrationTargetPlatform === MigrationTargetType.SQLMI) {
|
||||||
const dbIndex = serverDatabases.indexOf(item.databaseName);
|
const dbIndex = this._serverDatabases.indexOf(item.databaseName);
|
||||||
if (dbIndex === -1) {
|
if (dbIndex === -1) {
|
||||||
serverLevelAssessments.push(item);
|
serverLevelAssessments.push(item);
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
Reference in New Issue
Block a user