From b68246b81631fc4d116ac754319d4dd0b26bb6b1 Mon Sep 17 00:00:00 2001
From: Julie G <43496356+julieg18@users.noreply.github.com>
Date: Wed, 31 May 2023 10:18:16 -0500
Subject: [PATCH] Consolidate Setup and "Get Started" walkthrough (#3993)
---
README.md | 20 +++---
extension/package.json | 30 +--------
.../resources/walkthrough/command-palette.md | 4 ++
.../walkthrough/experiments-table.md | 4 --
.../install-dvc-status-bar-detected.png | Bin 16106 -> 0 bytes
.../resources/walkthrough/install-dvc.md | 22 -------
.../resources/walkthrough/setup-project.md | 60 ------------------
extension/src/extension.ts | 8 +--
.../util.test.ts} | 42 ++++++------
extension/src/setup/util.ts | 27 ++++++++
extension/src/vscode/config.ts | 2 +-
extension/src/vscode/walkthrough.ts | 28 --------
webview/src/setup/components/App.test.tsx | 55 +++++++++++++---
webview/src/setup/components/App.tsx | 8 ++-
webview/src/setup/components/GetStarted.tsx | 16 ++++-
.../setup/components/dvc/CliUnavailable.tsx | 26 ++++++--
.../setup/components/dvc/DvcUnitialized.tsx | 7 +-
.../components/experiments/Experiments.tsx | 8 +--
.../setup/components/shared/DvcNotSetup.tsx | 11 ++++
19 files changed, 174 insertions(+), 204 deletions(-)
delete mode 100644 extension/resources/walkthrough/images/install-dvc-status-bar-detected.png
delete mode 100644 extension/resources/walkthrough/install-dvc.md
delete mode 100644 extension/resources/walkthrough/setup-project.md
rename extension/src/{vscode/walkthrough.test.ts => setup/util.test.ts} (66%)
create mode 100644 extension/src/setup/util.ts
create mode 100644 webview/src/setup/components/shared/DvcNotSetup.tsx
diff --git a/README.md b/README.md
index 2b7c136934..b27ca30a2f 100644
--- a/README.md
+++ b/README.md
@@ -146,16 +146,16 @@ These are the VS Code [settings] available for the Extension:
[settings]: https://code.visualstudio.com/docs/getstarted/settings
-| **Option** | **Description** |
-| -------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| `dvc.dvcPath` | Path or shell command to the DVC binary. Required unless Microsoft's [Python extension] is installed and the `dvc` package found in its environment. |
-| `dvc.pythonPath` | Path to the desired Python interpreter to use with DVC. Should only be utilized when using a virtual environment without Microsoft's [Python extension]. |
-| `dvc.experimentsTableHeadMaxHeight` | Maximum height of experiment table head rows. |
-| `dvc.focusedProjects` | A subset of paths to the workspace's available DVC projects. Using this option will override project auto-discovery. |
-| `dvc.doNotShowWalkthroughAfterInstall` | Do not prompt to show the Get Started page after installing. Useful for pre-configured development environments |
-| `dvc.doNotRecommendAddStudioToken` | Do not prompt to add a [studio.token] to the global DVC config, which enables automatic sharing of experiments to [Studio]. |
-| `dvc.doNotRecommendRedHatExtension` | Do not prompt to install the Red Hat YAML extension, which helps with DVC YAML schema validation (`dvc.yaml` and `.dvc` files). |
-| `dvc.doNotShowCliUnavailable` | Do not warn when the workspace contains a DVC project but the DVC binary is unavailable. |
+| **Option** | **Description** |
+| ----------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `dvc.dvcPath` | Path or shell command to the DVC binary. Required unless Microsoft's [Python extension] is installed and the `dvc` package found in its environment. |
+| `dvc.pythonPath` | Path to the desired Python interpreter to use with DVC. Should only be utilized when using a virtual environment without Microsoft's [Python extension]. |
+| `dvc.experimentsTableHeadMaxHeight` | Maximum height of experiment table head rows. |
+| `dvc.focusedProjects` | A subset of paths to the workspace's available DVC projects. Using this option will override project auto-discovery. |
+| `dvc.doNotShowSetupAfterInstall` | Do not prompt to show the setup page after installing. Useful for pre-configured development environments |
+| `dvc.doNotRecommendAddStudioToken` | Do not prompt to add a [studio.token] to the global DVC config, which enables automatic sharing of experiments to [Studio]. |
+| `dvc.doNotRecommendRedHatExtension` | Do not prompt to install the Red Hat YAML extension, which helps with DVC YAML schema validation (`dvc.yaml` and `.dvc` files). |
+| `dvc.doNotShowCliUnavailable` | Do not warn when the workspace contains a DVC project but the DVC binary is unavailable. |
> **Note** that the `Setup The Workspace` command helps you set up the basic
> ones at the [Workspace level] (saved to `.vscode/setting.json`).
diff --git a/extension/package.json b/extension/package.json
index 87fa760224..2073c1b1d7 100644
--- a/extension/package.json
+++ b/extension/package.json
@@ -615,8 +615,8 @@
"type": "boolean",
"default": null
},
- "dvc.doNotShowWalkthroughAfterInstall": {
- "description": "Do not prompt to show the Get Started page after installing. Useful for pre-configured development environments.",
+ "dvc.doNotShowSetupAfterInstall": {
+ "description": "Do not prompt to show the setup page after installing. Useful for pre-configured development environments.",
"type": "boolean",
"default": null
},
@@ -1512,32 +1512,6 @@
"title": "Get Started",
"description": "Your first steps to build better models faster with experiment tracking and dataset versioning",
"steps": [
- {
- "id": "dvc.installDVC",
- "title": "Install DVC",
- "description": "This extension requires DVC to be installed.\n\n[Show Setup](command:dvc.showDvcSetup)\n",
- "media": {
- "markdown": "resources/walkthrough/install-dvc.md"
- },
- "completionEvents": [
- "onLink:https://dvc.org",
- "onLink:https://dvc.org/doc/install",
- "onCommand:dvc.setupWorkspace"
- ]
- },
- {
- "id": "dvc.setupProject",
- "title": "Setup a DVC Project",
- "description": "Try an example DVC project or set one up quickly, and start tracking datasets, models, metrics, and plots\n\n[Example Project](https://github.com/iterative/example-get-started)\n",
- "media": {
- "markdown": "resources/walkthrough/setup-project.md"
- },
- "completionEvents": [
- "onLink:https://github.com/iterative/example-get-started",
- "onLink:https://github.com/iterative/vscode-dvc-demo",
- "onLink:https://dvc.org/doc/dvclive"
- ]
- },
{
"id": "dvc.showCommands",
"title": "Available Commands",
diff --git a/extension/resources/walkthrough/command-palette.md b/extension/resources/walkthrough/command-palette.md
index f739f9ecfb..2a00b53e1f 100644
--- a/extension/resources/walkthrough/command-palette.md
+++ b/extension/resources/walkthrough/command-palette.md
@@ -1,3 +1,7 @@
+> ℹ️ The extension's features cannot be accessed until DVC is installed and a
+> DVC project is available in the workspace. Please refer to the
+> [setup page](command:dvc.dvc.showDvcSetup) if you have not setup DVC yet.
+
# Command Palette
This extension makes extensive use of the
diff --git a/extension/resources/walkthrough/experiments-table.md b/extension/resources/walkthrough/experiments-table.md
index b66a1f7553..c3114543f5 100644
--- a/extension/resources/walkthrough/experiments-table.md
+++ b/extension/resources/walkthrough/experiments-table.md
@@ -1,9 +1,5 @@
# Experiments Table
-> ❗ DVC should be installed and DVC project available in the workspace for this
-> and the next steps to work properly. Please refer to first two steps of this
-> guide.
-
As you change code, parameters, data and run new experiments this table will
keep all the details about your iterations. It can be manipulated and configured
using the [DVC side panel](command:workbench.view.extension.dvc-views). This is
diff --git a/extension/resources/walkthrough/images/install-dvc-status-bar-detected.png b/extension/resources/walkthrough/images/install-dvc-status-bar-detected.png
deleted file mode 100644
index 41982b3ee8c287dd44c52df0b5afe4c980de5aa0..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 16106
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
-
-
-
-If you see instead the crossed circle icon, click on the icon or follow the
-[Setup](command:dvc.showDvcSetup) wizard.
-
-> **Note**: The correct Python interpreter must be set for the current workspace
-> when relying on the Python extension for auto environment activation.
diff --git a/extension/resources/walkthrough/setup-project.md b/extension/resources/walkthrough/setup-project.md
deleted file mode 100644
index 73f6a0572e..0000000000
--- a/extension/resources/walkthrough/setup-project.md
+++ /dev/null
@@ -1,60 +0,0 @@
-# Setup a DVC Project
-
-> Skip this step if you already have a DVC project with metrics, plots, and
-> params.
-
-💡 Check out the
-[DVC Get Started](https://github.com/iterative/example-get-started) or
-[Extension Demo](https://github.com/iterative/vscode-dvc-demo) projects to
-quickly try the extension.
-
-To quickly setup a new DVC project run
-[`dvc exp init -i`](https://dvc.org/doc/command-reference/exp/init#example-interactive-mode)
-in a [Terminal](command:workbench.action.terminal.new). It will generate a
-config file `dvc.yaml` that describes the project, and will look something like
-this:
-
-```yaml
-train:
- cmd: python src/train.py
- deps:
- - data/features
- - src/train.py
- params:
- - epochs
- outs:
- - models/predict.h5
- metrics:
- - metrics.json:
- cache: false
-```
-
-💡 Names, values in this file are project dependent and can be customized.
-
-DVC and this extension read experiments data from these files (e.g
-`metrics.json`, `params.yaml`, etc). Your code needs to write and read to them
-(the example below is Python, but it can be done in any language):
-
-```python
-with open('metrics.json', 'w') as fd:
- json.dump({'avg_prec': avg_prec, 'roc_auc': roc_auc}, fd)
-```
-
-To DVC-ify an existing machine learning project use the
-[`DVCLive`](https://dvc.org/doc/dvclive) Python library, which can read and
-write a lot of different common metrics and plots:
-
-```python
-from dvclive import Live
-
-live = Live("evaluation")
-
-live.log("avg_prec", metrics.average_precision_score(labels, predictions))
-live.log("roc_auc", metrics.roc_auc_score(labels, predictions))
-```
-
-💡 View
-[Instant Experiment Tracking: Just Add DVC!](https://iterative.ai/blog/exp-tracking-dvc-python)
-for a quick-start guide on migrating an existing project. Use
-[Setup](command:dvc.showExperimentsSetup) to be guided through the onboarding
-process.
diff --git a/extension/src/extension.ts b/extension/src/extension.ts
index cb4fdee044..e2a7560c72 100644
--- a/extension/src/extension.ts
+++ b/extension/src/extension.ts
@@ -29,10 +29,8 @@ import {
} from './telemetry'
import { RegisteredCommands } from './commands/external'
import { StopWatch } from './util/time'
-import {
- registerWalkthroughCommands,
- showWalkthroughOnFirstUse
-} from './vscode/walkthrough'
+import { registerWalkthroughCommands } from './vscode/walkthrough'
+import { showSetupOnFirstUse } from './setup/util'
import { WorkspaceRepositories } from './repository/workspace'
import { recommendRedHatExtensionOnce } from './vscode/recommend'
import { WorkspacePlots } from './plots/workspace'
@@ -258,7 +256,7 @@ class Extension extends Disposable {
registerPersistenceCommands(context.workspaceState, this.internalCommands)
- void showWalkthroughOnFirstUse(env.isNewAppInstall)
+ void showSetupOnFirstUse(env.isNewAppInstall)
this.dispose.track(recommendRedHatExtensionOnce())
this.dispose.track(new LanguageClient())
diff --git a/extension/src/vscode/walkthrough.test.ts b/extension/src/setup/util.test.ts
similarity index 66%
rename from extension/src/vscode/walkthrough.test.ts
rename to extension/src/setup/util.test.ts
index 03019e9635..12fc9bb2f6 100644
--- a/extension/src/vscode/walkthrough.test.ts
+++ b/extension/src/setup/util.test.ts
@@ -1,13 +1,13 @@
import { commands } from 'vscode'
-import { showWalkthroughOnFirstUse } from './walkthrough'
-import { ConfigKey, getConfigValue, setUserConfigValue } from './config'
-import { Toast } from './toast'
-import { Response } from './response'
+import { showSetupOnFirstUse } from './util'
+import { ConfigKey, getConfigValue, setUserConfigValue } from '../vscode/config'
+import { Toast } from '../vscode/toast'
+import { Response } from '../vscode/response'
import { RegisteredCommands } from '../commands/external'
jest.mock('vscode')
-jest.mock('./toast')
-jest.mock('./config')
+jest.mock('../vscode/toast')
+jest.mock('../vscode/config')
const mockedCommands = jest.mocked(commands)
const mockedExecuteCommand = jest.fn()
@@ -24,51 +24,51 @@ beforeEach(() => {
jest.resetAllMocks()
})
-describe('showWalkthroughOnFirstUse', () => {
- it('should ask to show the walkthrough after a new install', async () => {
- await showWalkthroughOnFirstUse(true)
+describe('showSetupOnFirstUse', () => {
+ it('should ask to show the setup page after a new install', async () => {
+ await showSetupOnFirstUse(true)
expect(mockedAskShowOrCloseOrNever).toHaveBeenCalledTimes(1)
})
- it('should not ask to show the walkthrough when the install is not new', async () => {
- await showWalkthroughOnFirstUse(false)
+ it('should not ask to show the setup page when the install is not new', async () => {
+ await showSetupOnFirstUse(false)
expect(mockedAskShowOrCloseOrNever).not.toHaveBeenCalled()
})
- it('should not ask to show the walkthrough when the user has set a config option', async () => {
+ it('should not ask to show the setup page when the user has set a config option', async () => {
mockedGetConfigValue.mockReturnValueOnce(true)
- await showWalkthroughOnFirstUse(true)
+ await showSetupOnFirstUse(true)
expect(mockedAskShowOrCloseOrNever).not.toHaveBeenCalled()
expect(mockedGetConfigValue).toHaveBeenCalledTimes(1)
expect(mockedGetConfigValue).toHaveBeenCalledWith(
- ConfigKey.DO_NOT_SHOW_WALKTHROUGH_AFTER_INSTALL
+ ConfigKey.DO_NOT_SHOW_SETUP_AFTER_INSTALL
)
})
it('should set the config option if the user responds with never', async () => {
mockedAskShowOrCloseOrNever.mockResolvedValueOnce(Response.NEVER)
- await showWalkthroughOnFirstUse(true)
+ await showSetupOnFirstUse(true)
expect(mockedSetConfigValue).toHaveBeenCalledTimes(1)
expect(mockedSetConfigValue).toHaveBeenCalledWith(
- ConfigKey.DO_NOT_SHOW_WALKTHROUGH_AFTER_INSTALL,
+ ConfigKey.DO_NOT_SHOW_SETUP_AFTER_INSTALL,
true
)
})
- it('should show the walkthrough if the user responds with show', async () => {
+ it('should show the setup page if the user responds with show', async () => {
mockedAskShowOrCloseOrNever.mockResolvedValueOnce(Response.SHOW)
- await showWalkthroughOnFirstUse(true)
+ await showSetupOnFirstUse(true)
expect(mockedSetConfigValue).not.toHaveBeenCalled()
expect(mockedExecuteCommand).toHaveBeenCalledWith(
- RegisteredCommands.EXTENSION_GET_STARTED
+ RegisteredCommands.SETUP_SHOW
)
})
it('should take no action if the user closes the dialog', async () => {
mockedAskShowOrCloseOrNever.mockResolvedValueOnce(undefined)
- await showWalkthroughOnFirstUse(true)
+ await showSetupOnFirstUse(true)
expect(mockedSetConfigValue).not.toHaveBeenCalled()
expect(mockedExecuteCommand).not.toHaveBeenCalled()
@@ -76,7 +76,7 @@ describe('showWalkthroughOnFirstUse', () => {
it('should take no action if the user respond with close', async () => {
mockedAskShowOrCloseOrNever.mockResolvedValueOnce(Response.CLOSE)
- await showWalkthroughOnFirstUse(true)
+ await showSetupOnFirstUse(true)
expect(mockedSetConfigValue).not.toHaveBeenCalled()
expect(mockedExecuteCommand).not.toHaveBeenCalled()
diff --git a/extension/src/setup/util.ts b/extension/src/setup/util.ts
new file mode 100644
index 0000000000..91c2603d84
--- /dev/null
+++ b/extension/src/setup/util.ts
@@ -0,0 +1,27 @@
+import { commands } from 'vscode'
+import { RegisteredCommands } from '../commands/external'
+import { ConfigKey, getConfigValue, setUserConfigValue } from '../vscode/config'
+import { Response } from '../vscode/response'
+import { Toast } from '../vscode/toast'
+
+export const showSetupOnFirstUse = async (
+ isNewAppInstall: boolean
+): Promise => {
+ if (
+ !isNewAppInstall ||
+ getConfigValue(ConfigKey.DO_NOT_SHOW_SETUP_AFTER_INSTALL)
+ ) {
+ return
+ }
+
+ const response = await Toast.askShowOrCloseOrNever(
+ 'Need help? Go to our setup view.'
+ )
+
+ if (response === Response.SHOW) {
+ void commands.executeCommand(RegisteredCommands.SETUP_SHOW)
+ }
+ if (response === Response.NEVER) {
+ void setUserConfigValue(ConfigKey.DO_NOT_SHOW_SETUP_AFTER_INSTALL, true)
+ }
+}
diff --git a/extension/src/vscode/config.ts b/extension/src/vscode/config.ts
index ccb29e1f96..fd1c73ce62 100644
--- a/extension/src/vscode/config.ts
+++ b/extension/src/vscode/config.ts
@@ -4,7 +4,7 @@ export enum ConfigKey {
DO_NOT_RECOMMEND_ADD_STUDIO_TOKEN = 'dvc.doNotRecommendAddStudioToken',
DO_NOT_RECOMMEND_RED_HAT = 'dvc.doNotRecommendRedHatExtension',
DO_NOT_SHOW_CLI_UNAVAILABLE = 'dvc.doNotShowCliUnavailable',
- DO_NOT_SHOW_WALKTHROUGH_AFTER_INSTALL = 'dvc.doNotShowWalkthroughAfterInstall',
+ DO_NOT_SHOW_SETUP_AFTER_INSTALL = 'dvc.doNotShowSetupAfterInstall',
DVC_PATH = 'dvc.dvcPath',
EXP_TABLE_HEAD_MAX_HEIGHT = 'dvc.experimentsTableHeadMaxHeight',
FOCUSED_PROJECTS = 'dvc.focusedProjects',
diff --git a/extension/src/vscode/walkthrough.ts b/extension/src/vscode/walkthrough.ts
index 50e52353c6..da62c114bd 100644
--- a/extension/src/vscode/walkthrough.ts
+++ b/extension/src/vscode/walkthrough.ts
@@ -1,7 +1,4 @@
import { commands } from 'vscode'
-import { ConfigKey, getConfigValue, setUserConfigValue } from './config'
-import { Response } from './response'
-import { Toast } from './toast'
import { RegisteredCommands } from '../commands/external'
import { InternalCommands } from '../commands/internal'
import { joinTruthyItems } from '../util/array'
@@ -25,28 +22,3 @@ export const registerWalkthroughCommands = (
() => commands.executeCommand('workbench.action.quickOpen', '> DVC')
)
}
-
-export const showWalkthroughOnFirstUse = async (
- isNewAppInstall: boolean
-): Promise => {
- if (
- !isNewAppInstall ||
- getConfigValue(ConfigKey.DO_NOT_SHOW_WALKTHROUGH_AFTER_INSTALL)
- ) {
- return
- }
-
- const response = await Toast.askShowOrCloseOrNever(
- 'Need help? There is a walkthrough.'
- )
-
- if (response === Response.SHOW) {
- void commands.executeCommand(RegisteredCommands.EXTENSION_GET_STARTED)
- }
- if (response === Response.NEVER) {
- void setUserConfigValue(
- ConfigKey.DO_NOT_SHOW_WALKTHROUGH_AFTER_INSTALL,
- true
- )
- }
-}
diff --git a/webview/src/setup/components/App.test.tsx b/webview/src/setup/components/App.test.tsx
index 736977890d..a0b87202e0 100644
--- a/webview/src/setup/components/App.test.tsx
+++ b/webview/src/setup/components/App.test.tsx
@@ -143,7 +143,7 @@ describe('App', () => {
expect(
screen.getByText(
- 'DVC & DVCLive cannot be auto-installed as Python was not located.'
+ /DVC & DVCLive cannot be auto-installed as Python was not located./
)
).toBeInTheDocument()
expect(screen.queryByText('Install')).not.toBeInTheDocument()
@@ -160,11 +160,11 @@ describe('App', () => {
pythonBinPath: defaultInterpreter
})
- expect(
- screen.getByText(
- `DVC & DVCLive can be auto-installed as packages with ${defaultInterpreter}`
- )
- ).toBeInTheDocument()
+ const sentenceReg = new RegExp(
+ `DVC & DVCLive can be auto-installed with ${defaultInterpreter}.`
+ )
+
+ expect(screen.getByText(sentenceReg)).toBeInTheDocument()
expect(screen.getByText('Install (pip)')).toBeInTheDocument()
})
@@ -453,6 +453,37 @@ describe('App', () => {
})
describe('Get Started', () => {
+ it('should show a screen saying that dvc is not setup if DVC is not found or initialized', () => {
+ renderApp({
+ cliCompatible: undefined
+ })
+
+ const details = screen.getByTestId('get-started-section-details')
+
+ expect(within(details).getByText('DVC is not setup')).toBeInTheDocument()
+
+ sendSetDataMessage({ ...DEFAULT_DATA, projectInitialized: false })
+
+ expect(within(details).getByText('DVC is not setup')).toBeInTheDocument()
+ })
+
+ it('should open the dvc section when clicking the Setup DVC button on the dvc is not setup screen', () => {
+ renderApp({
+ projectInitialized: false,
+ remoteList: { mockRoot: undefined }
+ })
+
+ const details = screen.getByTestId('get-started-section-details')
+ const getStartedText = within(details).getByText('DVC is not setup')
+ expect(getStartedText).toBeInTheDocument()
+
+ mockPostMessage.mockClear()
+ const button = within(details).getByText('Setup DVC')
+ fireEvent.click(button)
+ expect(screen.getByText('DVC is not initialized')).toBeVisible()
+ expect(getStartedText).not.toBeVisible()
+ })
+
it('should show a button that takes the user to the "Get Started" walkthrough', () => {
renderApp()
@@ -478,7 +509,9 @@ describe('App', () => {
projectInitialized: false
})
- expect(screen.getByText('DVC is not setup')).toBeInTheDocument()
+ const details = screen.getByTestId('experiments-section-details')
+
+ expect(within(details).getByText('DVC is not setup')).toBeInTheDocument()
})
it('should open the dvc section when clicking the Setup DVC button on the dvc is not setup screen', () => {
@@ -487,11 +520,12 @@ describe('App', () => {
remoteList: { mockRoot: undefined }
})
- const experimentsText = screen.getByText('DVC is not setup')
+ const details = screen.getByTestId('experiments-section-details')
+ const experimentsText = within(details).getByText('DVC is not setup')
expect(experimentsText).toBeInTheDocument()
mockPostMessage.mockClear()
- const button = screen.getByText('Setup DVC')
+ const button = within(details).getByText('Setup DVC')
fireEvent.click(button)
expect(screen.getByText('DVC is not initialized')).toBeVisible()
expect(experimentsText).not.toBeVisible()
@@ -506,7 +540,8 @@ describe('App', () => {
}
})
- expect(screen.getByText('DVC is not setup')).toBeInTheDocument()
+ const details = screen.getByTestId('experiments-section-details')
+ expect(within(details).getByText('DVC is not setup')).toBeInTheDocument()
})
it('should not show a screen saying that the project contains no data if dvc is installed, the project is initialized and has data', () => {
diff --git a/webview/src/setup/components/App.tsx b/webview/src/setup/components/App.tsx
index 980f004bdc..873d032a53 100644
--- a/webview/src/setup/components/App.tsx
+++ b/webview/src/setup/components/App.tsx
@@ -59,6 +59,10 @@ const getStudioStatusIcon = (cliCompatible: boolean, isConnected: boolean) => {
return isConnected ? TooltipIconType.PASSED : TooltipIconType.INFO
}
+
+const getGetStartedIcon = (isDvcSetup: boolean) =>
+ isDvcSetup ? TooltipIconType.INFO : TooltipIconType.ERROR
+
export const feedStore = (
data: MessageToWebview,
dispatch: SetupDispatch
@@ -175,9 +179,9 @@ export const App: React.FC = () => {
-
+
{
+export const GetStarted: React.FC<{ isDvcSetup: boolean }> = ({
+ isDvcSetup
+}) => {
+ if (!isDvcSetup) {
+ return (
+
+
+ This extension's features cannot be accessed without DVC being
+ setup.
+
+
+ )
+ }
+
return (
Get Started
diff --git a/webview/src/setup/components/dvc/CliUnavailable.tsx b/webview/src/setup/components/dvc/CliUnavailable.tsx
index 6692faeb37..33544c769d 100644
--- a/webview/src/setup/components/dvc/CliUnavailable.tsx
+++ b/webview/src/setup/components/dvc/CliUnavailable.tsx
@@ -11,11 +11,21 @@ export const CliUnavailable: React.FC = ({ children }) => {
(state: SetupState) => state.dvc.pythonBinPath
)
const canInstall = !!pythonBinPath
+ const installationSentence = (
+ <>
+ The extension supports all{' '}
+ installation types and can
+ auto-install recommended packages via{' '}
+ pip
+ .
+ >
+ )
- const contents = canInstall ? (
+ const conditionalContents = canInstall ? (
<>
- DVC & DVCLive can be auto-installed as packages with {pythonBinPath}
+ {installationSentence} DVC & DVCLive can be auto-installed with{' '}
+ {pythonBinPath}.
@@ -24,7 +34,10 @@ export const CliUnavailable: React.FC
= ({ children }) => {
>
) : (
<>
- DVC & DVCLive cannot be auto-installed as Python was not located.
+
+ {installationSentence} Unfortunately, DVC & DVCLive cannot be
+ auto-installed as Python was not located.
+
>
)
@@ -33,7 +46,12 @@ export const CliUnavailable: React.FC = ({ children }) => {
DVC is currently unavailable
{children}
- {contents}
+
+ New to DVC? Check out dvc.org to learn
+ more or quickly try the extension with our{' '}
+ demo .
+
+ {conditionalContents}
)
}
diff --git a/webview/src/setup/components/dvc/DvcUnitialized.tsx b/webview/src/setup/components/dvc/DvcUnitialized.tsx
index f8a8bf2af9..95a07f5ca5 100644
--- a/webview/src/setup/components/dvc/DvcUnitialized.tsx
+++ b/webview/src/setup/components/dvc/DvcUnitialized.tsx
@@ -8,9 +8,10 @@ export const DvcUninitialized: React.FC = ({ children }) => (
DVC is not initialized
{children}
- The current workspace does not contain a DVC project. You can initialize a
- project which will enable features powered by DVC. To learn more about how
- to use DVC please read our docs .
+ The current workspace does not contain a DVC project, which is needed to
+ enable DVC-powered features. Interested in trying a demo project? Check
+ out our{' '}
+ extension demo .
diff --git a/webview/src/setup/components/experiments/Experiments.tsx b/webview/src/setup/components/experiments/Experiments.tsx
index cc3fb5255b..a9378a0f67 100644
--- a/webview/src/setup/components/experiments/Experiments.tsx
+++ b/webview/src/setup/components/experiments/Experiments.tsx
@@ -8,7 +8,7 @@ import { EmptyState } from '../../../shared/components/emptyState/EmptyState'
import { IconButton } from '../../../shared/components/button/IconButton'
import { Beaker } from '../../../shared/components/icons'
import { SetupState } from '../../store'
-import { FocusDvcSection } from '../shared/FocusDvcSection'
+import { DvcNotSetup } from '../shared/DvcNotSetup'
type ExperimentsProps = {
isDvcSetup: boolean
@@ -21,11 +21,9 @@ export const Experiments: React.FC = ({ isDvcSetup }) => {
if (!isDvcSetup) {
return (
-
- DVC is not setup
+
DVC needs to be setup before you can access experiments.
-
-
+
)
}
diff --git a/webview/src/setup/components/shared/DvcNotSetup.tsx b/webview/src/setup/components/shared/DvcNotSetup.tsx
new file mode 100644
index 0000000000..a4a4d70340
--- /dev/null
+++ b/webview/src/setup/components/shared/DvcNotSetup.tsx
@@ -0,0 +1,11 @@
+import React, { PropsWithChildren } from 'react'
+import { FocusDvcSection } from './FocusDvcSection'
+import { EmptyState } from '../../../shared/components/emptyState/EmptyState'
+
+export const DvcNotSetup: React.FC = ({ children }) => (
+
+ DVC is not setup
+ {children}
+
+
+)