From c0640064cdb9393edecc7c62203b104c72bea69c Mon Sep 17 00:00:00 2001 From: pavolum Date: Tue, 27 Apr 2021 13:14:44 -0400 Subject: [PATCH] fix: various template bugs (#7378) * Fix qna template name and prepare sort order for new package names * Fixing default proj name logic and minor cleaning up * Partially fix initial template selection bug * Add timeout to fully fix initial template selection UI bug * fix qna read me bug * fix backup sort order * Adding new templates to sort template unit test * Fix creation unit test to account for new template name * Adjusting unit test to check for default name derived by display name vs template package name --- .../components/CreationFlowV2/index.test.tsx | 20 +++++++++++--- .../components/CreationFlow/v2/CreateBot.tsx | 3 +++ .../CreationFlow/v2/DefineConversation.tsx | 23 +++++++--------- .../packages/server/src/controllers/asset.ts | 2 +- .../src/utility/__tests__/creation.test.ts | 26 ++++++++++++++++--- .../packages/server/src/utility/creation.ts | 15 ++++++----- 6 files changed, 60 insertions(+), 29 deletions(-) diff --git a/Composer/packages/client/__tests__/components/CreationFlowV2/index.test.tsx b/Composer/packages/client/__tests__/components/CreationFlowV2/index.test.tsx index 383a852e31..63843730df 100644 --- a/Composer/packages/client/__tests__/components/CreationFlowV2/index.test.tsx +++ b/Composer/packages/client/__tests__/components/CreationFlowV2/index.test.tsx @@ -12,6 +12,7 @@ import { creationFlowStatusState, dispatcherState, featureFlagsState, + templateProjectsState, } from '../../../src/recoilModel'; import { CreationFlowStatus } from '../../../src/constants'; import CreationFlowV2 from '../../../src/components/CreationFlow/v2/CreationFlow'; @@ -36,6 +37,17 @@ describe('', () => { }); set(creationFlowStatusState, CreationFlowStatus.NEW_FROM_TEMPLATE); set(featureFlagsState, getDefaultFeatureFlags()); + set(templateProjectsState, [ + { + id: '@microsoft/generator-bot-empty', + name: 'Empty Bot', + description: 'Yeoman generator for creating an empty bot built on the Azure Bot Framework.', + package: { packageName: '@microsoft/generator-bot-empty', packageSource: 'npm', packageVersion: '1.0.0' }, + dotnetSupport: { functionsSupported: true, webAppSupported: true }, + nodeSupport: { functionsSupported: true, webAppSupported: true }, + }, + ]); + set(focusedStorageFolderState, { name: 'Desktop', parent: '/test-folder', @@ -73,7 +85,7 @@ describe('', () => { ); - navigate('create/dotnet/generator-conversational-core'); + navigate('create/dotnet/%40microsoft%2Fgenerator-bot-empty'); const node = await findByText('OK'); act(() => { @@ -88,10 +100,10 @@ describe('', () => { appLocale: 'en-US', description: '', location: expectedLocation, - name: 'conversational_core', + name: 'empty_bot', schemaUrl: '', - templateId: 'generator-conversational-core', - templateVersion: '', + templateId: '@microsoft/generator-bot-empty', + templateVersion: '1.0.0', alias: undefined, eTag: undefined, preserveRoot: undefined, diff --git a/Composer/packages/client/src/components/CreationFlow/v2/CreateBot.tsx b/Composer/packages/client/src/components/CreationFlow/v2/CreateBot.tsx index 0395145f05..1805bfb318 100644 --- a/Composer/packages/client/src/components/CreationFlow/v2/CreateBot.tsx +++ b/Composer/packages/client/src/components/CreationFlow/v2/CreateBot.tsx @@ -215,6 +215,9 @@ export function CreateBotV2(props: CreateBotProps) { useEffect(() => { if (displayedTemplates?.[0]?.id) { setCurrentTemplateId(displayedTemplates[0].id); + setTimeout(() => { + selectedTemplate.setIndexSelected(0, true, false); + }, 0); } }, [displayedTemplates]); diff --git a/Composer/packages/client/src/components/CreationFlow/v2/DefineConversation.tsx b/Composer/packages/client/src/components/CreationFlow/v2/DefineConversation.tsx index e7b83d89ba..e09d2ef9c8 100644 --- a/Composer/packages/client/src/components/CreationFlow/v2/DefineConversation.tsx +++ b/Composer/packages/client/src/components/CreationFlow/v2/DefineConversation.tsx @@ -116,23 +116,23 @@ const DefineConversationV2: React.FC = (props) => { const writable = focusedStorageFolder.writable; const runtimeLanguage = props.runtimeLanguage ? props.runtimeLanguage : csharpFeedKey; const templateProjects = useRecoilValue(templateProjectsState); + const currentTemplate = templateProjects.find((t) => { + if (t?.id) { + return t.id === templateId; + } + }); // template ID is populated by npm package name which needs to be formatted - const normalizeTemplateId = (templateId?: string) => { - if (templateId) { + const normalizeTemplateId = () => { + if (currentTemplate) { // use almost the same patterns as in assetManager.ts - return templateId - .replace(/^@microsoft\/generator-bot-/, '') // clean up our complex package names - .replace(/^generator-/, '') // clean up other package names too - .trim() - .replace(/-/, '_') - .toLocaleLowerCase(); + return currentTemplate.name.trim().replace(/[-\s]/g, '_').toLocaleLowerCase(); } }; const getDefaultName = () => { let i = 0; - const bot = normalizeTemplateId(templateId); + const bot = normalizeTemplateId(); let defaultName = `${bot}`; while ( files.some((file) => { @@ -295,11 +295,6 @@ const DefineConversationV2: React.FC = (props) => { const getSupportedRuntimesForTemplate = (): IDropdownOption[] => { const result: IDropdownOption[] = []; - const currentTemplate = templateProjects.find((t) => { - if (t?.id) { - return t.id === templateId; - } - }); if (currentTemplate) { if (runtimeLanguage === csharpFeedKey) { diff --git a/Composer/packages/server/src/controllers/asset.ts b/Composer/packages/server/src/controllers/asset.ts index 84b3fb1200..dcffd3869d 100644 --- a/Composer/packages/server/src/controllers/asset.ts +++ b/Composer/packages/server/src/controllers/asset.ts @@ -86,7 +86,7 @@ export async function getTemplateReadMe(req: any, res: any) { 'microsoft', 'botframework-components', 'main', - 'generators/generator-bot-qna-maker/README.md' + 'generators/generator-bot-core-qna/README.md' ); res.status(200).json(qnaReadMe); } else { diff --git a/Composer/packages/server/src/utility/__tests__/creation.test.ts b/Composer/packages/server/src/utility/__tests__/creation.test.ts index 723158cef8..2c1edf03db 100644 --- a/Composer/packages/server/src/utility/__tests__/creation.test.ts +++ b/Composer/packages/server/src/utility/__tests__/creation.test.ts @@ -13,7 +13,7 @@ jest.mock('../../models/asset/assetManager', () => ({ describe('templateSort', () => { const templates: BotTemplate[] = [ { - id: '@microsoft/generator-bot-assistant-core', + id: '@microsoft/generator-bot-core-language', name: ' Calendar Assistant', description: 'Preview Calendar Assistant template for TESTING ONLY', package: { @@ -33,7 +33,7 @@ describe('templateSort', () => { }, }, { - id: '@microsoft/generator-bot-people', + id: '@microsoft/generator-bot-enterprise-people', name: ' Calendar Assistant', description: 'Preview Calendar Assistant template for TESTING ONLY', package: { @@ -43,7 +43,7 @@ describe('templateSort', () => { }, }, { - id: '@microsoft/generator-bot-calendar', + id: '@microsoft/generator-bot-enterprise-calendar', name: ' Calendar', description: 'Preview calendar bot for TESTING ONLY', package: { @@ -83,6 +83,26 @@ describe('templateSort', () => { packageVersion: '0.0.1', }, }, + { + id: '@microsoft/generator-bot-core-qna', + name: 'generator-qna-bot', + description: 'Empty bot template that routes to qna configuration', + package: { + packageName: 'generator-empty-bot', + packageSource: 'npm', + packageVersion: '0.0.1', + }, + }, + { + id: '@microsoft/generator-bot-core-assistant', + name: 'generator-qna-bot', + description: 'Empty bot template that routes to qna configuration', + package: { + packageName: 'generator-empty-bot', + packageSource: 'npm', + packageVersion: '0.0.1', + }, + }, ]; it('should return sorted templates per sortOrder obj', async () => { diff --git a/Composer/packages/server/src/utility/creation.ts b/Composer/packages/server/src/utility/creation.ts index d4c8443162..57fe7c91bc 100644 --- a/Composer/packages/server/src/utility/creation.ts +++ b/Composer/packages/server/src/utility/creation.ts @@ -8,13 +8,14 @@ import logger from '../logger'; import AssetService from '../services/asset'; export const defaultSortOrder = [ - { generatorName: '@microsoft/generator-bot-empty', displayName: 'Blank bot' }, - { generatorName: '@microsoft/generator-bot-conversational-core', displayName: 'Basic bot' }, - { generatorName: '@microsoft/generator-bot-assistant-core', displayName: 'Basic assistant' }, - { generatorName: '@microsoft/generator-bot-enterprise-assistant', displayName: 'Enterprise assistant' }, - { generatorName: '@microsoft/generator-bot-people', displayName: 'People' }, - { generatorName: '@microsoft/generator-bot-calendar', displayName: 'Calendar' }, - { generatorName: QnABotTemplateId, displayName: 'QnAMaker bot' }, + { generatorName: '@microsoft/generator-bot-empty', displayName: 'Empty Bot' }, + { generatorName: '@microsoft/generator-bot-core-language', displayName: 'Core Bot with Language' }, + { generatorName: '@microsoft/generator-bot-core-qna', displayName: 'Core Bot with QnA Maker' }, + { generatorName: QnABotTemplateId, displayName: 'Core Bot with QnA Maker' }, + { generatorName: '@microsoft/generator-bot-core-assistant', displayName: 'Core Assistant Bot' }, + { generatorName: '@microsoft/generator-bot-enterprise-assistant', displayName: 'Enterprise Assistant Bot' }, + { generatorName: '@microsoft/generator-bot-enterprise-calendar', displayName: 'Enterprise Calendar Bot' }, + { generatorName: '@microsoft/generator-bot-enterprise-people', displayName: 'Enterprise People Bot' }, ]; export const sortTemplates = async (templates: BotTemplate[]): Promise => {