diff --git a/Composer/cypress/integration/ToDoBot.spec.js b/Composer/cypress/integration/ToDoBot.spec.js index 1ab7ca638b..ffae862f35 100644 --- a/Composer/cypress/integration/ToDoBot.spec.js +++ b/Composer/cypress/integration/ToDoBot.spec.js @@ -25,10 +25,6 @@ context('ToDo Bot', () => { cy.withinEditor('FormEditor', () => { cy.getByDisplayValue('AddToDo').should('exist'); }); - - cy.withinEditor('VisualEditor', () => { - cy.getByText(/Successfully added a todo named/).should('exist'); - }); }); it('can open the ClearToDos dialog', () => { @@ -40,9 +36,6 @@ context('ToDo Bot', () => { cy.withinEditor('FormEditor', () => { cy.getByDisplayValue('ClearToDos').should('exist'); }); - cy.withinEditor('VisualEditor', () => { - cy.getByText(/Successfully cleared items/).should('exist'); - }); }); it('can open the DeleteToDo dialog', () => { @@ -54,9 +47,6 @@ context('ToDo Bot', () => { cy.withinEditor('FormEditor', () => { cy.getByDisplayValue('DeleteToDo').should('exist'); }); - cy.withinEditor('VisualEditor', () => { - cy.getByText('Edit an Array Property').should('exist'); - }); }); it('can open the ShowToDos dialog', () => { @@ -68,8 +58,5 @@ context('ToDo Bot', () => { cy.withinEditor('FormEditor', () => { cy.getByDisplayValue('ShowToDos').should('exist'); }); - cy.withinEditor('VisualEditor', () => { - cy.getByText('You have no todos.').should('exist'); - }); }); }); diff --git a/Composer/packages/client/src/ShellApi.ts b/Composer/packages/client/src/ShellApi.ts index 4f08ee333f..a9bb3c989f 100644 --- a/Composer/packages/client/src/ShellApi.ts +++ b/Composer/packages/client/src/ShellApi.ts @@ -151,7 +151,7 @@ export const ShellApi: React.FC = () => { if (sourceWindow === VISUAL_EDITOR && dialogId !== '') { return getDialogData(dialogsMap, dialogId); } else if (sourceWindow === FORM_EDITOR && focusPath !== '') { - return getDialogData(dialogsMap, dialogId, focused || ''); + return getDialogData(dialogsMap, dialogId, focused || selected || ''); } return ''; @@ -170,7 +170,7 @@ export const ShellApi: React.FC = () => { currentDialog, dialogId, focusedEvent: selected, - focusedSteps: focused ? [focused] : [], + focusedSteps: focused ? [focused] : selected ? [selected] : [], }; } diff --git a/Composer/packages/client/src/components/ProjectTree/index.tsx b/Composer/packages/client/src/components/ProjectTree/index.tsx index 5066dcfd14..a0d009a994 100644 --- a/Composer/packages/client/src/components/ProjectTree/index.tsx +++ b/Composer/packages/client/src/components/ProjectTree/index.tsx @@ -1,21 +1,21 @@ -import React, { useRef, useMemo, useState } from 'react'; -import { cloneDeep } from 'lodash'; import { + ActionButton, GroupedList, IGroup, IGroupHeaderProps, IGroupRenderProps, IGroupedList, - ActionButton, IIconProps, SearchBox, } from 'office-ui-fabric-react'; +import React, { useMemo, useRef, useState } from 'react'; +import { cloneDeep } from 'lodash'; import formatMessage from 'format-message'; import { DialogInfo, ITrigger } from '../../store/types'; -import { getFriendlyName, createSelectedPath } from '../../utils'; +import { createSelectedPath, getFriendlyName } from '../../utils'; -import { groupListStyle, addButton, root, searchBox } from './styles'; +import { addButton, groupListStyle, root, searchBox } from './styles'; import { TreeItem } from './treeItem'; export function createGroupItem(dialog: DialogInfo, currentId: string, position: number) { @@ -103,19 +103,16 @@ export const ProjectTree: React.FC = props => { const onRenderHeader = (props: IGroupHeaderProps) => { const toggleCollapse = (): void => { - if (groupRef.current && props.group) { - groupRef.current.toggleCollapseAll(true); - props.onToggleCollapse!(props.group); - if (dialogId !== props.group.key) { - onSelect(props.group.key); - } - } + groupRef.current!.toggleCollapseAll(true); + props.onToggleCollapse!(props.group!); + onSelect(props.group!.key); }; return ( diff --git a/Composer/packages/client/src/components/ProjectTree/styles.ts b/Composer/packages/client/src/components/ProjectTree/styles.ts index 3a1bb039c5..b85abb69c7 100644 --- a/Composer/packages/client/src/components/ProjectTree/styles.ts +++ b/Composer/packages/client/src/components/ProjectTree/styles.ts @@ -26,12 +26,12 @@ export const root = css` overflow-y: auto; `; -export const navItem = (isActive: boolean, depth: number) => css` +export const navItem = (isActive: boolean, isSubItemActive: boolean) => css` width: 100%; position: relative; font-size: 12px; color: #605e5c; - background: ${isActive && depth !== 0 ? '#f2f2f2' : 'transparent'}; + background: ${isActive && !isSubItemActive ? '#f2f2f2' : 'transparent'}; font-weight: ${isActive ? FontWeights.semibold : FontWeights.regular}; &: hover { color: #605e5c; diff --git a/Composer/packages/client/src/components/ProjectTree/treeItem.js b/Composer/packages/client/src/components/ProjectTree/treeItem.js index 952cae357d..79c644d4c9 100644 --- a/Composer/packages/client/src/components/ProjectTree/treeItem.js +++ b/Composer/packages/client/src/components/ProjectTree/treeItem.js @@ -25,11 +25,11 @@ const onRenderOverflowButton = overflowItems => { }; export const TreeItem = props => { - const { link, isActive, depth, onDelete, onSelect } = props; + const { link, isActive, isSubItemActive, depth, onDelete, onSelect } = props; return (
{ onSelect(link.id); }} diff --git a/Composer/packages/client/src/pages/design/index.js b/Composer/packages/client/src/pages/design/index.js index 38cc1d02a3..4ce215d8cf 100644 --- a/Composer/packages/client/src/pages/design/index.js +++ b/Composer/packages/client/src/pages/design/index.js @@ -7,33 +7,33 @@ import { toLower, get } from 'lodash'; import { VisualEditorAPI } from '../../messenger/FrameAPI'; import { TestController } from '../../TestController'; import { BASEPATH, DialogDeleting } from '../../constants'; -import { getbreadcrumbLabel, deleteTrigger, createSelectedPath } from '../../utils'; +import { createSelectedPath, deleteTrigger, getbreadcrumbLabel } from '../../utils'; import { TriggerCreationModal } from '../../components/ProjectTree/TriggerCreationModal'; import { Conversation } from './../../components/Conversation'; +import { DialogStyle } from './../../components/Modal/styles'; +import NewDialogModal from './new-dialog-modal'; +import { OpenConfirmModal } from './../../components/Modal/Confirm'; import { ProjectTree } from './../../components/ProjectTree'; import { StoreContext } from './../../store'; +import { ToolBar } from './../../components/ToolBar/index'; +import { clearBreadcrumb } from './../../utils/navigation'; +import { getNewDesigner } from './../../utils/dialogUtil'; +import undoHistory from './../../store/middlewares/undo/history'; import { - pageRoot, - contentWrapper, breadcrumbClass, + contentWrapper, + deleteDialogContent, editorContainer, - visualPanel, - visualEditor, - formEditor, editorWrapper, - deleteDialogContent, + formEditor, middleTriggerContainer, middleTriggerElements, + pageRoot, triggerButton, + visualEditor, + visualPanel, } from './styles'; -import NewDialogModal from './new-dialog-modal'; -import { ToolBar } from './../../components/ToolBar/index'; -import { OpenConfirmModal } from './../../components/Modal/Confirm'; -import { DialogStyle } from './../../components/Modal/styles'; -import { clearBreadcrumb } from './../../utils/navigation'; -import undoHistory from './../../store/middlewares/undo/history'; -import { getNewDesigner } from './../../utils/dialogUtil'; const addIconProps = { iconName: 'CircleAddition', @@ -59,6 +59,32 @@ function onRenderBreadcrumbItem(item, render) { ); } +function onRenderBlankVisual(isTriggerEmpty, onClickAddTrigger) { + return ( +
+
+ {isTriggerEmpty ? ( + + {formatMessage(`This dialog has no trigger yet.`)} + + {formatMessage('New Trigger ..')} + + + ) : ( +
+ {formatMessage('Select a trigger on the left')}
{formatMessage('navigation to see actions')} +
+ )} +
+
+ ); +} + function getAllRef(targetId, dialogs) { let refs = []; dialogs.forEach(dialog => { @@ -338,24 +364,10 @@ function DesignPage(props) { key="VisualEditor" name="VisualEditor" css={visualEditor} - hidden={triggerButtonVisible} + hidden={triggerButtonVisible || !selected} src={`${rootPath}/extensionContainer.html`} /> - {triggerButtonVisible && ( -
-
- {formatMessage(`This dialog has no triggers configured`)} - - {formatMessage('New Trigger ..')} - -
-
- )} + {!selected && onRenderBlankVisual(triggerButtonVisible, openNewTriggerModal)}