diff --git a/extensions/data-workspace/src/dataworkspace.d.ts b/extensions/data-workspace/src/dataworkspace.d.ts index f990c98bfd..980e0bb16e 100644 --- a/extensions/data-workspace/src/dataworkspace.d.ts +++ b/extensions/data-workspace/src/dataworkspace.d.ts @@ -129,6 +129,16 @@ declare module 'dataworkspace' { * Gets the default target platform */ readonly defaultTargetPlatform?: string; + + /** + * Link display value for a link at the end of the project description. linkLocation also needs to be set to use this + */ + readonly linkDisplayValue?: string; + + /** + * Location where clicking on the linkDisplayValue will go to + */ + readonly linkLocation?: string } /** diff --git a/extensions/data-workspace/src/dialogs/newProjectDialog.ts b/extensions/data-workspace/src/dialogs/newProjectDialog.ts index 70ee804ebe..aeb7ab4b8c 100644 --- a/extensions/data-workspace/src/dialogs/newProjectDialog.ts +++ b/extensions/data-workspace/src/dialogs/newProjectDialog.ts @@ -122,21 +122,30 @@ export class NewProjectDialog extends DialogBase { 'font-weight': 'bold' } }, { - textValue: projectType.description + textValue: projectType.description, + linkDisplayValue: projectType.linkDisplayValue } ] }; }), iconHeight: '75px', iconWidth: '75px', - cardWidth: '170px', - cardHeight: '170px', + cardWidth: '215px', + cardHeight: '195px', ariaLabel: constants.TypeTitle, width: '500px', iconPosition: 'top', selectedCardId: allProjectTypes.length > 0 ? allProjectTypes[0].id : undefined }).component(); + projectTypeRadioCardGroup.onLinkClick(async (value) => { + for (let projectType of allProjectTypes) { + if (value.cardId === projectType.id) { + void vscode.env.openExternal(vscode.Uri.parse(projectType.linkLocation!)); + } + } + }); + this.register(projectTypeRadioCardGroup.onSelectionChanged((e) => { this.model.projectTypeId = e.cardId; const selectedProject = allProjectTypes.find(p => p.id === e.cardId); diff --git a/extensions/sql-database-projects/resources/templates/newSdkSqlProjectTemplate.xml b/extensions/sql-database-projects/resources/templates/newSdkSqlProjectTemplate.xml new file mode 100644 index 0000000000..ef381713db --- /dev/null +++ b/extensions/sql-database-projects/resources/templates/newSdkSqlProjectTemplate.xml @@ -0,0 +1,13 @@ + + + + + @@PROJECT_NAME@@ + {@@PROJECT_GUID@@} + Microsoft.Data.Tools.Schema.Sql.Sql@@PROJECT_DSP@@DatabaseSchemaProvider + 1033, CI + + + + + diff --git a/extensions/sql-database-projects/src/common/constants.ts b/extensions/sql-database-projects/src/common/constants.ts index f47ac005d0..2b812d3944 100644 --- a/extensions/sql-database-projects/src/common/constants.ts +++ b/extensions/sql-database-projects/src/common/constants.ts @@ -32,6 +32,10 @@ export const edgeSqlDatabaseProjectTypeId = 'SqlDbEdgeProj'; export const edgeProjectTypeDisplayName = localize('edgeProjectTypeDisplayName', "SQL Edge"); export const edgeProjectTypeDescription = localize('edgeProjectTypeDescription', "Start with the core pieces to develop and publish schemas for SQL Edge"); +export const emptySqlDatabaseSdkProjectTypeId = 'EmptySqlDbSdkProj'; +export const emptySdkProjectTypeDisplayName = localize('emptySdkProjectTypeDisplayName', "SQL Database (SDK)"); +export const emptySdkProjectTypeDescription = localize('emptySdkProjectTypeDescription', "Develop and publish schemas for SQL databases with Microsoft.Build.Sql (preview), starting from an empty SDK-style project."); + // Dashboard export const addItemAction = localize('addItemAction', "Add Item"); export const schemaCompareAction = localize('schemaCompareAction', "Schema Compare"); @@ -87,6 +91,7 @@ export const schemaObjectType = localize('schemaObjectType', "Schema/Object Type export const defaultProjectNameStarter = localize('defaultProjectNameStarter', "DatabaseProject"); 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 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/projectController.ts b/extensions/sql-database-projects/src/controllers/projectController.ts index 367b9d6286..efa39ea9e0 100644 --- a/extensions/sql-database-projects/src/controllers/projectController.ts +++ b/extensions/sql-database-projects/src/controllers/projectController.ts @@ -173,7 +173,7 @@ export class ProjectsController { 'PROJECT_DSP': creationParams.targetPlatform ? constants.targetPlatformToVersion.get(creationParams.targetPlatform)! : constants.defaultDSP }; - let newProjFileContents = templates.macroExpansion(templates.newSqlProjectTemplate, macroDict); + let newProjFileContents = creationParams.projectTypeId === constants.emptySqlDatabaseSdkProjectTypeId ? templates.macroExpansion(templates.newSdkSqlProjectTemplate, macroDict) : templates.macroExpansion(templates.newSqlProjectTemplate, macroDict); let newProjFileName = creationParams.newProjName; diff --git a/extensions/sql-database-projects/src/projectProvider/projectProvider.ts b/extensions/sql-database-projects/src/projectProvider/projectProvider.ts index 88d16a3a7e..a73d80c4d2 100644 --- a/extensions/sql-database-projects/src/projectProvider/projectProvider.ts +++ b/extensions/sql-database-projects/src/projectProvider/projectProvider.ts @@ -36,6 +36,17 @@ export class SqlDatabaseProjectProvider implements dataworkspace.IProjectProvide */ get supportedProjectTypes(): dataworkspace.IProjectType[] { return [{ + id: constants.emptySqlDatabaseSdkProjectTypeId, + projectFileExtension: constants.sqlprojExtension.replace(/\./g, ''), + displayName: constants.emptySdkProjectTypeDisplayName, + description: constants.emptySdkProjectTypeDescription, + icon: IconPathHelper.colorfulSqlProject, + targetPlatforms: Array.from(constants.targetPlatformToVersion.keys()), + defaultTargetPlatform: constants.defaultTargetPlatform, + linkDisplayValue: constants.learnMore, + linkLocation: 'https://github.com/microsoft/DacFx/tree/main/src/Microsoft.Build.Sql' + }, + { id: constants.emptySqlDatabaseProjectTypeId, projectFileExtension: constants.sqlprojExtension.replace(/\./g, ''), displayName: constants.emptyProjectTypeDisplayName, diff --git a/extensions/sql-database-projects/src/templates/templates.ts b/extensions/sql-database-projects/src/templates/templates.ts index d83068d488..e7b8ebdafb 100644 --- a/extensions/sql-database-projects/src/templates/templates.ts +++ b/extensions/sql-database-projects/src/templates/templates.ts @@ -8,6 +8,7 @@ import * as constants from '../common/constants'; import { promises as fs } from 'fs'; export let newSqlProjectTemplate: string; +export let newSdkSqlProjectTemplate: string; // Object types @@ -51,6 +52,7 @@ export async function loadTemplates(templateFolderPath: string) { await Promise.all([ Promise.resolve(newSqlProjectTemplate = await loadTemplate(templateFolderPath, 'newSqlProjectTemplate.xml')), + Promise.resolve(newSdkSqlProjectTemplate = await loadTemplate(templateFolderPath, 'newSdkSqlProjectTemplate.xml')), loadObjectTypeInfo(script, constants.scriptFriendlyName, templateFolderPath, 'newTsqlScriptTemplate.sql'), loadObjectTypeInfo(table, constants.tableFriendlyName, templateFolderPath, 'newTsqlTableTemplate.sql'), loadObjectTypeInfo(view, constants.viewFriendlyName, templateFolderPath, 'newTsqlViewTemplate.sql'),