diff --git a/extensions/data-workspace/src/common/constants.ts b/extensions/data-workspace/src/common/constants.ts index f51a3072f6..9de73bc4bf 100644 --- a/extensions/data-workspace/src/common/constants.ts +++ b/extensions/data-workspace/src/common/constants.ts @@ -56,6 +56,7 @@ export const No = localize('dataworkspace.no', "No"); export const SdkLearnMorePlaceholder = localize('dataworkspace.sdkLearnMorePlaceholder', "Click \"Learn More\" button for more information about SDK-style projects"); export const Default = localize('dataworkspace.default', "Default"); export const SelectTargetPlatform = localize('dataworkspace.selectTargetPlatform', "Select Target Platform"); +export const LocalDevInfo = (target: string) => localize('LocalDevInfo', "Click \"Learn more\" button for more information about local development experience to {0}", target); //Open Existing Dialog export const OpenExistingDialogTitle = localize('dataworkspace.openExistingDialogTitle', "Open Existing Project"); diff --git a/extensions/data-workspace/src/common/utils.ts b/extensions/data-workspace/src/common/utils.ts index d78361e6a3..752bc433c5 100644 --- a/extensions/data-workspace/src/common/utils.ts +++ b/extensions/data-workspace/src/common/utils.ts @@ -5,6 +5,8 @@ import * as fs from 'fs'; import type * as azdataType from 'azdata'; +import * as vscode from 'vscode'; +import * as constants from './constants'; export async function directoryExist(directoryPath: string): Promise { const stats = await getFileStatus(directoryPath); @@ -69,3 +71,15 @@ try { export function getAzdataApi(): typeof azdataType | undefined { return azdataApi; } + +/** + * Shows a message with a "Learn More" button + * @param message Info message + * @param link Link to open when "Learn Button" is clicked + */ +export async function showInfoMessageWithLearnMoreLink(message: string, link: string): Promise { + const result = await vscode.window.showInformationMessage(message, constants.LearnMore); + if (result === constants.LearnMore) { + void vscode.env.openExternal(vscode.Uri.parse(link)); + } +} diff --git a/extensions/data-workspace/src/dataworkspace.d.ts b/extensions/data-workspace/src/dataworkspace.d.ts index da4357bef8..f70ad32d43 100644 --- a/extensions/data-workspace/src/dataworkspace.d.ts +++ b/extensions/data-workspace/src/dataworkspace.d.ts @@ -145,6 +145,11 @@ declare module 'dataworkspace' { * Location where clicking on the Learn More next to SDK style checkbox will go. sdkStyleOption needs to be set to true to use this */ readonly sdkStyleLearnMoreUrl?: string + + /** + * Location where clicking on the Learn More to know more about project type will go + */ + readonly learnMoreUrl?: string } /** diff --git a/extensions/data-workspace/src/dialogs/newProjectQuickpick.ts b/extensions/data-workspace/src/dialogs/newProjectQuickpick.ts index dea55d29b9..9d6ffe348a 100644 --- a/extensions/data-workspace/src/dialogs/newProjectQuickpick.ts +++ b/extensions/data-workspace/src/dialogs/newProjectQuickpick.ts @@ -6,7 +6,7 @@ import * as vscode from 'vscode'; import * as path from 'path'; import * as constants from '../common/constants'; -import { directoryExist } from '../common/utils'; +import { directoryExist, showInfoMessageWithLearnMoreLink } from '../common/utils'; import { defaultProjectSaveLocation } from '../common/projectLocationHelper'; import { WorkspaceService } from '../services/workspaceService'; @@ -23,8 +23,9 @@ export async function createNewProjectWithQuickpick(workspaceService: WorkspaceS targetPlatforms: projType.targetPlatforms, defaultTargetPlatform: projType.defaultTargetPlatform, sdkOption: projType.sdkStyleOption, - sdkLearnMoreUrl: projType.sdkStyleLearnMoreUrl - } as vscode.QuickPickItem & { id: string, sdkOption?: boolean, targetPlatforms?: string[], defaultTargetPlatform?: string, sdkLearnMoreUrl?: string }; + sdkLearnMoreUrl: projType.sdkStyleLearnMoreUrl, + learnMoreUrl: projType.learnMoreUrl + } as vscode.QuickPickItem & { id: string, sdkOption?: boolean, targetPlatforms?: string[], defaultTargetPlatform?: string, sdkLearnMoreUrl?: string, learnMoreUrl?: string }; }); // 1. Prompt for project type @@ -166,4 +167,10 @@ export async function createNewProjectWithQuickpick(workspaceService: WorkspaceS } await workspaceService.createProject(projectName, vscode.Uri.file(projectLocation), projectType.id, targetPlatform, sdkStyle); + + // Add info message with 'learn more' button if project type has a link + // for user to learn more about the project type + if (projectType.learnMoreUrl && projectType.defaultTargetPlatform) { + void showInfoMessageWithLearnMoreLink(constants.LocalDevInfo(projectType.defaultTargetPlatform), projectType.learnMoreUrl); + } } diff --git a/extensions/sql-database-projects/resources/projectAssets/AzureV12/README.MD b/extensions/sql-database-projects/resources/projectAssets/AzureV12/README.MD deleted file mode 100644 index 17d6c0975d..0000000000 --- a/extensions/sql-database-projects/resources/projectAssets/AzureV12/README.MD +++ /dev/null @@ -1,63 +0,0 @@ -# Welcome to Azure SQL Database Local Development experience! - -## Overview -Microsoft Azure SQL Database Local Development experience for Azure Data Studio and VS Code provides a way to design, edit, build/validate, publish and run schemas for Azure SQL databases from a source-controlled project to one or more offline database instances, running in a containerized environment that offers closest fidelity with what Azure SQL Database public service. Once development gets to a more mature stage, developers can easily publish the same project to public service from the same environment, and manage the entire lifecycle of their databases (e.g. manage schema drifts and such). - -## VS Code -Microsoft SQL Server Database Projects for Azure Data Studio and VS Code provides a way to design, edit, and publish and run schemas for Azure SQL databases from a source-controlled project. - -## Getting Started with Database Projects -* Create a new database project by going to the Projects viewlet or by searching Projects: New in the command palette. -* Existing database projects can be opened by going to the Projects viewlet or by searching Projects: Open Existing in the command palette. -* Start from an existing database by using the Create Project from Database from the command palette or database context menu. -* Start from an OpenAPI/Swagger spec by using the Generate SQL Project from OpenAPI/Swagger spec command. - -![Pic1](./assets/pic1.jpg) - -Provide a name for the new database project: - -![Pic2](./assets/pic2.jpg) - -Start working on your project, adding database objects like tables, views, stored procedures and such: - -![Pic3](./assets/pic3.jpg) - -  -Database project files can be put under source control together with your application projects: - -![Pic4](./assets/pic4.jpg) - -You can get edit and build time support for your database project objects and scripts by selecting a proper target platform for your project. This will let VS Code to highlight syntax issues or the usage of unsupported features for the selected platform: - -![Pic5](./assets/pic5.jpg) - -You can build your project and validate that it will work against the selected platform: - -![Pic6](./assets/pic6.jpg) - -Once database project is ready to get tested, you can publish it to a target: - -![Pic7](./assets/pic7.jpg) - -You can select between an existing or a new server: - -![Pic8](./assets/pic8.jpg) - -And you select between Azure SQL Database “lite” and a “full” images. With the former, you will get compatibility with most of Azure SQL DB capabilities and a lightweight image that will take less to download and instantiate. Selecting “full”, you will have access to advanced features like In-memory optimized tables, geo-spatial data types and more, but at the expense of more required resources: - -![Pic9](./assets/pic9.jpg) - -You can create as many local instances as necessary, based on available resources, and manage their lifecycle through VS Code Docker Extension or CLI commands. - -![Pic10](./assets/pic10.jpg) -Once instances of your database projects are running, you can connect from VS Code mssql extension and test your scripts and queries, like any regular Azure SQL Database instance in the cloud: - -![Pic11](./assets/pic11.jpg) - -For each iteration and modification, SQL project can be rebuilt and deployed to one of the containerized instances running on the local machine, until it’s ready. - -![Pic12](./assets/pic12.jpg) - -Last step of database project lifecycle can be to publish the finished artifact to a new or existing Azure SQL Database instance in the cloud through the mssql extension: - -![Pic13](./assets/pic13.jpg) diff --git a/extensions/sql-database-projects/resources/projectAssets/AzureV12/assets/pic1.jpg b/extensions/sql-database-projects/resources/projectAssets/AzureV12/assets/pic1.jpg deleted file mode 100644 index d073fbbd7c..0000000000 Binary files a/extensions/sql-database-projects/resources/projectAssets/AzureV12/assets/pic1.jpg and /dev/null differ diff --git a/extensions/sql-database-projects/resources/projectAssets/AzureV12/assets/pic10.jpg b/extensions/sql-database-projects/resources/projectAssets/AzureV12/assets/pic10.jpg deleted file mode 100644 index b3c5d78c4a..0000000000 Binary files a/extensions/sql-database-projects/resources/projectAssets/AzureV12/assets/pic10.jpg and /dev/null differ diff --git a/extensions/sql-database-projects/resources/projectAssets/AzureV12/assets/pic11.jpg b/extensions/sql-database-projects/resources/projectAssets/AzureV12/assets/pic11.jpg deleted file mode 100644 index 9aed9596da..0000000000 Binary files a/extensions/sql-database-projects/resources/projectAssets/AzureV12/assets/pic11.jpg and /dev/null differ diff --git a/extensions/sql-database-projects/resources/projectAssets/AzureV12/assets/pic12.jpg b/extensions/sql-database-projects/resources/projectAssets/AzureV12/assets/pic12.jpg deleted file mode 100644 index f51427853e..0000000000 Binary files a/extensions/sql-database-projects/resources/projectAssets/AzureV12/assets/pic12.jpg and /dev/null differ diff --git a/extensions/sql-database-projects/resources/projectAssets/AzureV12/assets/pic13.jpg b/extensions/sql-database-projects/resources/projectAssets/AzureV12/assets/pic13.jpg deleted file mode 100644 index f187ac72f3..0000000000 Binary files a/extensions/sql-database-projects/resources/projectAssets/AzureV12/assets/pic13.jpg and /dev/null differ diff --git a/extensions/sql-database-projects/resources/projectAssets/AzureV12/assets/pic2.jpg b/extensions/sql-database-projects/resources/projectAssets/AzureV12/assets/pic2.jpg deleted file mode 100644 index b7bcf77dbf..0000000000 Binary files a/extensions/sql-database-projects/resources/projectAssets/AzureV12/assets/pic2.jpg and /dev/null differ diff --git a/extensions/sql-database-projects/resources/projectAssets/AzureV12/assets/pic3.jpg b/extensions/sql-database-projects/resources/projectAssets/AzureV12/assets/pic3.jpg deleted file mode 100644 index 16b75bf487..0000000000 Binary files a/extensions/sql-database-projects/resources/projectAssets/AzureV12/assets/pic3.jpg and /dev/null differ diff --git a/extensions/sql-database-projects/resources/projectAssets/AzureV12/assets/pic4.jpg b/extensions/sql-database-projects/resources/projectAssets/AzureV12/assets/pic4.jpg deleted file mode 100644 index 2cd1e3db83..0000000000 Binary files a/extensions/sql-database-projects/resources/projectAssets/AzureV12/assets/pic4.jpg and /dev/null differ diff --git a/extensions/sql-database-projects/resources/projectAssets/AzureV12/assets/pic5.jpg b/extensions/sql-database-projects/resources/projectAssets/AzureV12/assets/pic5.jpg deleted file mode 100644 index 8a6f65499d..0000000000 Binary files a/extensions/sql-database-projects/resources/projectAssets/AzureV12/assets/pic5.jpg and /dev/null differ diff --git a/extensions/sql-database-projects/resources/projectAssets/AzureV12/assets/pic6.jpg b/extensions/sql-database-projects/resources/projectAssets/AzureV12/assets/pic6.jpg deleted file mode 100644 index e948900f16..0000000000 Binary files a/extensions/sql-database-projects/resources/projectAssets/AzureV12/assets/pic6.jpg and /dev/null differ diff --git a/extensions/sql-database-projects/resources/projectAssets/AzureV12/assets/pic7.jpg b/extensions/sql-database-projects/resources/projectAssets/AzureV12/assets/pic7.jpg deleted file mode 100644 index 189858e514..0000000000 Binary files a/extensions/sql-database-projects/resources/projectAssets/AzureV12/assets/pic7.jpg and /dev/null differ diff --git a/extensions/sql-database-projects/resources/projectAssets/AzureV12/assets/pic8.jpg b/extensions/sql-database-projects/resources/projectAssets/AzureV12/assets/pic8.jpg deleted file mode 100644 index 3db150713d..0000000000 Binary files a/extensions/sql-database-projects/resources/projectAssets/AzureV12/assets/pic8.jpg and /dev/null differ diff --git a/extensions/sql-database-projects/resources/projectAssets/AzureV12/assets/pic9.jpg b/extensions/sql-database-projects/resources/projectAssets/AzureV12/assets/pic9.jpg deleted file mode 100644 index 2b9d2a883d..0000000000 Binary files a/extensions/sql-database-projects/resources/projectAssets/AzureV12/assets/pic9.jpg and /dev/null differ diff --git a/extensions/sql-database-projects/src/common/constants.ts b/extensions/sql-database-projects/src/common/constants.ts index a83d8a7d3b..e2db944f7b 100644 --- a/extensions/sql-database-projects/src/common/constants.ts +++ b/extensions/sql-database-projects/src/common/constants.ts @@ -99,6 +99,7 @@ export const location = localize('location', "Location"); export const reloadProject = localize('reloadProject', "Would you like to reload your database project?"); export const learnMore = localize('learnMore', "Learn More"); export const sdkLearnMoreUrl = 'https://aka.ms/sqlprojsdk'; +export const azureDevOpsLink = 'https://docs.microsoft.com/azure/azure-sql/database/local-dev-experience-overview?view=azuresql'; export function newObjectNamePrompt(objectType: string) { return localize('newObjectNamePrompt', 'New {0} name:', objectType); } export function deleteConfirmation(toDelete: string) { return localize('deleteConfirmation', "Are you sure you want to delete {0}?", toDelete); } export function deleteConfirmationContents(toDelete: string) { return localize('deleteConfirmationContents', "Are you sure you want to delete {0} and all of its contents?", toDelete); } diff --git a/extensions/sql-database-projects/src/controllers/mainController.ts b/extensions/sql-database-projects/src/controllers/mainController.ts index 89214dc75a..11c3d2e071 100644 --- a/extensions/sql-database-projects/src/controllers/mainController.ts +++ b/extensions/sql-database-projects/src/controllers/mainController.ts @@ -8,7 +8,6 @@ import * as vscode from 'vscode'; import * as vscodeMssql from 'vscode-mssql'; import * as mssql from 'mssql'; import * as templates from '../templates/templates'; -import * as projectAssets from '../projectProvider/projectAssets'; import * as path from 'path'; import { ProjectsController } from './projectController'; @@ -90,7 +89,6 @@ export default class MainController implements vscode.Disposable { IconPathHelper.setExtensionContext(this.extensionContext); await templates.loadTemplates(path.join(this.context.extensionPath, 'resources', 'templates')); - projectAssets.loadAssets(path.join(this.context.extensionPath, 'resources', 'projectAssets')); } public dispose(): void { diff --git a/extensions/sql-database-projects/src/controllers/projectController.ts b/extensions/sql-database-projects/src/controllers/projectController.ts index c59e30ca63..d82ad7f4c0 100644 --- a/extensions/sql-database-projects/src/controllers/projectController.ts +++ b/extensions/sql-database-projects/src/controllers/projectController.ts @@ -11,7 +11,6 @@ import * as utils from '../common/utils'; import * as UUID from 'vscode-languageclient/lib/utils/uuid'; import * as templates from '../templates/templates'; import * as vscode from 'vscode'; -import * as fse from 'fs-extra'; import type * as azdataType from 'azdata'; import * as dataworkspace from 'dataworkspace'; import type * as mssqlVscode from 'vscode-mssql'; @@ -47,7 +46,6 @@ import { addDatabaseReferenceQuickpick } from '../dialogs/addDatabaseReferenceQu import { ILocalDbDeployProfile, ISqlDbDeployProfile } from '../models/deploy/deployProfile'; import { EntryType, FileProjectEntry, IDatabaseReferenceProjectEntry, SqlProjectReferenceProjectEntry } from '../models/projectEntry'; import { UpdateProjectAction, UpdateProjectDataModel } from '../models/api/updateProject'; -import { targetPlatformToAssets } from '../projectProvider/projectAssets'; import { AzureSqlClient } from '../models/deploy/azureSqlClient'; const maxTableLength = 10; @@ -200,20 +198,6 @@ export class ProjectsController { await fs.mkdir(projectFolderPath, { recursive: true }); await fs.writeFile(newProjFilePath, newProjFileContents); - // Copy project readme - if (targetPlatformToAssets?.has(targetPlatform) && (targetPlatformToAssets?.get(targetPlatform)?.readmeFolder)) { - const readmeFolder = targetPlatformToAssets.get(targetPlatform)?.readmeFolder; - - if (readmeFolder) { - const readmeFile = path.join(readmeFolder, 'README.md'); - const folderExists = await utils.exists(readmeFile); - if (folderExists) { - await fs.copyFile(readmeFile, path.join(projectFolderPath, 'README.md')); - await fse.copy(path.join(readmeFolder, 'assets'), path.join(projectFolderPath, 'assets')); - } - } - } - await this.addTemplateFiles(newProjFilePath, creationParams.projectTypeId); return newProjFilePath; diff --git a/extensions/sql-database-projects/src/projectProvider/projectAssets.ts b/extensions/sql-database-projects/src/projectProvider/projectAssets.ts deleted file mode 100644 index e7303b7747..0000000000 --- a/extensions/sql-database-projects/src/projectProvider/projectAssets.ts +++ /dev/null @@ -1,20 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the Source EULA. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -import * as path from 'path'; - -export interface ProjectAssets { - readmeFolder?: string -} - -export let targetPlatformToAssets: Map; - -export function loadAssets(assetsFolderPath: string) { - targetPlatformToAssets = new Map([ - ['AzureV12', { - readmeFolder: path.join(assetsFolderPath, 'AzureV12') - }], - ]); -} diff --git a/extensions/sql-database-projects/src/projectProvider/projectProvider.ts b/extensions/sql-database-projects/src/projectProvider/projectProvider.ts index f4b40962b8..df6fb67c06 100644 --- a/extensions/sql-database-projects/src/projectProvider/projectProvider.ts +++ b/extensions/sql-database-projects/src/projectProvider/projectProvider.ts @@ -44,7 +44,8 @@ export class SqlDatabaseProjectProvider implements dataworkspace.IProjectProvide defaultTargetPlatform: sqldbproj.SqlTargetPlatform.sqlAzure, icon: IconPathHelper.azureSqlDbProject, sdkStyleOption: true, - sdkStyleLearnMoreUrl: constants.sdkLearnMoreUrl + sdkStyleLearnMoreUrl: constants.sdkLearnMoreUrl, + learnMoreUrl: constants.azureDevOpsLink }, { id: constants.emptySqlDatabaseProjectTypeId,