Skip to content

Commit 97c996a

Browse files
authored
Merge pull request #1729 from iterative/groups-dnd-with-stephs-implementation
Groups DnD with our own version
2 parents 024aa30 + 58129a9 commit 97c996a

File tree

18 files changed

+487
-294
lines changed

18 files changed

+487
-294
lines changed

webview/package.json

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@
2626
"@vscode/webview-ui-toolkit": "^1.0.0",
2727
"classnames": "^2.2.6",
2828
"react": "^17.0.1",
29-
"react-beautiful-dnd": "^13.1.0",
3029
"react-dom": "^17.0.1",
3130
"react-table": "^7.7.0",
3231
"react-vega": "^7.4.4",
@@ -49,7 +48,6 @@
4948
"@types/jsdom": "^16.2.6",
5049
"@types/node": "^16.11.8",
5150
"@types/react": "^17.0.35",
52-
"@types/react-beautiful-dnd": "^13.1.2",
5351
"@types/react-dom": "^17.0.11",
5452
"@types/react-measure": "^2.0.8",
5553
"@types/react-table": "^7.7.8",
@@ -66,7 +64,6 @@
6664
"jest-canvas-mock": "^2.3.1",
6765
"lint-staged": "^12.3.7",
6866
"raw-loader": "^4.0.2",
69-
"react-beautiful-dnd-test-utils": "^3.2.2",
7067
"sass": "^1.43.4",
7168
"sass-loader": "^12.3.0",
7269
"style-loader": "^3.3.1",

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

