Skip to content

Commit 634f7e9

Browse files
authored
Add select first experiment table columns quick pick (#4294)
1 parent 731f9d3 commit 634f7e9

File tree

14 files changed

+152
-16
lines changed

14 files changed

+152
-16
lines changed

extension/package.json

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -571,6 +571,12 @@
571571
"category": "DVC",
572572
"icon": "$(list-filter)"
573573
},
574+
{
575+
"title": "Select Columns to Display First in the Experiments Table",
576+
"command": "dvc.views.experimentsColumnsTree.selectFirstColumns",
577+
"category": "DVC",
578+
"icon": "$(arrow-left)"
579+
},
574580
{
575581
"title": "Select Plots to Display",
576582
"command": "dvc.views.plotsPathsTree.selectPlots",
@@ -919,6 +925,10 @@
919925
"command": "dvc.views.experimentsColumnsTree.selectColumns",
920926
"when": "dvc.commands.available && dvc.project.available"
921927
},
928+
{
929+
"command": "dvc.views.experimentsColumnsTree.selectFirstColumns",
930+
"when": "dvc.commands.available && dvc.project.available"
931+
},
922932
{
923933
"command": "dvc.views.experiments.applyExperiment",
924934
"when": "false"
@@ -1284,6 +1294,11 @@
12841294
"when": "view == dvc.views.experimentsColumnsTree",
12851295
"group": "navigation@2"
12861296
},
1297+
{
1298+
"command": "dvc.views.experimentsColumnsTree.selectFirstColumns",
1299+
"when": "view == dvc.views.experimentsColumnsTree",
1300+
"group": "navigation@3"
1301+
},
12871302
{
12881303
"command": "dvc.stopAllRunningExperiments",
12891304
"when": "view == dvc.views.experimentsTree && dvc.experiments.webview.active && dvc.experiment.running",

extension/src/commands/external.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ export enum RegisteredCliCommands {
5151

5252
export enum RegisteredCommands {
5353
EXPERIMENT_COLUMNS_SELECT = 'dvc.views.experimentsColumnsTree.selectColumns',
54+
EXPERIMENT_COLUMNS_SELECT_FIRST = 'dvc.views.experimentsColumnsTree.selectFirstColumns',
5455
EXPERIMENT_FILTER_ADD = 'dvc.addExperimentsTableFilter',
5556
EXPERIMENT_FILTER_ADD_STARRED = 'dvc.addStarredExperimentsTableFilter',
5657
EXPERIMENT_FILTER_REMOVE = 'dvc.views.experimentsFilterByTree.removeFilter',

extension/src/experiments/columns/model.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,17 @@ export class ColumnsModel extends PathSelectionModel<Column> {
9494
this.statusChanged?.fire()
9595
}
9696

97+
public selectFirst(firstColumns: string[]) {
98+
const columnOrder = [
99+
'id',
100+
...firstColumns,
101+
...this.getColumnOrder().filter(
102+
column => !['id', ...firstColumns].includes(column)
103+
)
104+
]
105+
this.setColumnOrder(columnOrder)
106+
}
107+
97108
public setColumnWidth(id: string, width: number) {
98109
this.columnWidthsState[id] = width
99110
this.persist(

extension/src/experiments/commands/register.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,12 @@ const registerExperimentQuickPickCommands = (
190190
experiments.selectColumns(getDvcRootFromContext(context))
191191
)
192192

193+
internalCommands.registerExternalCommand(
194+
RegisteredCommands.EXPERIMENT_COLUMNS_SELECT_FIRST,
195+
(context: Context) =>
196+
experiments.selectFirstColumns(getDvcRootFromContext(context))
197+
)
198+
193199
internalCommands.registerExternalCommand(
194200
RegisteredCommands.EXPERIMENT_STOP,
195201
() => experiments.selectExperimentsToStop()

extension/src/experiments/index.ts

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ import { checkSignalFile, pollSignalFileForProcess } from '../fileSystem'
4545
import { DVCLIVE_ONLY_RUNNING_SIGNAL_FILE } from '../cli/dvc/constants'
4646
import { Response } from '../vscode/response'
4747
import { Pipeline } from '../pipeline'
48+
import { definedAndNonEmpty } from '../util/array'
4849

4950
export const ExperimentsScale = {
5051
...omit(ColumnType, 'TIMESTAMP'),
@@ -356,7 +357,7 @@ export class Experiments extends BaseRepository<TableData> {
356357
public async selectColumns() {
357358
const columns = this.columns.getTerminalNodes()
358359

359-
const selected = await pickPaths('columns', columns)
360+
const selected = await pickPaths(columns, Title.SELECT_COLUMNS)
360361
if (!selected) {
361362
return
362363
}
@@ -365,6 +366,21 @@ export class Experiments extends BaseRepository<TableData> {
365366
return this.notifyChanged()
366367
}
367368

369+
public async selectFirstColumns() {
370+
const columns = this.columns.getTerminalNodes()
371+
372+
const selected = await pickPaths(
373+
columns.map(column => ({ ...column, selected: false })),
374+
Title.SELECT_FIRST_COLUMNS
375+
)
376+
if (!definedAndNonEmpty(selected)) {
377+
return
378+
}
379+
380+
this.columns.selectFirst(selected.map(({ path }) => path))
381+
return this.notifyChanged()
382+
}
383+
368384
public pickCommitOrExperiment() {
369385
return pickExperiment(
370386
this.experiments.getCommitsAndExperiments(),

extension/src/experiments/workspace.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,10 @@ export class WorkspaceExperiments extends BaseWorkspaceWebviews<
101101
return this.getRepositoryThenUpdate('selectColumns', overrideRoot)
102102
}
103103

104+
public selectFirstColumns(overrideRoot?: string) {
105+
return this.getRepositoryThenUpdate('selectFirstColumns', overrideRoot)
106+
}
107+
104108
public async selectExperimentsToStop() {
105109
const cwd = await this.getFocusedOrOnlyOrPickProject()
106110
if (!cwd) {
@@ -407,7 +411,8 @@ export class WorkspaceExperiments extends BaseWorkspaceWebviews<
407411
| 'addStarredSort'
408412
| 'removeSorts'
409413
| 'selectExperimentsToPlot'
410-
| 'selectColumns',
414+
| 'selectColumns'
415+
| 'selectFirstColumns',
411416
overrideRoot?: string
412417
) {
413418
const dvcRoot = await this.getDvcRoot(overrideRoot)

extension/src/path/selection/quickPick.test.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,15 +21,15 @@ beforeEach(() => {
2121
describe('pickPaths', () => {
2222
it('should not call quickPickManyValues if undefined is provided', async () => {
2323
mockedQuickPickManyValues.mockResolvedValueOnce([])
24-
await pickPaths('plots', undefined)
24+
await pickPaths(undefined, Title.SELECT_COLUMNS)
2525

2626
expect(mockedShowError).toHaveBeenCalledTimes(1)
2727
expect(mockedQuickPickManyValues).not.toHaveBeenCalled()
2828
})
2929

3030
it('should not call quickPickManyValues if no plots paths are provided', async () => {
3131
mockedQuickPickManyValues.mockResolvedValueOnce([])
32-
await pickPaths('plots', [])
32+
await pickPaths([], Title.SELECT_COLUMNS)
3333

3434
expect(mockedShowError).toHaveBeenCalledTimes(1)
3535
expect(mockedQuickPickManyValues).not.toHaveBeenCalled()
@@ -69,7 +69,7 @@ describe('pickPaths', () => {
6969
}
7070
]
7171

72-
await pickPaths('plots', plotPaths)
72+
await pickPaths(plotPaths, Title.SELECT_PLOTS)
7373

7474
expect(mockedShowError).not.toHaveBeenCalled()
7575
expect(mockedQuickPickManyValues).toHaveBeenCalledTimes(1)

extension/src/path/selection/quickPick.ts

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,10 +33,13 @@ const collectItems = <T extends PathType>(
3333
}
3434

3535
export const pickPaths = <T extends PathType>(
36-
type: 'plots' | 'columns',
37-
paths?: PathWithSelected<T>[]
36+
paths: PathWithSelected<T>[] | undefined,
37+
title:
38+
| typeof Title.SELECT_PLOTS
39+
| typeof Title.SELECT_COLUMNS
40+
| typeof Title.SELECT_FIRST_COLUMNS
3841
): Thenable<PathWithSelected<T>[] | undefined> => {
39-
const title = type === 'plots' ? Title.SELECT_PLOTS : Title.SELECT_COLUMNS
42+
const type = Title.SELECT_PLOTS === title ? 'plots' : 'columns'
4043

4144
if (!definedAndNonEmpty(paths)) {
4245
return Toast.showError(`There are no ${type} to select.`)

extension/src/plots/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ export class Plots extends BaseRepository<TPlotsData> {
9696
public async selectPlots() {
9797
const paths = this.paths.getTerminalNodes()
9898

99-
const selected = await pickPaths('plots', paths)
99+
const selected = await pickPaths(paths, Title.SELECT_PLOTS)
100100
if (!selected) {
101101
return
102102
}

extension/src/telemetry/constants.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,7 @@ export interface IEventNamePropertyMapping {
131131
[EventName.EXPERIMENT_APPLY]: undefined
132132
[EventName.EXPERIMENT_BRANCH]: undefined
133133
[EventName.EXPERIMENT_COLUMNS_SELECT]: undefined
134+
[EventName.EXPERIMENT_COLUMNS_SELECT_FIRST]: undefined
134135
[EventName.EXPERIMENT_FILTER_ADD]: undefined
135136
[EventName.EXPERIMENT_FILTER_ADD_STARRED]: undefined
136137
[EventName.EXPERIMENT_FILTER_REMOVE]: undefined

0 commit comments

Comments
 (0)