diff --git a/Composer/packages/client/src/recoilModel/dispatchers/utils/project.ts b/Composer/packages/client/src/recoilModel/dispatchers/utils/project.ts index 2689f89173..af5e2beac5 100644 --- a/Composer/packages/client/src/recoilModel/dispatchers/utils/project.ts +++ b/Composer/packages/client/src/recoilModel/dispatchers/utils/project.ts @@ -279,14 +279,18 @@ const emptyQnaFile = (id: string, content: string): QnAFile => { }; const parseAllAssets = async ({ set }: CallbackInterface, projectId: string, botFiles: any) => { - const { luFiles, lgFiles, qnaFiles, mergedSettings } = botFiles; - + const { luFiles, lgFiles, qnaFiles, mergedSettings, dialogs } = botFiles; const [parsedLgFiles, parsedLuFiles, parsedQnaFiles] = await Promise.all([ lgWorker.parseAll(projectId, lgFiles), luWorker.parseAll(luFiles, mergedSettings.luFeatures), qnaWorker.parseAll(qnaFiles), ]); + // migrate script move qna pairs in *.qna to *-manual.source.qna. + const locales = mergedSettings.languages; + const dialogIds = dialogs.map((d) => d.id); + const migratedQnAFiles = migrateQnAFiles(projectId, dialogIds, parsedQnaFiles as QnAFile[], locales); + set(lgFilesSelectorFamily(projectId), (oldFiles) => { return oldFiles.map((item) => { const file = (parsedLgFiles as LgFile[]).find((file) => file.id === item.id); @@ -302,9 +306,9 @@ const parseAllAssets = async ({ set }: CallbackInterface, projectId: string, bot }); set(qnaFilesSelectorFamily(projectId), (oldFiles) => { - return oldFiles.map((item) => { - const file = (parsedQnaFiles as QnAFile[]).find((file) => file.id === item.id); - return file && item.isContentUnparsed ? file : item; + return migratedQnAFiles.map((newFile) => { + const oldFile = oldFiles.find((file) => file.id === newFile.id); + return oldFile && !oldFile.isContentUnparsed ? oldFile : newFile; }); }); @@ -316,8 +320,7 @@ export const loadProjectData = async (data) => { const mergedSettings = getMergedSettings(projectId, settings, botName); const indexedFiles = indexer.index(files, botName); - const { lgResources, luResources, qnaResources, dialogs } = indexedFiles; - const locales = settings.languages; + const { lgResources, luResources, qnaResources } = indexedFiles; //parse all resources with worker lgWorker.addProject(projectId); @@ -325,12 +328,8 @@ export const loadProjectData = async (data) => { const lgFiles = lgResources.map(({ id, content }) => emptyLgFile(id, content)); const luFiles = luResources.map(({ id, content }) => emptyLuFile(id, content)); const qnaFiles = qnaResources.map(({ id, content }) => emptyQnaFile(id, content)); - const dialogIds = dialogs.map((d) => d.id); - // migrate script move qna pairs in *.qna to *-manual.source.qna. - // TODO: remove after a period of time. - const updatedQnAFiles = migrateQnAFiles(projectId, dialogIds, qnaFiles, locales); - const assets = { ...indexedFiles, lgFiles, luFiles, qnaFiles: updatedQnAFiles }; + const assets = { ...indexedFiles, lgFiles, luFiles, qnaFiles }; //Validate all files const diagnostics = BotIndexer.validate({ ...assets, diff --git a/Composer/packages/client/src/utils/qnaUtil.ts b/Composer/packages/client/src/utils/qnaUtil.ts index da7ea8dfcc..bb952ea97a 100644 --- a/Composer/packages/client/src/utils/qnaUtil.ts +++ b/Composer/packages/client/src/utils/qnaUtil.ts @@ -9,8 +9,6 @@ import { QnAFile, DialogInfo } from '@bfc/shared'; import { qnaUtil, BotIndexer } from '@bfc/indexers'; -import { createFile, updateFile, deleteFile } from '../recoilModel/persistence/http'; - import { getBaseName, getExtension } from './fileUtil'; export const getFileLocale = (fileName: string) => { @@ -55,14 +53,15 @@ export const reformQnAToContainerKB = (projectId: string, qnaFiles: QnAFile[], l const manualContainerContent = substringTextByLine(content, qnaSectionStartLine - 1); let originQnAFile = qnaUtil.parse(id, originQnAFileContent); - const manualContainerFileId = `${getBaseName(id)}-manual.source`; - const manualContainerFullFileId = `${manualContainerFileId}.qna`; + const locale = getExtension(id); + const manualContainerSourceId = `${getBaseName(id)}-manual.source`; + const manualContainerFileId = `${manualContainerSourceId}.${locale}`; + const manualContainerImportId = `${manualContainerSourceId}.qna`; // if container file not be imported, do import - if (!originQnAFile.imports.find(({ id }) => manualContainerFullFileId === id)) { - originQnAFile = qnaUtil.addImport(originQnAFile, manualContainerFullFileId); + if (!originQnAFile.imports.find(({ id }) => manualContainerImportId === id)) { + originQnAFile = qnaUtil.addImport(originQnAFile, manualContainerImportId); } - updateFile(projectId, `${originQnAFile.id}.qna`, originQnAFile.content); updatedFiles.push(originQnAFile); // if container file not exist, create it. if exist, update it @@ -70,11 +69,9 @@ export const reformQnAToContainerKB = (projectId: string, qnaFiles: QnAFile[], l if (originManualContainerFile) { const updatedContent = originManualContainerFile.content + '\n' + manualContainerContent; const updatedFile = qnaUtil.parse(manualContainerFileId, updatedContent); - updateFile(projectId, `${updatedFile.id}.qna`, updatedFile.content); updatedFiles.push(updatedFile); } else { const createdFile = qnaUtil.parse(manualContainerFileId, manualContainerContent); - createFile(projectId, `${createdFile.id}.qna`, createdFile.content); createdFiles.push(createdFile); } }); @@ -103,14 +100,12 @@ export const copyQnAFilesOnOtherLocales = ( const createdFile = qnaUtil.parse('dummyId', originalSourceQnAFiles[i].content); for (let j = 0; j < newSourceQnAFileIds.length; j++) { if (!qnaFiles.find((f) => f.id === newSourceQnAFileIds[j])) { - createFile(projectId, `${newSourceQnAFileIds[j]}.qna`, createdFile.content); createdFiles.push({ ...createdFile, id: newSourceQnAFileIds[j], }); } } - deleteFile(projectId, `${originalSourceQnAFiles[i].id}.qna`); } for (let i = 0; i < containerKbFiles.length; i++) { @@ -119,7 +114,6 @@ export const copyQnAFilesOnOtherLocales = ( const createdFile = qnaUtil.parse('dummyId', containerKbFiles[i].content); for (let j = 0; j < newContainerKbFileIds.length; j++) { if (!qnaFiles.find((f) => f.id === newContainerKbFileIds[j])) { - createFile(projectId, `${newContainerKbFileIds[j]}.qna`, createdFile.content); createdFiles.push({ ...createdFile, id: newContainerKbFileIds[j],