Lines changed: 7 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,6 @@ import {
1818
MessageFromWebviewType,
1919
MessageToWebviewType
2020
} from 'dvc/src/webview/contract'
21-
import {
22-
mockDndElSpacing,
23-
mockGetComputedSpacing,
24-
makeDnd,
25-
DND_DIRECTION_RIGHT
26-
} from 'react-beautiful-dnd-test-utils'
2721
import {
2822
Column,
2923
ColumnType,
@@ -38,14 +32,15 @@ import { vsCodeApi } from '../../shared/api'
3832
import {
3933
commonColumnFields,
4034
expectHeaders,
41-
makeGetDragEl,
4235
tableData as sortingTableDataFixture
4336
} from '../../test/sort'
4437
import {
4538
CELL_TOOLTIP_DELAY,
4639
HEADER_TOOLTIP_DELAY
4740
} from '../../shared/components/tooltip/Tooltip'
4841
import { getRow } from '../../test/queries'
42+
import { dragAndDrop } from '../../test/dragDrop'
43+
import { DragEnterDirection } from '../../shared/components/dragDrop/util'
4944

5045
jest.mock('../../shared/api')
5146
jest.mock('../../util/styles')
@@ -200,9 +195,7 @@ describe('App', () => {
200195
})
201196

202197
it('should be able to order a column to the final space after a new column is added', async () => {
203-
const view = render(<App />)
204-
mockDndElSpacing(view)
205-
mockGetComputedSpacing()
198+
render(<App />)
206199
fireEvent(
207200
window,
208201
new MessageEvent('message', {
@@ -236,12 +229,10 @@ describe('App', () => {
236229
})
237230
)
238231

239-
await makeDnd({
240-
direction: DND_DIRECTION_RIGHT,
241-
getByText: view.getByText,
242-
getDragEl: makeGetDragEl('B'),
243-
positions: 2
244-
})
232+
const headerB = screen.getByText('B')
233+
const headerD = screen.getByText('D')
234+
235+
dragAndDrop(headerB, headerD, DragEnterDirection.AUTO)
245236

246237
await expectHeaders(['A', 'C', 'D', 'B'])
247238
})

webview/src/experiments/components/Experiments.tsx

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import buildDynamicColumns from '../util/buildDynamicColumns'
2424
import { sendMessage } from '../../shared/vscode'
2525
import { useThemeVariables } from '../../shared/components/theme/Theme'
2626
import { EmptyState } from '../../shared/components/emptyState/EmptyState'
27+
import { DragDropProvider } from '../../shared/components/dragDrop/DragDropContext'
2728

2829
const DEFAULT_COLUMN_WIDTH = 75
2930
const MINIMUM_COLUMN_WIDTH = 50
@@ -208,7 +209,11 @@ export const ExperimentsTable: React.FC<{
208209
return <EmptyState>No Experiments to Display.</EmptyState>
209210
}
210211

211-
return <Table instance={instance} tableData={tableData} />
212+
return (
213+
<DragDropProvider>
214+
<Table instance={instance} tableData={tableData} />
215+
</DragDropProvider>
216+
)
212217
}
213218

214219
const Experiments: React.FC<{

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

Lines changed: 34 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -3,54 +3,50 @@ import cx from 'classnames'
33
import { SortDefinition } from 'dvc/src/experiments/model/sortBy'
44
import { Experiment, Column } from 'dvc/src/experiments/webview/contract'
55
import { HeaderGroup } from 'react-table'
6-
import { DragDropContext, Droppable, Responders } from 'react-beautiful-dnd'
76
import { TableHeader } from './TableHeader'
87
import styles from './styles.module.scss'
8+
import {
9+
OnDragOver,
10+
OnDragStart,
11+
OnDrop
12+
} from '../../../shared/components/dragDrop/DragDropWorkbench'
913

10-
export const MergedHeaderGroup: React.FC<
11-
{
12-
headerGroup: HeaderGroup<Experiment>
13-
columns: HeaderGroup<Experiment>[]
14-
sorts: SortDefinition[]
15-
orderedColumns: Column[]
16-
} & Responders
17-
> = ({
14+
export const MergedHeaderGroups: React.FC<{
15+
headerGroup: HeaderGroup<Experiment>
16+
columns: HeaderGroup<Experiment>[]
17+
sorts: SortDefinition[]
18+
orderedColumns: Column[]
19+
onDragUpdate: OnDragOver
20+
onDragStart: OnDragStart
21+
onDragEnd: OnDrop
22+
}> = ({
1823
headerGroup,
1924
sorts,
2025
columns,
2126
orderedColumns,
22-
onDragStart,
2327
onDragUpdate,
24-
onDragEnd
28+
onDragEnd,
29+
onDragStart
2530
}) => {
2631
return (
27-
<DragDropContext
28-
onDragStart={onDragStart}
29-
onDragUpdate={onDragUpdate}
30-
onDragEnd={onDragEnd}
32+
<div
33+
{...headerGroup.getHeaderGroupProps({
34+
className: cx(styles.tr, styles.headerRow)
35+
})}
3136
>
32-
<Droppable droppableId="droppable" direction="horizontal">
33-
{provided => (
34-
<div
35-
ref={provided.innerRef}
36-
{...headerGroup.getHeaderGroupProps({
37-
className: cx(styles.tr, styles.headerRow)
38-
})}
39-
>
40-
{headerGroup.headers.map((column: HeaderGroup<Experiment>, i) => (
41-
<TableHeader
42-
orderedColumns={orderedColumns}
43-
key={column.id}
44-
column={column}
45-
columns={columns}
46-
sorts={sorts}
47-
index={i}
48-
/>
49-
))}
50-
<div className={styles.dndPlaceholder}>{provided.placeholder}</div>
51-
</div>
52-
)}
53-
</Droppable>
54-
</DragDropContext>
37+
{headerGroup.headers.map((column: HeaderGroup<Experiment>) => (
38+
<div key={column.id}>
39+
<TableHeader
40+
orderedColumns={orderedColumns}
41+
column={column}
42+
columns={columns}
43+
sorts={sorts}
44+
onDragOver={onDragUpdate}
45+
onDragStart={onDragStart}
46+
onDrop={onDragEnd}
47+
/>
48+
</div>
49+
))}
50+
</div>
5551
)
5652
}

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

Lines changed: 60 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,7 @@ import { Experiment, TableData } from 'dvc/src/experiments/webview/contract'
1414
import { MessageFromWebviewType } from 'dvc/src/webview/contract'
1515
import React from 'react'
1616
import { TableInstance } from 'react-table'
17-
import {
18-
mockGetComputedSpacing,
19-
mockDndElSpacing,
20-
makeDnd,
21-
DND_DIRECTION_LEFT,
22-
DND_DIRECTION_RIGHT
23-
} from 'react-beautiful-dnd-test-utils'
17+
import tableDataFixture from 'dvc/src/test/fixtures/expShow/tableData'
2418
import { SortOrderLabel } from './SortPicker'
2519
import { Table } from './Table'
2620
import styles from './styles.module.scss'
@@ -30,9 +24,11 @@ import * as ColumnOrder from '../../hooks/useColumnOrder'
3024
import { vsCodeApi } from '../../../shared/api'
3125
import {
3226
expectHeaders,
33-
makeGetDragEl,
27+
getHeaders,
3428
tableData as sortingTableDataFixture
3529
} from '../../../test/sort'
30+
import { dragAndDrop } from '../../../test/dragDrop'
31+
import { DragEnterDirection } from '../../../shared/components/dragDrop/util'
3632

3733
jest.mock('../../../shared/api')
3834
const { postMessage } = vsCodeApi
@@ -127,11 +123,7 @@ describe('Table', () => {
127123
const renderExperimentsTable = (
128124
data: TableData = sortingTableDataFixture
129125
) => {
130-
const view = render(<ExperimentsTable tableData={data} />)
131-
132-
mockDndElSpacing(view)
133-
134-
return view
126+
return render(<ExperimentsTable tableData={data} />)
135127
}
136128

137129
beforeAll(() => {
@@ -293,45 +285,38 @@ describe('Table', () => {
293285
})
294286

295287
describe('Columns order', () => {
296-
beforeEach(() => {
297-
mockGetComputedSpacing()
298-
})
299-
300288
it('should move a column from its current position to its new position', async () => {
301-
const { getByText } = renderExperimentsTable()
289+
renderExperimentsTable()
302290

303291
await expectHeaders(['A', 'B', 'C'])
304292

305-
await makeDnd({
306-
direction: DND_DIRECTION_LEFT,
307-
getByText,
308-
getDragEl: makeGetDragEl('C'),
309-
positions: 1
310-
})
293+
dragAndDrop(
294+
screen.getByText('B'),
295+
screen.getByText('C'),
296+
DragEnterDirection.AUTO
297+
)
311298

312299
await expectHeaders(['A', 'C', 'B'])
313300

314-
await makeDnd({
315-
direction: DND_DIRECTION_RIGHT,
316-
getByText,
317-
getDragEl: makeGetDragEl('A'),
318-
positions: 2
319-
})
301+
dragAndDrop(
302+
screen.getByText('A'),
303+
screen.getByText('B'),
304+
DragEnterDirection.AUTO
305+
)
320306

321307
await expectHeaders(['C', 'B', 'A'])
322308
})
323309

324310
it('should not move a column before the default columns', async () => {
325-
const { getByText } = renderExperimentsTable()
311+
renderExperimentsTable()
326312

327-
await makeDnd({
328-
direction: DND_DIRECTION_LEFT,
329-
getByText,
330-
getDragEl: makeGetDragEl('B'),
331-
positions: 3
332-
})
313+
dragAndDrop(
314+
screen.getByText('B'),
315+
screen.getByText('Timestamp'),
316+
DragEnterDirection.AUTO
317+
)
333318

334-
await expectHeaders(['B', 'A', 'C'])
319+
await expectHeaders(['A', 'B', 'C'])
335320
})
336321

337322
it('should order the columns with the columnOrder from the data', async () => {
@@ -378,5 +363,42 @@ describe('Table', () => {
378363
type: MessageFromWebviewType.RESIZE_COLUMN
379364
})
380365
})
366+
367+
it('should move all the columns from a group from their current position to their new position', async () => {
368+
renderExperimentsTable({ ...tableDataFixture })
369+
370+
let headers = await getHeaders()
371+
372+
expect(headers.indexOf('threshold')).toBeGreaterThan(
373+
headers.indexOf('loss')
374+
)
375+
expect(headers.indexOf('test')).toBeGreaterThan(
376+
headers.indexOf('accuracy')
377+
)
378+
379+
dragAndDrop(
380+
screen.getByText('process'),
381+
screen.getByText('loss'),
382+
DragEnterDirection.AUTO
383+
)
384+
385+
headers = await getHeaders()
386+
387+
expect(headers.indexOf('loss')).toBeGreaterThan(
388+
headers.indexOf('threshold')
389+
)
390+
391+
dragAndDrop(
392+
screen.getByText('summary.json'),
393+
screen.getByText('test'),
394+
DragEnterDirection.AUTO
395+
)
396+
397+
headers = await getHeaders()
398+
399+
expect(headers.indexOf('accuracy')).toBeGreaterThan(
400+
headers.indexOf('test')
401+
)
402+
})
381403
})
382404
})

0 commit comments

Comments
 (0)