diff --git a/Composer/packages/client/src/components/ProjectTree/ProjectTree.tsx b/Composer/packages/client/src/components/ProjectTree/ProjectTree.tsx index 038e2df623..90b7d048c2 100644 --- a/Composer/packages/client/src/components/ProjectTree/ProjectTree.tsx +++ b/Composer/packages/client/src/components/ProjectTree/ProjectTree.tsx @@ -305,13 +305,17 @@ export const ProjectTree: React.FC = ({ isActive={doesLinkMatch(link, selectedLink)} link={link} menu={[ - { - label: formatMessage('Remove this dialog'), - icon: 'Delete', - onClick: (link) => { - onDeleteDialog(link.dialogId ?? ''); - }, - }, + ...(!dialog.isRoot + ? [ + { + label: formatMessage('Remove this dialog'), + icon: 'Delete', + onClick: (link) => { + onDeleteDialog(link.dialogId ?? ''); + }, + }, + ] + : []), ...(showEditSchema ? [ { diff --git a/Composer/packages/server/src/controllers/formDialog.ts b/Composer/packages/server/src/controllers/formDialog.ts index 5d793f0137..f7b8856404 100644 --- a/Composer/packages/server/src/controllers/formDialog.ts +++ b/Composer/packages/server/src/controllers/formDialog.ts @@ -85,9 +85,19 @@ const deleteDialog = async (req: Request, res: Response) => { const currentProject = await BotProjectService.getProjectById(projectId, user); if (currentProject !== undefined) { - await currentProject.deleteFormDialog(dialogId); - const updatedProject = await BotProjectService.getProjectById(projectId, user); - res.status(200).json({ id: projectId, ...updatedProject.getProject() }); + try { + const rootDialogId = currentProject.rootDialogId; + if (rootDialogId === dialogId) { + throw new Error('root dialog is not allowed to delete'); + } + await currentProject.deleteFormDialog(dialogId); + const updatedProject = await BotProjectService.getProjectById(projectId, user); + res.status(200).json({ id: projectId, ...updatedProject.getProject() }); + } catch (e) { + res.status(400).json({ + message: e.message, + }); + } } else { res.status(404).json({ message: `Could not delete form dialog. Project ${projectId} not found.`,