Skip to content

Commit 5b0fab6

Browse files
authored
Merge pull request #1756 from iterative/hide-column-option-in-exp-table-ctx-menu
Add option to hide a column from the experiments table
2 parents 6fff0fb + 6b6a328 commit 5b0fab6

File tree

8 files changed

+76
-8
lines changed

8 files changed

+76
-8
lines changed

extension/src/experiments/index.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -350,6 +350,15 @@ export class Experiments extends BaseRepository<TableData> {
350350
}
351351
}
352352

353+
private hideTableColumn(path: string) {
354+
this.toggleColumnStatus(path)
355+
sendTelemetryEvent(
356+
EventName.VIEWS_EXPERIMENTS_TABLE_HIDE_COLUMN,
357+
{ path },
358+
undefined
359+
)
360+
}
361+
353362
private setupInitialData() {
354363
const waitForInitialData = this.dispose.track(
355364
this.onDidChangeExperiments(() => {
@@ -407,6 +416,8 @@ export class Experiments extends BaseRepository<TableData> {
407416
)
408417
case MessageFromWebviewType.TOGGLE_EXPERIMENT:
409418
return this.setExperimentStatus(message.payload)
419+
case MessageFromWebviewType.HIDE_EXPERIMENTS_TABLE_COLUMN:
420+
return this.hideTableColumn(message.payload)
410421
case MessageFromWebviewType.SORT_COLUMN:
411422
return this.addColumnSort(message.payload)
412423
case MessageFromWebviewType.REMOVE_COLUMN_SORT:

extension/src/telemetry/constants.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ export const EventName = Object.assign(
3636
'views.experimentTable.toggleStatus',
3737
VIEWS_EXPERIMENTS_TABLE_FOCUS_CHANGED:
3838
'views.experimentsTable.focusChanged',
39+
VIEWS_EXPERIMENTS_TABLE_HIDE_COLUMN: 'views.experimentsTable.columnHidden',
3940
VIEWS_EXPERIMENTS_TABLE_REMOVE_COLUMN_SORT:
4041
'views.experimentsTable.columnSortRemoved',
4142
VIEWS_EXPERIMENTS_TABLE_RESIZE_COLUMN:
@@ -187,6 +188,9 @@ export interface IEventNamePropertyMapping {
187188
}
188189
[EventName.VIEWS_EXPERIMENTS_TABLE_CREATED]: undefined
189190
[EventName.VIEWS_EXPERIMENTS_TABLE_FOCUS_CHANGED]: WebviewFocusChangedProperties
191+
[EventName.VIEWS_EXPERIMENTS_TABLE_HIDE_COLUMN]: {
192+
path: string
193+
}
190194

191195
[EventName.VIEWS_PLOTS_CLOSED]: undefined
192196
[EventName.VIEWS_PLOTS_CREATED]: undefined

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

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -344,6 +344,30 @@ suite('Experiments Test Suite', () => {
344344
return { experiments, experimentsModel, mockExecuteCommand }
345345
}
346346

347+
it('should be able to handle a message to hide a table column', async () => {
348+
const { experiments, columnsModel } = buildExperiments(disposable)
349+
350+
const mockToggleStatus = stub(columnsModel, 'toggleStatus')
351+
const mockSendTelemetryEvent = stub(Telemetry, 'sendTelemetryEvent')
352+
const webview = await experiments.showWebview()
353+
const mockMessageReceived = getMessageReceivedEmitter(webview)
354+
const mockColumnId = 'mock-column-id'
355+
356+
mockMessageReceived.fire({
357+
payload: mockColumnId,
358+
type: MessageFromWebviewType.HIDE_EXPERIMENTS_TABLE_COLUMN
359+
})
360+
361+
expect(mockToggleStatus).to.be.calledOnce
362+
expect(mockToggleStatus).to.be.calledWithExactly(mockColumnId)
363+
364+
expect(mockSendTelemetryEvent).to.be.calledWithExactly(
365+
EventName.VIEWS_EXPERIMENTS_TABLE_HIDE_COLUMN,
366+
{ path: mockColumnId },
367+
undefined
368+
)
369+
})
370+
347371
it('should be able to handle a message to apply an experiment to workspace', async () => {
348372
const { experiments, mockExecuteCommand } =
349373
setupExperimentsAndMockCommands()

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import { CheckpointsModel } from '../../../experiments/checkpoints/model'
1919
import { FileSystemData } from '../../../fileSystem/data'
2020
import * as Watcher from '../../../fileSystem/watcher'
2121
import { ExperimentsModel } from '../../../experiments/model'
22+
import { ColumnsModel } from '../../../experiments/columns/model'
2223

2324
const hasCheckpoints = (data: ExperimentsOutput) => {
2425
const [experimentsWithBaseline] = Object.values(omit(data, 'workspace'))
@@ -73,6 +74,8 @@ export const buildExperiments = (
7374
cliExecutor,
7475
cliReader,
7576
cliRunner,
77+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
78+
columnsModel: (experiments as any).columns as ColumnsModel,
7679
experiments,
7780
// eslint-disable-next-line @typescript-eslint/no-explicit-any
7881
experimentsModel: (experiments as any).experiments as ExperimentsModel,

extension/src/webview/contract.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ export enum MessageFromWebviewType {
2626
RESIZE_PLOTS = 'resize-plots',
2727
SORT_COLUMN = 'sort-column',
2828
TOGGLE_EXPERIMENT = 'toggle-experiment',
29+
HIDE_EXPERIMENTS_TABLE_COLUMN = 'hide-experiments-table-column',
2930
SELECT_EXPERIMENTS = 'select-experiments',
3031
SELECT_PLOTS = 'select-plots',
3132
TOGGLE_METRIC = 'toggle-metric',
@@ -62,6 +63,10 @@ export type MessageFromWebview =
6263
type: MessageFromWebviewType.TOGGLE_EXPERIMENT
6364
payload: string
6465
}
66+
| {
67+
type: MessageFromWebviewType.HIDE_EXPERIMENTS_TABLE_COLUMN
68+
payload: string
69+
}
6570
| {
6671
type: MessageFromWebviewType.APPLY_EXPERIMENT_TO_WORKSPACE
6772
payload: string

webview/__mocks__/@vscode/webview-ui-toolkit/react.tsx

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,3 +12,7 @@ export const VSCodeButton: React.FC<MockButtonProps> = ({
1212
}: MockButtonProps) => {
1313
return <button onClick={onClick}>{children}</button>
1414
}
15+
16+
export const VSCodeDivider: React.FC = () => {
17+
return <hr />
18+
}

webview/src/experiments/components/table/Table.test.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -150,9 +150,9 @@ describe('Table', () => {
150150
fireEvent.contextMenu(column, {
151151
bubbles: true
152152
})
153-
const columnMenu = await screen.findByRole('menu')
153+
const columnMenu = await screen.findAllByRole('menu')
154154

155-
const sortOption = await within(columnMenu).findByText(optionLabel)
155+
const sortOption = await within(columnMenu[0]).findByText(optionLabel)
156156
fireEvent.click(sortOption)
157157
}
158158

webview/src/experiments/components/table/TableHeader.tsx

Lines changed: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import React from 'react'
88
import { HeaderGroup } from 'react-table'
99
import cx from 'classnames'
1010
import { MessageFromWebviewType } from 'dvc/src/webview/contract'
11+
import { VSCodeDivider } from '@vscode/webview-ui-toolkit/react'
1112
import styles from './styles.module.scss'
1213
import { SortOrder, SortPicker } from './SortPicker'
1314
import { countUpperLevels, isFirstLevelHeader } from '../../util/columns'
@@ -19,6 +20,7 @@ import {
1920
OnDragStart,
2021
OnDrop
2122
} from '../../../shared/components/dragDrop/DragDropWorkbench'
23+
import { MessagesMenu } from '../../../shared/components/messagesMenu/MessagesMenu'
2224

2325
export const ColumnDragHandle: React.FC<{
2426
disabled: boolean
@@ -206,12 +208,27 @@ export const TableHeader: React.FC<TableHeaderProps> = ({
206208
onDrop={onDrop}
207209
menuDisabled={!isSortable}
208210
menuContent={
209-
<SortPicker
210-
sortOrder={sortOrder}
211-
setSelectedOrder={order => {
212-
setColumnSort(order)
213-
}}
214-
/>
211+
<div>
212+
<SortPicker
213+
sortOrder={sortOrder}
214+
setSelectedOrder={order => {
215+
setColumnSort(order)
216+
}}
217+
/>
218+
<VSCodeDivider />
219+
<MessagesMenu
220+
options={[
221+
{
222+
id: 'hide-column',
223+
label: 'Hide Column',
224+
message: {
225+
payload: column.id,
226+
type: MessageFromWebviewType.HIDE_EXPERIMENTS_TABLE_COLUMN
227+
}
228+
}
229+
]}
230+
/>
231+
</div>
215232
}
216233
/>
217234
)

0 commit comments

Comments
 (0)