Skip to content

Commit 5a382de

Browse files
authored
Experiments Table Headers - Remove context menu's click trigger (#2625)
* Create dedicated header module * Fix styles imports for header module * Disable left-click trigger for header context menu * Remove duplicated code
1 parent 525a0b0 commit 5a382de

File tree

8 files changed

+65
-68
lines changed

8 files changed

+65
-68
lines changed

webview/src/experiments/components/App.test.tsx

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -737,19 +737,14 @@ describe('App', () => {
737737
jest.useRealTimers()
738738
})
739739

740-
it('should open on left click', () => {
740+
it('should not open on left click', () => {
741741
renderTableWithoutRunningExperiments()
742742

743743
const paramsFileHeader = screen.getByText('params.yaml')
744744
fireEvent.click(paramsFileHeader, { bubbles: true })
745745

746746
jest.advanceTimersByTime(100)
747-
const menuitems = screen.getAllByRole('menuitem')
748-
const itemLabels = menuitems.map(item => item.textContent)
749-
expect(itemLabels).toStrictEqual([
750-
'Open to the Side',
751-
'Set Max Header Height'
752-
])
747+
expect(screen.queryAllByRole('menuitem')).toHaveLength(0)
753748
})
754749

755750
it('should open on right click and close on esc', () => {

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ import { MessageFromWebviewType } from 'dvc/src/webview/contract'
1818
import React from 'react'
1919
import { TableInstance } from 'react-table'
2020
import tableDataFixture from 'dvc/src/test/fixtures/expShow/tableData'
21-
import { SortOrder } from './TableHeader'
21+
import { SortOrder } from './header/TableHeader'
2222
import { Table } from './Table'
2323
import styles from './styles.module.scss'
2424
import { ExperimentsTable } from '../Experiments'

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import React, { useRef, useState, CSSProperties } from 'react'
22
import { useSelector } from 'react-redux'
33
import cx from 'classnames'
44
import styles from './styles.module.scss'
5-
import { TableHead } from './TableHead'
5+
import { TableHead } from './header/TableHead'
66
import { InstanceProp, RowProp } from './interfaces'
77
import { RowSelectionContext } from './RowSelectionContext'
88
import { TableBody } from './TableBody'

webview/src/experiments/components/table/MergeHeaderGroups.tsx renamed to webview/src/experiments/components/table/header/MergeHeaderGroups.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@ import cx from 'classnames'
33
import { Experiment, Column } from 'dvc/src/experiments/webview/contract'
44
import { HeaderGroup } from 'react-table'
55
import { TableHeader } from './TableHeader'
6-
import styles from './styles.module.scss'
7-
import { DragFunction } from '../../../shared/components/dragDrop/Draggable'
6+
import styles from '../styles.module.scss'
7+
import { DragFunction } from '../../../../shared/components/dragDrop/Draggable'
88

99
export const MergedHeaderGroups: React.FC<{
1010
headerGroup: HeaderGroup<Experiment>

webview/src/experiments/components/table/TableHead.tsx renamed to webview/src/experiments/components/table/header/TableHead.tsx

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,16 @@ import React, { DragEvent, useRef, useEffect } from 'react'
33
import { useSelector, useDispatch } from 'react-redux'
44
import { HeaderGroup, TableInstance } from 'react-table'
55
import { MessageFromWebviewType } from 'dvc/src/webview/contract'
6-
import styles from './styles.module.scss'
76
import { MergedHeaderGroups } from './MergeHeaderGroups'
8-
import { Indicators } from './Indicators'
9-
import { setDropTarget } from './headerDropTargetSlice'
10-
import { useColumnOrder } from '../../hooks/useColumnOrder'
11-
import { ExperimentsState } from '../../store'
12-
import { sendMessage } from '../../../shared/vscode'
13-
import { leafColumnIds, reorderColumnIds } from '../../util/columns'
14-
import { DragFunction } from '../../../shared/components/dragDrop/Draggable'
15-
import { getSelectedForPlotsCount } from '../../util/rows'
16-
7+
import { setDropTarget } from '../headerDropTargetSlice'
8+
import styles from '../styles.module.scss'
9+
import { Indicators } from '../Indicators'
10+
import { useColumnOrder } from '../../../hooks/useColumnOrder'
11+
import { ExperimentsState } from '../../../store'
12+
import { sendMessage } from '../../../../shared/vscode'
13+
import { leafColumnIds, reorderColumnIds } from '../../../util/columns'
14+
import { DragFunction } from '../../../../shared/components/dragDrop/Draggable'
15+
import { getSelectedForPlotsCount } from '../../../util/rows'
1716
interface TableHeadProps {
1817
instance: TableInstance<Experiment>
1918
root: HTMLElement | null

webview/src/experiments/components/table/TableHeader.tsx renamed to webview/src/experiments/components/table/header/TableHeader.tsx

Lines changed: 40 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,10 @@ import { HeaderGroup } from 'react-table'
99
import { MessageFromWebviewType } from 'dvc/src/webview/contract'
1010
import { VSCodeDivider } from '@vscode/webview-ui-toolkit/react'
1111
import { TableHeaderCell } from './TableHeaderCell'
12-
import { ExperimentsState } from '../../store'
13-
import { DragFunction } from '../../../shared/components/dragDrop/Draggable'
14-
import { MessagesMenu } from '../../../shared/components/messagesMenu/MessagesMenu'
15-
import { MessagesMenuOptionProps } from '../../../shared/components/messagesMenu/MessagesMenuOption'
12+
import { ExperimentsState } from '../../../store'
13+
import { DragFunction } from '../../../../shared/components/dragDrop/Draggable'
14+
import { MessagesMenu } from '../../../../shared/components/messagesMenu/MessagesMenu'
15+
import { MessagesMenuOptionProps } from '../../../../shared/components/messagesMenu/MessagesMenuOption'
1616

1717
export enum SortOrder {
1818
ASCENDING = 'Sort Ascending',
@@ -38,6 +38,39 @@ interface TableHeaderProps {
3838
root: HTMLElement | null
3939
}
4040

41+
export const sortOption = (
42+
label: SortOrder,
43+
currentSort: SortOrder,
44+
columnId: string
45+
) => {
46+
const sortOrder = currentSort
47+
const hidden = sortOrder === label
48+
const descending = label === SortOrder.DESCENDING
49+
const path = columnId
50+
const removeSortMessage = {
51+
payload: columnId,
52+
type: MessageFromWebviewType.REMOVE_COLUMN_SORT
53+
}
54+
const payload = {
55+
descending,
56+
path
57+
}
58+
const message =
59+
label === SortOrder.NONE
60+
? removeSortMessage
61+
: {
62+
payload,
63+
type: MessageFromWebviewType.SORT_COLUMN
64+
}
65+
66+
return {
67+
hidden,
68+
id: label,
69+
label,
70+
message
71+
} as MessagesMenuOptionProps
72+
}
73+
4174
export const TableHeader: React.FC<TableHeaderProps> = ({
4275
column,
4376
columns,
@@ -116,39 +149,9 @@ export const TableHeader: React.FC<TableHeaderProps> = ({
116149
<VSCodeDivider />
117150
<MessagesMenu
118151
options={[
119-
{
120-
hidden: sortOrder === SortOrder.ASCENDING,
121-
id: SortOrder.ASCENDING,
122-
label: SortOrder.ASCENDING,
123-
message: {
124-
payload: {
125-
descending: false,
126-
path: column.id
127-
},
128-
type: MessageFromWebviewType.SORT_COLUMN
129-
}
130-
},
131-
{
132-
hidden: sortOrder === SortOrder.DESCENDING,
133-
id: SortOrder.DESCENDING,
134-
label: SortOrder.DESCENDING,
135-
message: {
136-
payload: {
137-
descending: true,
138-
path: column.id
139-
},
140-
type: MessageFromWebviewType.SORT_COLUMN
141-
}
142-
},
143-
{
144-
hidden: sortOrder === SortOrder.NONE,
145-
id: SortOrder.NONE,
146-
label: SortOrder.NONE,
147-
message: {
148-
payload: column.id,
149-
type: MessageFromWebviewType.REMOVE_COLUMN_SORT
150-
}
151-
}
152+
sortOption(SortOrder.ASCENDING, sortOrder, column.id),
153+
sortOption(SortOrder.DESCENDING, sortOrder, column.id),
154+
sortOption(SortOrder.NONE, sortOrder, column.id)
152155
]}
153156
/>
154157
</>

webview/src/experiments/components/table/TableHeaderCell.tsx renamed to webview/src/experiments/components/table/header/TableHeaderCell.tsx

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,17 +8,17 @@ import { useSelector } from 'react-redux'
88
import { HeaderGroup } from 'react-table'
99
import cx from 'classnames'
1010
import { useInView } from 'react-intersection-observer'
11-
import styles from './styles.module.scss'
1211
import { SortOrder } from './TableHeader'
1312
import { TableHeaderCellContents } from './TableHeaderCellContents'
13+
import styles from '../styles.module.scss'
1414
import {
1515
countUpperLevels,
1616
isExperimentColumn,
1717
isFirstLevelHeader
18-
} from '../../util/columns'
19-
import { ContextMenu } from '../../../shared/components/contextMenu/ContextMenu'
20-
import { DragFunction } from '../../../shared/components/dragDrop/Draggable'
21-
import { ExperimentsState } from '../../store'
18+
} from '../../../util/columns'
19+
import { ExperimentsState } from '../../../store'
20+
import { ContextMenu } from '../../../../shared/components/contextMenu/ContextMenu'
21+
import { DragFunction } from '../../../../shared/components/dragDrop/Draggable'
2222

2323
const calcResizerHeight = (
2424
isPlaceholder: boolean,
@@ -147,7 +147,7 @@ export const TableHeaderCell: React.FC<{
147147
<ContextMenu
148148
content={menuContent}
149149
disabled={menuDisabled || menuSuppressed}
150-
trigger={'contextmenu click'}
150+
trigger={'contextmenu'}
151151
>
152152
<div
153153
{...column.getHeaderProps(

webview/src/experiments/components/table/TableHeaderCellContents.tsx renamed to webview/src/experiments/components/table/header/TableHeaderCellContents.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,14 @@ import React, { useState, useEffect } from 'react'
22
import cx from 'classnames'
33
import { ColumnType, Experiment } from 'dvc/src/experiments/webview/contract'
44
import { HeaderGroup } from 'react-table'
5-
import styles from './styles.module.scss'
65
import { SortOrder } from './TableHeader'
6+
import styles from '../styles.module.scss'
77
import {
88
Draggable,
99
DragFunction
10-
} from '../../../shared/components/dragDrop/Draggable'
11-
import { IconMenu } from '../../../shared/components/iconMenu/IconMenu'
12-
import { DownArrow, Lines, UpArrow } from '../../../shared/components/icons'
10+
} from '../../../../shared/components/dragDrop/Draggable'
11+
import { IconMenu } from '../../../../shared/components/iconMenu/IconMenu'
12+
import { DownArrow, Lines, UpArrow } from '../../../../shared/components/icons'
1313

1414
const getIconMenuItems = (
1515
sortEnabled: boolean,

0 commit comments

Comments
 (0)