11import * as React from 'react'
22import { Action , AnyAction } from 'redux'
33import classNames from 'classnames'
4+ import ContextMenuArea from 'react-electron-contextmenu'
5+ import { shell , MenuItemConstructorOptions } from 'electron'
46
57import { MyDatasets , WorkingDataset } from '../models/store'
68import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
@@ -57,9 +59,13 @@ export default class DatasetList extends React.Component<DatasetListProps> {
5759 }
5860
5961 render ( ) {
60- const { workingDataset, setModal } = this . props
61- const { setWorkingDataset } = this . props
62- const { filter, value : datasets } = this . props . myDatasets
62+ const {
63+ workingDataset,
64+ setModal,
65+ setWorkingDataset,
66+ myDatasets
67+ } = this . props
68+ const { filter, value : datasets } = myDatasets
6369
6470 const filteredDatasets = datasets . filter ( ( { peername, name, title } ) => {
6571 // if there's a non-empty filter string, only show matches on peername, name, and title
@@ -76,26 +82,50 @@ export default class DatasetList extends React.Component<DatasetListProps> {
7682 } )
7783
7884 const listContent = filteredDatasets . length > 0
79- ? filteredDatasets . map ( ( { peername, name, title, isLinked, published } ) => (
80- < div
81- key = { `${ peername } /${ name } ` }
82- className = { classNames ( 'sidebar-list-item' , 'sidebar-list-item-text' , {
83- 'selected' : ( peername === workingDataset . peername ) && ( name === workingDataset . name )
84- } ) }
85- onClick = { ( ) => setWorkingDataset ( peername , name , isLinked , published ) }
86- >
87- < div className = 'text-column' >
88- < div className = 'text' > { peername } /{ name } </ div >
89- < div className = 'subtext' > { title || < br /> } </ div >
90- </ div >
91- < div className = 'status-column' data-tip = 'unlinked' >
92- { ! isLinked && (
93- < FontAwesomeIcon icon = { faUnlink } size = 'sm' />
94- ) }
95- </ div >
85+ ? filteredDatasets . map ( ( { peername, name, title, fsipath, published } ) => {
86+ const menuItems : MenuItemConstructorOptions [ ] = fsipath
87+ ? [
88+ {
89+ label : 'Reveal in Finder' ,
90+ click : ( ) => { shell . showItemInFolder ( fsipath ) }
91+ } ,
92+ {
93+ type : 'separator'
94+ } ,
95+ {
96+ label : 'Remove...' ,
97+ click : ( ) => { setModal ( { type : ModalType . RemoveDataset } ) }
98+ }
99+ ]
100+ : [
101+ {
102+ label : 'Remove...' ,
103+ click : ( ) => { setModal ( { type : ModalType . RemoveDataset } ) }
104+ }
105+ ]
106+
107+ return ( < ContextMenuArea menuItems = { menuItems } key = { `${ peername } /${ name } ` } >
108+ < div
109+ key = { `${ peername } /${ name } ` }
110+ className = { classNames ( 'sidebar-list-item' , 'sidebar-list-item-text' , {
111+ 'selected' : ( peername === workingDataset . peername ) && ( name === workingDataset . name )
112+ } ) }
113+ onClick = { ( ) => setWorkingDataset ( peername , name , ! ! fsipath , published ) }
114+ >
115+ < div className = 'text-column' >
116+ < div className = 'text' > { peername } /{ name } </ div >
117+ < div className = 'subtext' > { title || < br /> } </ div >
118+ </ div >
119+ < div className = 'status-column' data-tip = 'unlinked' >
120+ { ! ! fsipath && (
121+ < FontAwesomeIcon icon = { faUnlink } size = 'sm' />
122+ ) }
123+ </ div >
96124
97- </ div >
98- ) )
125+ </ div >
126+ </ ContextMenuArea > )
127+ }
128+ )
99129 : < div className = 'sidebar-list-item-text' > Oops, no matches found for < strong > '{ filter } '</ strong > </ div >
100130
101131 const countMessage = filteredDatasets . length !== datasets . length
0 commit comments