11import { ColumnType , Experiment } from 'dvc/src/experiments/webview/contract'
22import { MessageFromWebviewType } from 'dvc/src/webview/contract'
3- import { VSCodeDivider } from '@vscode/webview-ui-toolkit/react'
43import React , { useMemo } from 'react'
54import { Header } from '@tanstack/react-table'
65import { useSelector } from 'react-redux'
76import { SortDefinition } from 'dvc/src/experiments/model/sortBy'
7+ import { SortOrder , getSortDetails , isFromExperimentColumn } from './util'
88import { MessagesMenu } from '../../../../shared/components/messagesMenu/MessagesMenu'
99import { MessagesMenuOptionProps } from '../../../../shared/components/messagesMenu/MessagesMenuOption'
1010import { ExperimentsState } from '../../../store'
1111import { ColumnWithGroup } from '../../../util/buildColumns'
1212
13- export enum SortOrder {
14- ASCENDING = 'Sort Ascending' ,
15- DESCENDING = 'Sort Descending' ,
16- NONE = 'Remove Sort'
17- }
18-
19- const possibleOrders = {
20- false : SortOrder . ASCENDING ,
21- true : SortOrder . DESCENDING ,
22- undefined : SortOrder . NONE
23- } as const
24-
25- const isFromExperimentColumn = ( header : Header < Experiment , unknown > ) =>
26- header . column . id === 'id' || header . column . id . startsWith ( 'id_placeholder' )
27-
2813const sortOption = (
2914 label : SortOrder ,
3015 currentSort : SortOrder ,
3116 columnId : string ,
32- isSortable : boolean
17+ isSortable : boolean ,
18+ divider ?: boolean
3319) => {
3420 const sortOrder = currentSort
3521 const disabled = ! isSortable || sortOrder === label
@@ -53,6 +39,7 @@ const sortOption = (
5339
5440 return {
5541 disabled,
42+ divider,
5643 id : label ,
5744 label,
5845 message
@@ -63,36 +50,14 @@ interface HeaderMenuProps {
6350 header : Header < Experiment , unknown >
6451}
6552
66- const getSortOptions = (
67- header : Header < Experiment , unknown > ,
68- sorts : SortDefinition [ ]
69- ) => {
70- const isNotExperiments = ! isFromExperimentColumn ( header )
71- const isSortable = isNotExperiments && header . column . columns . length <= 1
72- const baseColumn =
73- header . headerGroup . headers . find (
74- h => h . column . id === header . placeholderId
75- ) || header . column
76- const sort = sorts . find ( sort => sort . path === baseColumn . id )
77-
78- // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
79- const sortOrder : SortOrder = possibleOrders [ `${ sort ?. descending } ` ]
80-
81- const sortOptions = [
82- sortOption ( SortOrder . ASCENDING , sortOrder , baseColumn . id , isSortable ) ,
83- sortOption ( SortOrder . DESCENDING , sortOrder , baseColumn . id , isSortable ) ,
84- sortOption ( SortOrder . NONE , sortOrder , baseColumn . id , isSortable )
85- ]
86-
87- return { isSortable, sortOptions, sortOrder }
88- }
89-
90- export const getMenuOptions = (
53+ const getMenuOptions = (
9154 header : Header < Experiment , unknown > ,
9255 sorts : SortDefinition [ ]
93- ) => {
56+ ) : MessagesMenuOptionProps [ ] => {
9457 const leafColumn = header . column
95- const menuOptions : MessagesMenuOptionProps [ ] = [
58+ const { id, isSortable, sortOrder } = getSortDetails ( header , sorts )
59+
60+ return [
9661 {
9762 disabled : isFromExperimentColumn ( header ) ,
9863 id : 'hide' ,
@@ -143,30 +108,19 @@ export const getMenuOptions = (
143108 message : {
144109 type : MessageFromWebviewType . SELECT_FIRST_COLUMNS
145110 }
146- }
111+ } ,
112+ sortOption ( SortOrder . ASCENDING , sortOrder , id , isSortable , true ) ,
113+ sortOption ( SortOrder . DESCENDING , sortOrder , id , isSortable ) ,
114+ sortOption ( SortOrder . NONE , sortOrder , id , isSortable )
147115 ]
148-
149- const { isSortable, sortOptions, sortOrder } = getSortOptions ( header , sorts )
150-
151- return { isSortable, menuOptions, sortOptions, sortOrder }
152116}
153117
154118export const ContextMenuContent : React . FC < HeaderMenuProps > = ( { header } ) => {
155119 const { sorts } = useSelector ( ( state : ExperimentsState ) => state . tableData )
156120
157- const { menuOptions, sortOptions } = useMemo ( ( ) => {
121+ const menuOptions = useMemo ( ( ) => {
158122 return getMenuOptions ( header , sorts )
159123 } , [ header , sorts ] )
160124
161- return (
162- < div >
163- < MessagesMenu options = { menuOptions } />
164- { sortOptions . length > 0 && (
165- < >
166- < VSCodeDivider />
167- < MessagesMenu options = { sortOptions } />
168- </ >
169- ) }
170- </ div >
171- )
125+ return < MessagesMenu options = { menuOptions } />
172126}
0 commit comments