@@ -141,10 +141,14 @@ export const FilesCardBody = ({
141141 }
142142 }
143143
144- const onDoubleClickNavigate = useCallback ( ( file : FolderFileInfo ) => {
144+ const onClickNavigate = useCallback ( ( file : FolderFileInfo , newTab : boolean = false ) => {
145145 const newPath = [ ...path , file . name ] . join ( "/" ) ;
146146 if ( file . to === "dir" ) {
147- cockpit . location . go ( "/" , { path : encodeURIComponent ( newPath ) } ) ;
147+ if ( newTab ) {
148+ open ( `#/?path=${ newPath } ` ) ;
149+ } else {
150+ cockpit . location . go ( "/" , { path : encodeURIComponent ( newPath ) } ) ;
151+ }
148152 }
149153 } , [ path ] ) ;
150154
@@ -181,7 +185,7 @@ export const FilesCardBody = ({
181185 return ;
182186 }
183187
184- onDoubleClickNavigate ( file ) ;
188+ onClickNavigate ( file ) ;
185189 } ;
186190
187191 const handleClick = ( ev : MouseEvent ) => {
@@ -194,7 +198,7 @@ export const FilesCardBody = ({
194198 }
195199
196200 if ( ev . detail > 1 ) {
197- onDoubleClickNavigate ( file ) ;
201+ onClickNavigate ( file ) ;
198202 } else {
199203 if ( ! ev . ctrlKey ) {
200204 setSelected ( [ file ] ) ;
@@ -206,6 +210,21 @@ export const FilesCardBody = ({
206210 return s . filter ( f => f . name !== file . name ) ;
207211 }
208212 } ) ;
213+ onClickNavigate ( file , true ) ;
214+ }
215+ }
216+ } ;
217+
218+ const handleAuxClick = ( ev : MouseEvent ) => {
219+ // capture middle click
220+ if ( ev . button === 1 ) {
221+ ev . preventDefault ( ) ;
222+ const name = getFilenameForEvent ( ev ) ;
223+ const file = sortedFiles ?. find ( file => file . name === name ) ;
224+
225+ if ( file ) {
226+ setSelected ( [ file ] ) ;
227+ onClickNavigate ( file , true ) ;
209228 }
210229 }
211230 } ;
@@ -262,7 +281,7 @@ export const FilesCardBody = ({
262281 return [ sortedFiles [ newIdx ] ] ;
263282 } ) ;
264283 } else if ( e . key === "Enter" && selected . length === 1 ) {
265- onDoubleClickNavigate ( selected [ 0 ] ) ;
284+ onClickNavigate ( selected [ 0 ] ) ;
266285 } else if ( e . key === "Delete" && selected . length !== 0 ) {
267286 confirm_delete ( dialogs , path . join ( "/" ) + "/" , selected , setSelected ) ;
268287 }
@@ -273,6 +292,7 @@ export const FilesCardBody = ({
273292 folderViewElem . addEventListener ( "click" , handleClick ) ;
274293 folderViewElem . addEventListener ( "dblclick" , handleDoubleClick ) ;
275294 folderViewElem . addEventListener ( "contextmenu" , handleContextMenu ) ;
295+ folderViewElem . addEventListener ( "auxclick" , handleAuxClick ) ;
276296 }
277297
278298 if ( ! isMounted . current && ! dialogs . isActive ( ) ) {
@@ -288,14 +308,15 @@ export const FilesCardBody = ({
288308 folderViewElem . removeEventListener ( "click" , handleClick ) ;
289309 folderViewElem . removeEventListener ( "dblclick" , handleDoubleClick ) ;
290310 folderViewElem . removeEventListener ( "contextmenu" , handleContextMenu ) ;
311+ folderViewElem . removeEventListener ( "auxclick" , handleAuxClick ) ;
291312 }
292313 } ;
293314 } , [
294315 setSelected ,
295316 sortedFiles ,
296317 boxPerRow ,
297318 selected ,
298- onDoubleClickNavigate ,
319+ onClickNavigate ,
299320 dialogs ,
300321 path ,
301322 ] ) ;
0 commit comments