Skip to content
This repository was archived by the owner on Jul 9, 2025. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from 54 commits
Commits
Show all changes
71 commits
Select commit Hold shift + click to select a range
ff774ff
Enable the get started widget to intelligently determine if LUIS or Q…
benbrown Mar 10, 2021
341485f
define nextsteps as an array that gets rendered
benbrown Mar 10, 2021
7cf855a
adjsut formating
benbrown Mar 10, 2021
1f17f6f
Merge branch 'main' into benbrown/getsmarted
benbrown Mar 10, 2021
b092013
Merge branch 'main' of https://github.com/microsoft/BotFramework-Comp…
benbrown Mar 15, 2021
38e1f42
move get started to top blue bar
benbrown Mar 15, 2021
a96a102
Add placeholder mvp luis keys modal
benbrown Mar 15, 2021
a9cacd9
add placeholder mvp qna key modal
benbrown Mar 15, 2021
117b497
introduce ProvisionHandoff component, to display customized instructi…
benbrown Mar 17, 2021
7b03f51
Merge branch 'main' of https://github.com/microsoft/BotFramework-Comp…
benbrown Mar 17, 2021
364016c
luis widget
benbrown Mar 18, 2021
765d843
Merge branch 'main' into benbrown/getsmarted
benbrown Mar 18, 2021
2105dab
updated styles and content for get started
benbrown Mar 22, 2021
fd702c1
clean up code
benbrown Mar 22, 2021
4f03203
Merge branch 'benbrown/getsmarted' of https://github.com/microsoft/Bo…
benbrown Mar 22, 2021
41d459b
add handoff step to luis widget
benbrown Mar 22, 2021
2ded7c2
add support for qnamaker provisioning
benbrown Mar 22, 2021
fbe62f9
merge main
benbrown Mar 22, 2021
1d415c1
remove unused css
benbrown Mar 22, 2021
3b69ced
Merge branch 'main' into benbrown/getsmarted
benbrown Mar 22, 2021
709f3de
clean up unused vars
benbrown Mar 23, 2021
b19dc34
Merge branch 'main' into benbrown/getsmarted
benbrown Mar 24, 2021
8e984c2
add final confirmation step to luis
benbrown Mar 24, 2021
5c95489
updated ux for luis
benbrown Mar 24, 2021
7b3a497
fix button disabled state
benbrown Mar 24, 2021
d2127d7
Merge branch 'benbrown/getsmarted' of https://github.com/microsoft/Bo…
benbrown Mar 24, 2021
ff12ee4
add generate request option to provisioning flow
benbrown Mar 24, 2021
53a3bd1
Merge branch 'main' of https://github.com/microsoft/BotFramework-Comp…
benbrown Mar 24, 2021
8414ddd
Merge branch 'benbrown/getsmarted' into benbrown/genreq
benbrown Mar 24, 2021
1ef07d8
ux fixes for luis
benbrown Mar 25, 2021
56a35ac
ux fixes for qna
benbrown Mar 25, 2021
f25a30a
Merge branch 'main' of https://github.com/microsoft/BotFramework-Comp…
benbrown Mar 25, 2021
0ca0e8a
magic teaching bubbs
benbrown Mar 25, 2021
26ca3bf
cleanup
benbrown Mar 25, 2021
592a7d7
fix weird issue
benbrown Mar 25, 2021
91762e7
Merge branch 'main' of https://github.com/microsoft/BotFramework-Comp…
benbrown Mar 25, 2021
f10e854
Wrapping up UI for provisioning hand off modal
pavolumMsft Mar 25, 2021
d4c1b02
Merge branch 'benbrown/getsmarted' of https://github.com/microsoft/Bo…
pavolumMsft Mar 25, 2021
6cfd483
Merge branch 'benbrown/getsmarted' of https://github.com/microsoft/Bo…
benbrown Mar 25, 2021
4744a6c
Merge branch 'main' of https://github.com/microsoft/BotFramework-Comp…
benbrown Mar 26, 2021
95a05db
revised links and buttons in get started
benbrown Mar 26, 2021
41a6aaa
Merge branch 'main' of https://github.com/microsoft/BotFramework-Comp…
benbrown Mar 26, 2021
d63a92a
remove unused styles
benbrown Mar 26, 2021
3b396eb
improve behavior of teaching bubbles during creation flow
benbrown Mar 26, 2021
8c9cdbd
highglight start bot when no steps are left
benbrown Mar 26, 2021
9143465
Merge branch 'main' into benbrown/getsmarted
benbrown Mar 26, 2021
4d16786
nav to page when opening modal
benbrown Mar 26, 2021
9e122ab
remove delete bot from settings page (still in toolbar)
benbrown Mar 26, 2021
338f7c4
make pane scrollable
benbrown Mar 26, 2021
4c80ff7
delete unused ref
benbrown Mar 26, 2021
29cf767
address issue with type mismatch in qna
benbrown Mar 26, 2021
0469da7
fix mock
benbrown Mar 26, 2021
966701d
fix test
benbrown Mar 26, 2021
5465e1a
Merge branch 'main' into benbrown/getsmarted
benbrown Mar 29, 2021
e426691
Merge branch 'main' into benbrown/getsmarted
benbrown Mar 29, 2021
7b97051
update syntax for accessing lufiles and qnafiles
benbrown Mar 29, 2021
93a304d
address pull request feedback
benbrown Mar 30, 2021
7c6ab48
Merge branch 'main' into benbrown/getsmarted
benbrown Mar 30, 2021
78f0ae4
locale
benbrown Mar 30, 2021
a6d8f10
Merge branch 'benbrown/getsmarted' of https://github.com/microsoft/Bo…
benbrown Mar 30, 2021
7eb5f63
Merge branch 'main' into benbrown/getsmarted
benbrown Mar 30, 2021
49a6efb
Merge branch 'main' into benbrown/getsmarted
beyackle Mar 30, 2021
1571926
Merge branch 'main' into benbrown/getsmarted
cwhitten Mar 31, 2021
860006d
Merge branch 'main' into benbrown/getsmarted
beyackle Mar 31, 2021
cb7b995
Merge branch 'main' into benbrown/getsmarted
beyackle Mar 31, 2021
b11c5c0
Merge branch 'benbrown/genreq' into benbrown/getsmarted
benbrown Mar 31, 2021
fb995de
fix merge conflict
benbrown Mar 31, 2021
e484f5a
Merge branch 'main' into benbrown/getsmarted
beyackle Mar 31, 2021
dcc79e5
Merge branch 'main' into benbrown/getsmarted
benbrown Mar 31, 2021
45688d6
Merge branch 'main' into benbrown/getsmarted
benbrown Mar 31, 2021
08ee9a5
Merge branch 'main' into benbrown/getsmarted
benbrown Mar 31, 2021
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions Composer/packages/client/__tests__/routers.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,10 @@ import { wrapWithRecoil } from './testUtils';
jest.mock('axios', () => ({
create: jest.fn().mockReturnThis(),
get: jest.fn(),
request: jest.fn(),
interceptors: {
request: { use: jest.fn() },
},
}));

