Skip to content

Commit e478a03

Browse files
authored
Add "views" section to sidebar (#2760)
* add a "Show Plots and Experiments" command to command palette * replaces the view buttons, "Add Sort" and "Add Filter" with links to stop the sidebar from looking crowded * moves "plots" view to be above "sort" and "filter" views since it's of higher importance
1 parent 66768f6 commit e478a03

File tree

11 files changed

+80
-31
lines changed

11 files changed

+80
-31
lines changed

extension/package.json

Lines changed: 30 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -391,6 +391,11 @@
391391
"category": "DVC",
392392
"icon": "$(graph-scatter)"
393393
},
394+
{
395+
"title": "%command.showPlotsAndExperiments%",
396+
"command": "dvc.showPlotsAndExperiments",
397+
"category": "DVC"
398+
},
394399
{
395400
"title": "%command.stopRunningExperiment%",
396401
"command": "dvc.stopRunningExperiment",
@@ -781,6 +786,10 @@
781786
"command": "dvc.showPlots",
782787
"when": "dvc.commands.available && dvc.project.available"
783788
},
789+
{
790+
"command": "dvc.showPlotsAndExperiments",
791+
"when": "dvc.commands.available && dvc.project.available"
792+
},
784793
{
785794
"command": "dvc.stopRunningExperiment",
786795
"when": "dvc.commands.available && dvc.project.available && dvc.experiment.running"
@@ -1297,6 +1306,11 @@
12971306
}
12981307
],
12991308
"dvc-views": [
1309+
{
1310+
"id": "dvc.views.webviews",
1311+
"name": "Views",
1312+
"when": "dvc.commands.available && dvc.project.available"
1313+
},
13001314
{
13011315
"id": "dvc.views.experimentsColumnsTree",
13021316
"name": "Columns",
@@ -1312,6 +1326,11 @@
13121326
"name": "Experiments",
13131327
"when": "dvc.commands.available && dvc.project.available"
13141328
},
1329+
{
1330+
"id": "dvc.views.plotsPathsTree",
1331+
"name": "Plots",
1332+
"when": "dvc.commands.available && dvc.project.available"
1333+
},
13151334
{
13161335
"id": "dvc.views.experimentsSortByTree",
13171336
"name": "Sort By",
@@ -1322,18 +1341,18 @@
13221341
"name": "Filter By",
13231342
"when": "dvc.commands.available && dvc.project.available"
13241343
},
1325-
{
1326-
"id": "dvc.views.plotsPathsTree",
1327-
"name": "Plots",
1328-
"when": "dvc.commands.available && dvc.project.available"
1329-
},
13301344
{
13311345
"id": "dvc.views.support",
13321346
"name": "Support"
13331347
}
13341348
]
13351349
},
13361350
"viewsWelcome": [
1351+
{
1352+
"view": "dvc.views.webviews",
1353+
"contents": "[Open experiments](command:dvc.showExperiments)\n[Open plots](command:dvc.showPlots)\n[Open both views](command:dvc.showPlotsAndExperiments)",
1354+
"when": "dvc.commands.available && dvc.project.available"
1355+
},
13371356
{
13381357
"view": "dvc.views.welcome",
13391358
"contents": "New to the extension?\n[Show Walkthrough](command:dvc.getStarted)\n\n",
@@ -1367,16 +1386,16 @@
13671386
"contents": "No Experiments to Display."
13681387
},
13691388
{
1370-
"view": "dvc.views.experimentsSortByTree",
1371-
"contents": "No Sorts Applied. \n[$(add) Add Sort](command:dvc.addExperimentsTableSort)\n"
1389+
"view": "dvc.views.plotsPathsTree",
1390+
"contents": "No Plots to Display."
13721391
},
13731392
{
1374-
"view": "dvc.views.experimentsFilterByTree",
1375-
"contents": "No Filters Applied. \n[$(add) Add Filter](command:dvc.addExperimentsTableFilter)\n"
1393+
"view": "dvc.views.experimentsSortByTree",
1394+
"contents": "No Sorts Applied. [Add Sort](command:dvc.addExperimentsTableSort)\n"
13761395
},
13771396
{
1378-
"view": "dvc.views.plotsPathsTree",
1379-
"contents": "No Plots to Display."
1397+
"view": "dvc.views.experimentsFilterByTree",
1398+
"contents": "No Filters Applied. [Add Filter](command:dvc.addExperimentsTableFilter)\n"
13801399
},
13811400
{
13821401
"view": "dvc.views.support",

extension/package.nls.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@
5454
"command.showExperiments": "Show Experiments",
5555
"command.showOutput": "Show DVC Output",
5656
"command.showPlots": "Show Plots",
57+
"command.showPlotsAndExperiments": "Show Plots and Experiments",
5758
"command.stopRunningExperiment": "Stop Running Experiment",
5859
"command.views.experimentsColumnsTree.selectColumns": "Select Columns to Display in the Experiments Table",
5960
"command.views.experimentsFilterByTree.removeAllFilters": "Remove All Filters From Experiments Table",

extension/src/commands/external.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,8 @@ export enum RegisteredCommands {
7171
PLOTS_SELECT = 'dvc.views.plotsPathsTree.selectPlots',
7272
PLOTS_REFRESH = 'dvc.views.plotsPathsTree.refreshPlots',
7373

74+
PLOTS_AND_EXPERIMENT_SHOW = 'dvc.showPlotsAndExperiments',
75+
7476
EXTENSION_CHECK_CLI_COMPATIBLE = 'dvc.checkCLICompatible',
7577
EXTENSION_GET_STARTED = 'dvc.getStarted',
7678
EXTENSION_SETUP_WORKSPACE = 'dvc.setupWorkspace',

extension/src/extension.ts

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,11 @@
1-
import { commands, env, Event, EventEmitter, ExtensionContext } from 'vscode'
1+
import {
2+
commands,
3+
env,
4+
Event,
5+
EventEmitter,
6+
ExtensionContext,
7+
ViewColumn
8+
} from 'vscode'
29
import { DvcExecutor } from './cli/dvc/executor'
310
import { DvcRunner } from './cli/dvc/runner'
411
import { DvcReader } from './cli/dvc/reader'
@@ -22,7 +29,11 @@ import { ExperimentsColumnsTree } from './experiments/columns/tree'
2229
import { ExperimentsSortByTree } from './experiments/model/sortBy/tree'
2330
import { ExperimentsTree } from './experiments/model/tree'
2431
import { ExperimentsFilterByTree } from './experiments/model/filterBy/tree'
25-
import { setContextValue } from './vscode/context'
32+
import {
33+
Context as VsCodeContext,
34+
getDvcRootFromContext,
35+
setContextValue
36+
} from './vscode/context'
2637
import { OutputChannel } from './vscode/outputChannel'
2738
import {
2839
getFirstWorkspaceFolder,
@@ -227,6 +238,19 @@ export class Extension extends Disposable implements IExtension {
227238

228239
registerExperimentCommands(this.experiments, this.internalCommands)
229240
registerPlotsCommands(this.plots, this.internalCommands)
241+
this.internalCommands.registerExternalCommand(
242+
RegisteredCommands.PLOTS_AND_EXPERIMENT_SHOW,
243+
async (context: VsCodeContext) => {
244+
await this.experiments.showWebview(
245+
getDvcRootFromContext(context),
246+
ViewColumn.Active
247+
)
248+
await this.plots.showWebview(
249+
getDvcRootFromContext(context),
250+
ViewColumn.Beside
251+
)
252+
}
253+
)
230254

231255
this.dispose.track(
232256
commands.registerCommand(RegisteredCommands.STOP_EXPERIMENT, async () => {

extension/src/telemetry/constants.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,7 @@ export interface IEventNamePropertyMapping {
112112
wasStopped?: boolean
113113
}
114114

115+
[EventName.PLOTS_AND_EXPERIMENT_SHOW]: undefined
115116
[EventName.EXPERIMENT_APPLY]: undefined
116117
[EventName.EXPERIMENT_AUTO_APPLY_FILTERS]: undefined
117118
[EventName.EXPERIMENT_DISABLE_AUTO_APPLY_FILTERS]: undefined

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -65,15 +65,15 @@ suite('Workspace Experiments Test Suite', () => {
6565

6666
const focused = onDidChangeIsWebviewFocused(experiments)
6767

68-
await workspaceExperiments.showWebview()
68+
await workspaceExperiments.showWebview('')
6969

7070
expect(await focused).to.equal(dvcDemoPath)
7171
expect(mockQuickPickOne).to.be.calledOnce
7272
expect(workspaceExperiments.getFocusedWebview()).to.equal(experiments)
7373

7474
mockQuickPickOne.resetHistory()
7575

76-
const focusedExperiments = await workspaceExperiments.showWebview()
76+
const focusedExperiments = await workspaceExperiments.showWebview('')
7777

7878
expect(focusedExperiments).to.equal(experiments)
7979
expect(mockQuickPickOne).to.be.calledOnce
@@ -87,7 +87,7 @@ suite('Workspace Experiments Test Suite', () => {
8787
const { workspaceExperiments } = buildSingleRepoExperiments(disposable)
8888
await workspaceExperiments.isReady()
8989

90-
await workspaceExperiments.showWebview()
90+
await workspaceExperiments.showWebview('')
9191

9292
expect(mockQuickPickOne).to.not.be.called
9393
})
@@ -104,7 +104,7 @@ suite('Workspace Experiments Test Suite', () => {
104104

105105
const focusedWebview = onDidChangeIsWebviewFocused(experiments)
106106

107-
await workspaceExperiments.showWebview()
107+
await workspaceExperiments.showWebview('')
108108

109109
expect(await focusedWebview).to.equal(dvcDemoPath)
110110

extension/src/vscode/context.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ export const setContextValue = (key: string, value: unknown) =>
55

66
export type Context = string | Record<string, unknown> | undefined
77

8-
export const getDvcRootFromContext = (context: Context): string | undefined => {
8+
export const getDvcRootFromContext = (context: Context): string => {
99
const isDvcRoot = typeof context === 'string'
10-
return isDvcRoot ? context : undefined
10+
return isDvcRoot ? context : ''
1111
}

extension/src/webview/factory.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,14 +24,15 @@ const create = (
2424
export const createWebview = async (
2525
viewKey: ViewKey,
2626
dvcRoot: string,
27-
iconPath: Resource
27+
iconPath: Resource,
28+
viewColumn?: ViewColumn
2829
) => {
2930
const { title, distPath } = WebviewDetails[viewKey]
3031

3132
const webviewPanel = window.createWebviewPanel(
3233
viewKey,
3334
title,
34-
ViewColumn.Active,
35+
viewColumn || ViewColumn.Active,
3536
{
3637
enableScripts: true,
3738
localResourceRoots: [Uri.file(distPath), ...getWorkspaceRootUris()],

extension/src/webview/index.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { Event, EventEmitter, WebviewPanel, Uri } from 'vscode'
1+
import { Event, EventEmitter, WebviewPanel, Uri, ViewColumn } from 'vscode'
22
import { Disposable } from '@hediet/std/disposable'
33
import { Deferred } from '@hediet/std/synchronization'
44
import {
@@ -103,8 +103,8 @@ export class BaseWebview<T extends WebviewData> {
103103
})
104104
}
105105

106-
public reveal() {
107-
this.webviewPanel.reveal()
106+
public reveal(viewColumn?: ViewColumn) {
107+
this.webviewPanel.reveal(viewColumn)
108108
return this
109109
}
110110

extension/src/webview/repository.ts

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { Event, EventEmitter } from 'vscode'
1+
import { Event, EventEmitter, ViewColumn } from 'vscode'
22
import { BaseWebview } from '.'
33
import { ViewKey } from './constants'
44
import { MessageFromWebview, WebviewData } from './contract'
@@ -38,15 +38,16 @@ export abstract class BaseRepository<
3838
this.onDidReceivedWebviewMessage = this.receivedWebviewMessage.event
3939
}
4040

41-
public async showWebview() {
41+
public async showWebview(viewColumn?: ViewColumn) {
4242
if (this.webview) {
43-
return this.webview.reveal()
43+
return this.webview.reveal(viewColumn)
4444
}
4545

4646
const webview = await createWebview(
4747
this.viewKey,
4848
this.dvcRoot,
49-
this.webviewIcon
49+
this.webviewIcon,
50+
viewColumn
5051
)
5152

5253
this.setWebview(webview)

0 commit comments

Comments
 (0)