Skip to content

Commit 31dcd75

Browse files
authored
Show a screen when there is no data in the project (#2927)
* Show a screen when there is no data in the project * Change title of get started webview * Add content to the no data screen * Clean yarn.lock * Rebuild yarn.lock * Retry cleaning yarn.lock * Revert webview-ui-toolkit back to 1.0.0 * Completely revert yarn.lock file and reinstall * Revert yarn.lock with right file * Fix test * Apply review comments
1 parent ee28d1c commit 31dcd75

File tree

28 files changed

+278
-19
lines changed

28 files changed

+278
-19
lines changed

extension/package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1351,12 +1351,12 @@
13511351
{
13521352
"view": "dvc.views.webviews",
13531353
"contents": "[Show Experiments](command:dvc.showExperiments)\n[Show Plots](command:dvc.showPlots)\n[Show Experiments and Plots](command:dvc.showExperimentsAndPlots)",
1354-
"when": "dvc.commands.available && dvc.project.available"
1354+
"when": "dvc.commands.available && dvc.project.available && dvc.project.hasData"
13551355
},
13561356
{
13571357
"view": "dvc.views.webviews",
13581358
"contents": "[Show Experiments](command:dvc.showGetStartedWebview)\n[Show Plots](command:dvc.showGetStartedWebview)\n[Show Experiments and Plots](command:dvc.showGetStartedWebview)",
1359-
"when": "!dvc.commands.available || !dvc.project.available"
1359+
"when": "!dvc.commands.available || !dvc.project.available || !dvc.project.hasData"
13601360
},
13611361
{
13621362
"view": "dvc.views.welcome",

extension/src/experiments/index.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ import { createTypedAccumulator } from '../util/object'
4141
import { pickPaths } from '../path/selection/quickPick'
4242
import { Toast } from '../vscode/toast'
4343
import { ConfigKey } from '../vscode/config'
44+
import { setContextValue } from '../vscode/context'
4445
import { checkSignalFile } from '../fileSystem'
4546
import { DVCLIVE_ONLY_RUNNING_SIGNAL_FILE } from '../cli/dvc/constants'
4647

@@ -495,6 +496,10 @@ export class Experiments extends BaseRepository<TableData> {
495496
return this.columns.getFirstThreeColumnOrder()
496497
}
497498

499+
public getHasData() {
500+
return this.columns.hasNonDefaultColumns()
501+
}
502+
498503
private setupInitialData() {
499504
const waitForInitialData = this.dispose.track(
500505
this.onDidChangeExperiments(() => {
@@ -517,6 +522,8 @@ export class Experiments extends BaseRepository<TableData> {
517522

518523
private notifyColumnsChanged() {
519524
this.columnsChanged.fire()
525+
const hasData = this.getHasData()
526+
setContextValue('dvc.project.hasData', hasData)
520527
return this.webviewMessages.sendWebviewMessage()
521528
}
522529

extension/src/experiments/workspace.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -329,6 +329,12 @@ export class WorkspaceExperiments extends BaseWorkspaceWebviews<
329329
)
330330
}
331331

332+
public getHasData() {
333+
return Object.values(this.repositories).some(repository =>
334+
repository.getHasData()
335+
)
336+
}
337+
332338
private async pickExpThenRun(
333339
commandId: CommandId,
334340
pickFunc: (

extension/src/extension.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,8 @@ export class Extension extends Disposable implements IExtension {
162162
() => this.initProject(),
163163
() => this.showExperiments(this.dvcRoots[0]),
164164
() => this.getAvailable(),
165-
() => this.hasRoots()
165+
() => this.hasRoots(),
166+
() => this.experiments.getHasData()
166167
)
167168
)
168169

extension/src/getStarted/index.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,16 @@ export class GetStarted extends BaseRepository<TGetStartedData> {
1515
private showExperiments: () => void
1616
private getCliAccessible: () => boolean
1717
private getHasRoots: () => boolean
18+
private getHasData: () => boolean
1819

1920
constructor(
2021
dvcRoot: string,
2122
webviewIcon: Resource,
2223
initProject: () => void,
2324
showExperiments: () => void,
2425
getCliAccessible: () => boolean,
25-
getHasRoots: () => boolean
26+
getHasRoots: () => boolean,
27+
getHasData: () => boolean
2628
) {
2729
super(dvcRoot, webviewIcon)
2830

@@ -35,6 +37,7 @@ export class GetStarted extends BaseRepository<TGetStartedData> {
3537
this.getHasRoots = getHasRoots
3638
this.initProject = initProject
3739
this.showExperiments = showExperiments
40+
this.getHasData = getHasData
3841
}
3942

4043
public sendInitialWebviewData() {
@@ -44,7 +47,8 @@ export class GetStarted extends BaseRepository<TGetStartedData> {
4447
public sendDataToWebview() {
4548
this.webviewMessages.sendWebviewMessage(
4649
this.getCliAccessible(),
47-
this.getHasRoots()
50+
this.getHasRoots(),
51+
this.getHasData()
4852
)
4953
}
5054

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
export type GetStartedData = {
22
cliAccessible: boolean
33
projectInitialized: boolean
4+
hasData: boolean
45
}

extension/src/getStarted/webview/messages.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,12 @@ export class WebviewMessages {
2323

2424
public sendWebviewMessage(
2525
cliAccessible: boolean,
26-
projectInitialized: boolean
26+
projectInitialized: boolean,
27+
hasData: boolean
2728
) {
2829
this.getWebview()?.show({
2930
cliAccessible,
31+
hasData,
3032
projectInitialized
3133
})
3234
}

extension/src/test/suite/experiments/index.test.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1583,7 +1583,7 @@ suite('Experiments Test Suite', () => {
15831583
).to.be.false
15841584
})
15851585

1586-
it('should not set a context value when a non-params file is open and the extension starts', async () => {
1586+
it('should only set the context value for hasData when a non-params file is open and the extension starts', async () => {
15871587
const nonParamsFile = Uri.file(join(dvcDemoPath, '.gitignore'))
15881588
await window.showTextDocument(nonParamsFile)
15891589

@@ -1592,7 +1592,10 @@ suite('Experiments Test Suite', () => {
15921592
const { experiments } = buildExperiments(disposable)
15931593
await experiments.isReady()
15941594

1595-
expect(setContextValueSpy).not.to.be.called
1595+
expect(setContextValueSpy).to.be.calledOnceWith(
1596+
'dvc.project.hasData',
1597+
true
1598+
)
15961599
})
15971600
})
15981601

extension/src/test/suite/getStarted/util.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ export const buildGetStarted = (disposer: Disposer, dvInstalled = false) => {
1616
mockInitializeProject,
1717
mockOpenExperiments,
1818
() => dvInstalled,
19+
() => false,
1920
() => false
2021
)
2122
)

extension/src/webview/constants.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ export const WebviewDetails: {
6363
focusChangedEvent: EventName.VIEWS_GET_STARTED_FOCUS_CHANGED
6464
},
6565
scripts: [react, getStarted],
66-
title: 'DVC is not initialized',
66+
title: 'Setup',
6767
viewKey: ViewKey.GET_STARTED
6868
}
6969
} as const

0 commit comments

Comments
 (0)