function renderWithRouter(ui, { route = '/dialogs/home', history = createHistory(createMemorySource(route)) } = {}) {
Expand Down
5 changes: 5 additions & 0 deletions Composer/packages/client/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,12 @@
},
"proxy": "http://localhost:5000",
"dependencies": {
"@azure/arm-appinsights": "^3.0.0",
"@azure/arm-subscriptions": "^3.0.0",
"@azure/arm-cognitiveservices": "^5.2.0",
"@azure/arm-search": "^1.3.0",
"@azure/arm-appservice": "^6.0.0",
"@azure/arm-resources":"^4.0.0",
"@bfc/adaptive-flow": "*",
"@bfc/adaptive-form": "*",
"@bfc/code-editor": "*",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -224,6 +224,7 @@ const BotController: React.FC<BotControllerProps> = ({ onHideController, isContr
},
},
}}
id={'startbot'}
menuAs={() => null}
styles={{
root: {
Expand Down
187 changes: 57 additions & 130 deletions Composer/packages/client/src/components/GetStarted/GetStarted.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,148 +4,75 @@
/** @jsx jsx */
import { jsx } from '@emotion/core';
import React from 'react';
import { useRecoilValue } from 'recoil';
import formatMessage from 'format-message';
import { Stack } from 'office-ui-fabric-react/lib/Stack';
import { Link } from 'office-ui-fabric-react/lib/Link';
import { Panel } from 'office-ui-fabric-react/lib/Panel';
import { Panel, IPanelStyles } from 'office-ui-fabric-react/lib/Panel';
import { Pivot, PivotItem } from 'office-ui-fabric-react/lib/Pivot';

import { localBotsDataSelector } from '../../recoilModel/selectors/project';
import { currentProjectIdState, locationState } from '../../recoilModel';
import TelemetryClient from '../../telemetry/TelemetryClient';

import { h3Style, ulStyle, liStyle } from './styles';
import { GetStartedNextSteps } from './GetStartedNextSteps';
import { GetStartedLearn } from './GetStartedLearn';

type GetStartedProps = {
isOpen: boolean;
showTeachingBubble: boolean;
requiresLUIS: boolean;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nit: I see a lot of specific recognizer flags. We should consider having things like requiredRecognizers: string[], but it would have to be across the whole codebase.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is about requiring the Azure resource related to the recognizer, which right now is a pretty fixed list. HOWEVER, I agree, it would be nice for recognizers to automatically manifest the resources they require and populate this and other places.

one day!

requiresQNA: boolean;
onDismiss: () => void;
onBotReady: () => void;
};

export const GetStarted: React.FC<GetStartedProps> = (props) => {
const projectId = useRecoilValue(currentProjectIdState);
const location = useRecoilValue(locationState(projectId));
const botProjects = useRecoilValue(localBotsDataSelector);
const botProject = botProjects.find((b) => b.projectId === projectId);
export type NextSteps = {
checked: boolean;
key: string;
label: string;
checkedLabel: string;
onClick: () => void;
};

const linkToPackageManager = `/bot/${projectId}/plugin/package-manager/package-manager`;
const linkToConnections = `/bot/${projectId}/botProjectsSettings/#connections`;
const linkToProvision = `/bot/${projectId}/botProjectsSettings/#addNewPublishProfile`;
const linkToPublish = `/bot/${projectId}/publish`;
const linkToLGEditor = `/bot/${projectId}/language-generation`;
const linkToLUEditor = `/bot/${projectId}/language-understanding`;
const linkToAdaptiveExpressions =
'https://docs.microsoft.com/en-us/azure/bot-service/bot-builder-concept-adaptive-expressions?view=azure-bot-service-4.0&tabs=arithmetic';
const linkToGetStarted = 'https://docs.microsoft.com/en-us/composer/introduction';
const linkToCreateFirstBot = 'https://docs.microsoft.com/en-us/composer/quickstart-create-bot';
const linkToTutorials = 'https://docs.microsoft.com/en-us/composer/tutorial/tutorial-introduction';
const linkToLGFileFormat =
'https://docs.microsoft.com/en-us/azure/bot-service/file-format/bot-builder-lg-file-format?view=azure-bot-service-4.0';
const linkToLUFileFormat =
'https://docs.microsoft.com/en-us/azure/bot-service/file-format/bot-builder-lu-file-format?view=azure-bot-service-4.0';
const linkToPreBuiltExpressions =
'https://docs.microsoft.com/en-us/azure/bot-service/adaptive-expressions/adaptive-expressions-prebuilt-functions?view=azure-bot-service-4.0';
const panelStyles = {
root: {
marginTop: 50,
},
navigation: {
display: 'block',
height: 'auto',
},
} as IPanelStyles;

const linkClick = (event) => {
props.onDismiss();
TelemetryClient.track('GettingStartedLinkClicked', { method: 'link', url: event.target.href });
export const GetStarted: React.FC<GetStartedProps> = (props) => {
const renderTabs = () => {
return (
<Pivot styles={{ root: { paddingLeft: 20, paddingTop: 10, width: '100%' } }}>
Comment thread
benbrown marked this conversation as resolved.
Outdated
<PivotItem headerText={formatMessage('Next steps')}>
<GetStartedNextSteps
requiresLUIS={props.requiresLUIS}
requiresQNA={props.requiresQNA}
showTeachingBubble={props.showTeachingBubble}
onBotReady={props.onBotReady}
onDismiss={props.onDismiss}
Comment thread
benbrown marked this conversation as resolved.
Outdated
/>
</PivotItem>
<PivotItem headerText={formatMessage('Learning')}>
<GetStartedLearn />
</PivotItem>
</Pivot>
);
};

const onRenderNavigationContent = React.useCallback(
(props, defaultRender) => (
<div css={{ position: 'absolute', top: 15, right: 0, zIndex: 1 }}>{defaultRender(props)}</div>
),
[]
);

return (
<Panel headerText={botProject?.name} isOpen={props.isOpen} onDismiss={props.onDismiss}>
<Stack>
<Stack.Item grow={0}>
<p>
{formatMessage('File Location:')}
<span
style={{
display: 'inline-block',
overflowWrap: 'break-word',
maxWidth: '100%',
fontSize: 12,
}}
>
{location}
</span>
</p>
</Stack.Item>
<Stack.Item>
<h3 style={h3Style}>{formatMessage('Next steps')}</h3>
{formatMessage('Customize')}
<ul style={ulStyle}>
<li style={liStyle}>
<Link href={linkToPackageManager} onClick={linkClick}>
{formatMessage('Add and remove packages')}
</Link>
</li>
<li style={liStyle}>
<Link href={linkToLGEditor} onClick={linkClick}>
{formatMessage('Edit what your bot says')}
</Link>
</li>
<li style={liStyle}>
<Link href={linkToLUEditor} onClick={linkClick}>
{formatMessage('Train your language model')}
</Link>
</li>
<li style={liStyle}>
<Link href={linkToConnections} onClick={linkClick}>
{formatMessage('Connect your bot to new services')}
</Link>
</li>
</ul>
{formatMessage('Publish')}
<ul style={ulStyle}>
<li style={liStyle}>
<Link href={linkToProvision} onClick={linkClick}>
{formatMessage('Create a cloud hosting environment')}
</Link>
</li>
<li style={liStyle}>
<Link href={linkToPublish} onClick={linkClick}>
{formatMessage('Publish updates to the cloud')}
</Link>
</li>
</ul>
<h3 style={h3Style}>{formatMessage('Guides and references')}</h3>
<ul style={ulStyle}>
<li style={liStyle}>
<Link href={linkToGetStarted} target="_blank" onClick={linkClick}>
{formatMessage('Get started with Bot Framework Composer')}
</Link>
</li>
<li style={liStyle}>
<Link href={linkToCreateFirstBot} target="_blank" onClick={linkClick}>
{formatMessage('Create your first bot')}
</Link>
</li>
<li style={liStyle}>
<Link href={linkToTutorials} target="_blank" onClick={linkClick}>
{formatMessage('Composer tutorials')}
</Link>
</li>
<li style={liStyle}>
<Link href={linkToAdaptiveExpressions} target="_blank" onClick={linkClick}>
{formatMessage('Learn about Adaptive expressions')}
</Link>
</li>
<li style={liStyle}>
<Link href={linkToPreBuiltExpressions} target="_blank" onClick={linkClick}>
{formatMessage('Find pre-built Adaptive expressions')}
</Link>
</li>
<li style={liStyle}>
<Link href={linkToLUFileFormat} target="_blank" onClick={linkClick}>
{formatMessage('LU file format and syntax')}
</Link>
</li>
<li style={liStyle}>
<Link href={linkToLGFileFormat} target="_blank" onClick={linkClick}>
{formatMessage('LG file format and syntax')}
</Link>
</li>
</ul>
</Stack.Item>
</Stack>
</Panel>
<Panel
isBlocking={false}
isOpen={props.isOpen}
styles={panelStyles}
onDismiss={props.onDismiss}
onRenderHeader={renderTabs}
onRenderNavigationContent={onRenderNavigationContent}
/>
);
};
119 changes: 119 additions & 0 deletions Composer/packages/client/src/components/GetStarted/GetStartedLearn.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,119 @@
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT License.

/** @jsx jsx */
import { jsx } from '@emotion/core';
import React from 'react';
import formatMessage from 'format-message';
import { Link } from 'office-ui-fabric-react/lib/Link';
import { ScrollablePane } from 'office-ui-fabric-react/lib/ScrollablePane';

import TelemetryClient from '../../telemetry/TelemetryClient';

import { h3Style, ulStyle, liStyle } from './styles';

const linkToEmulator = 'https://aka.ms/composer-getstarted-emulator';
const linkToQNA = 'https://aka.ms/composer-getstarted-qnamaker';
const linkToPackages = 'https://aka.ms/composer-getstarted-packages';
const linkToImport = 'https://aka.ms/composer-getstarted-importpublishing';
const linkToPVA = 'https://aka.ms/composer-getstarted-pva';
const linkToMigrate = 'https://aka.ms/composer-getstarted-migrate';
const linkToFeatureRequest = 'https://aka.ms/composer-getstarted-featurerequest';

const linkToAdaptiveExpressions = 'https://aka.ms/composer-getstarted-adaptiveexpressions';
const linkToGetStarted = 'https://aka.ms/composer-getstarted-getstarted';
const linkToCreateFirstBot = 'https://aka.ms/composer-getstarted-quickstart';
const linkToTutorials = 'https://aka.ms/composer-getstarted-tutorials';
const linkToLGFileFormat = 'https://aka.ms/composer-getstarted-lgfiles';
const linkToLUFileFormat = 'https://aka.ms/composer-getstarted-lufiles';
const linkToPreBuiltExpressions = 'https://aka.ms/composer-getstarted-prebuilt';

const linkClick = (event) => {
TelemetryClient.track('GettingStartedLinkClicked', { method: 'link', url: event.target.href });
};

export const GetStartedLearn: React.FC = () => {
return (
<ScrollablePane styles={{ root: { marginTop: 60 } }}>
<div css={{ paddingTop: 20, paddingLeft: 27, paddingRight: 20 }}>
<h3 style={h3Style}>{formatMessage('Get started')}</h3>
<ul style={ulStyle}>
<li style={liStyle}>
<Link href={linkToGetStarted} target="_blank" onClick={linkClick}>
{formatMessage('Get started with Bot Framework Composer')}
</Link>
</li>
<li style={liStyle}>
<Link href={linkToCreateFirstBot} target="_blank" onClick={linkClick}>
{formatMessage('Create your first bot')}
</Link>
</li>
<li style={liStyle}>
<Link href={linkToTutorials} target="_blank" onClick={linkClick}>
{formatMessage('Composer tutorials')}
</Link>
</li>
<li style={liStyle}>
<Link href={linkToEmulator} target="_blank" onClick={linkClick}>
{formatMessage('Setting up Bot Framework Emulator')}
</Link>
</li>
<li style={liStyle}>
<Link href={linkToQNA} target="_blank" onClick={linkClick}>
{formatMessage('QnA Maker introduction')}
</Link>
</li>
<li style={liStyle}>
<Link href={linkToPackages} target="_blank" onClick={linkClick}>
{formatMessage('Working with packages')}
</Link>
</li>
</ul>

<h3 style={h3Style}>{formatMessage('Quick references')}</h3>
<ul style={ulStyle}>
<li style={liStyle}>
<Link href={linkToAdaptiveExpressions} target="_blank" onClick={linkClick}>
{formatMessage('Learn about Adaptive expressions')}
</Link>
</li>
<li style={liStyle}>
<Link href={linkToPreBuiltExpressions} target="_blank" onClick={linkClick}>
{formatMessage('Find pre-built Adaptive expressions')}
</Link>
</li>
<li style={liStyle}>
<Link href={linkToLUFileFormat} target="_blank" onClick={linkClick}>
{formatMessage('LU file format and syntax')}
</Link>
</li>
<li style={liStyle}>
<Link href={linkToLGFileFormat} target="_blank" onClick={linkClick}>
{formatMessage('LG file format and syntax')}
</Link>
</li>
<li style={liStyle}>
<Link href={linkToImport} target="_blank" onClick={linkClick}>
{formatMessage('Importing a publishing profile')}
</Link>
</li>
<li style={liStyle}>
<Link href={linkToPVA} target="_blank" onClick={linkClick}>
{formatMessage('Integrating with Power Virtual Agents')}
</Link>
</li>
<li style={liStyle}>
<Link href={linkToMigrate} target="_blank" onClick={linkClick}>
{formatMessage('Migrating to Composer')}
</Link>
</li>
<li style={liStyle}>
<Link href={linkToFeatureRequest} target="_blank" onClick={linkClick}>
{formatMessage('Submit a feature request')}
</Link>
</li>
</ul>
</div>
</ScrollablePane>
);
};
Loading