@@ -67,6 +67,9 @@ let activeBrowserPanel: WebviewPanel | undefined;
6767let activeBrowserUri : Uri | undefined ;
6868let activeBrowserExternalUri : Uri | undefined ;
6969
70+ // Add a map to track dataview panels by UUID
71+ const dataviewPanels = new Map < string , WebviewPanel > ( ) ;
72+
7073export function deploySessionWatcher ( extensionPath : string ) : void {
7174 console . info ( `[deploySessionWatcher] extensionPath: ${ extensionPath } ` ) ;
7275 resDir = path . join ( extensionPath , 'dist' , 'resources' ) ;
@@ -334,15 +337,59 @@ export async function showWebView(file: string, title: string, viewer: string |
334337 console . info ( '[showWebView] Done' ) ;
335338}
336339
337- export async function showDataView ( source : string , type : string , title : string , file : string , viewer : string ) : Promise < void > {
338- console . info ( `[showDataView] source: ${ source } , type: ${ type } , title: ${ title } , file: ${ file } , viewer: ${ viewer } ` ) ;
340+ export async function showDataView ( source : string , type : string , title : string , file : string , viewer : string , dataview_uuid ?: string ) : Promise < void > {
341+ console . info ( `[showDataView] source: ${ source } , type: ${ type } , title: ${ title } , file: ${ file } , viewer: ${ viewer } , dataview_uuid: ${ dataview_uuid } ` ) ;
339342
340343 if ( isGuestSession ) {
341344 resDir = guestResDir ;
342345 }
343346
347+ // Check if we have an existing panel with this UUID
348+ let panel : WebviewPanel | undefined ;
349+ if ( dataview_uuid && dataviewPanels . has ( dataview_uuid ) ) {
350+ panel = dataviewPanels . get ( dataview_uuid ) ;
351+ // Panel might have been closed, check if it's still valid
352+ if ( panel ) {
353+ try {
354+ panel . title = title ; // Update title
355+ panel . reveal ( ViewColumn [ viewer as keyof typeof ViewColumn ] ) ;
356+
357+ if ( source === 'table' ) {
358+ // Update existing panel content
359+ const content = await getTableHtml ( panel . webview , file ) ;
360+ panel . webview . html = content ;
361+ } else if ( source === 'list' ) {
362+ const content = await getListHtml ( panel . webview , file ) ;
363+ panel . webview . html = content ;
364+ } else {
365+ // For other types, we'll still reopen, but use the existing panel
366+ if ( isGuestSession ) {
367+ const fileContent = await rGuestService ?. requestFileContent ( file , 'utf8' ) ;
368+ if ( fileContent ) {
369+ await openVirtualDoc ( file , fileContent , true , true , ViewColumn [ viewer as keyof typeof ViewColumn ] ) ;
370+ }
371+ } else {
372+ await commands . executeCommand ( 'vscode.open' , Uri . file ( file ) , {
373+ preserveFocus : true ,
374+ preview : true ,
375+ viewColumn : ViewColumn [ viewer as keyof typeof ViewColumn ] ,
376+ } ) ;
377+ }
378+ }
379+ console . info ( '[showDataView] Updated existing panel' ) ;
380+ return ;
381+ } catch ( e ) {
382+ console . log ( `Panel was disposed, creating new one: ${ e } ` ) ;
383+ // Panel was disposed, remove from registry
384+ dataviewPanels . delete ( dataview_uuid ) ;
385+ panel = undefined ;
386+ }
387+ }
388+ }
389+
390+ // Create a new panel if needed
344391 if ( source === 'table' ) {
345- const panel = window . createWebviewPanel ( 'dataview' , title ,
392+ panel = window . createWebviewPanel ( 'dataview' , title ,
346393 {
347394 preserveFocus : true ,
348395 viewColumn : ViewColumn [ viewer as keyof typeof ViewColumn ] ,
@@ -356,8 +403,16 @@ export async function showDataView(source: string, type: string, title: string,
356403 const content = await getTableHtml ( panel . webview , file ) ;
357404 panel . iconPath = new UriIcon ( 'open-preview' ) ;
358405 panel . webview . html = content ;
406+
407+ // Register panel if we have a UUID
408+ if ( dataview_uuid ) {
409+ dataviewPanels . set ( dataview_uuid , panel ) ;
410+ panel . onDidDispose ( ( ) => {
411+ dataviewPanels . delete ( dataview_uuid ! ) ;
412+ } ) ;
413+ }
359414 } else if ( source === 'list' ) {
360- const panel = window . createWebviewPanel ( 'dataview' , title ,
415+ panel = window . createWebviewPanel ( 'dataview' , title ,
361416 {
362417 preserveFocus : true ,
363418 viewColumn : ViewColumn [ viewer as keyof typeof ViewColumn ] ,
@@ -371,6 +426,14 @@ export async function showDataView(source: string, type: string, title: string,
371426 const content = await getListHtml ( panel . webview , file ) ;
372427 panel . iconPath = new UriIcon ( 'open-preview' ) ;
373428 panel . webview . html = content ;
429+
430+ // Register panel if we have a UUID
431+ if ( dataview_uuid ) {
432+ dataviewPanels . set ( dataview_uuid , panel ) ;
433+ panel . onDidDispose ( ( ) => {
434+ dataviewPanels . delete ( dataview_uuid ! ) ;
435+ } ) ;
436+ }
374437 } else {
375438 if ( isGuestSession ) {
376439 const fileContent = await rGuestService ?. requestFileContent ( file , 'utf8' ) ;
@@ -738,7 +801,8 @@ export async function writeSuccessResponse(responseSessionDir: string): Promise<
738801
739802type ISessionRequest = {
740803 plot_url ?: string ,
741- server ?: SessionServer
804+ server ?: SessionServer ,
805+ dataview_uuid ?: string // Add this property to match the R code
742806} & IRequest ;
743807
744808async function updateRequest ( sessionStatusBarItem : StatusBarItem ) {
@@ -753,7 +817,7 @@ async function updateRequest(sessionStatusBarItem: StatusBarItem) {
753817 console . info ( `[updateRequest] request: ${ requestContent } ` ) ;
754818 const request = JSON . parse ( requestContent ) as ISessionRequest ;
755819 if ( request . wd && isFromWorkspace ( request . wd ) ) {
756- if ( request . uuid === null || request . uuid === undefined || request . uuid === UUID ) {
820+ if ( request . uuid === null || request . uuid === undefined || String ( request . uuid ) === String ( UUID ) ) {
757821 switch ( request . command ) {
758822 case 'help' : {
759823 if ( globalRHelp && request . requestPath ) {
@@ -818,8 +882,9 @@ async function updateRequest(sessionStatusBarItem: StatusBarItem) {
818882 }
819883 case 'dataview' : {
820884 if ( request . source && request . type && request . file && request . title && request . viewer !== undefined ) {
885+ // Use dataview_uuid for panel tracking, preserve uuid for LiveShare
821886 await showDataView ( request . source ,
822- request . type , request . title , request . file , request . viewer ) ;
887+ request . type , request . title , request . file , request . viewer , request . dataview_uuid ) ;
823888 }
824889 break ;
825890 }
0 commit comments