@@ -114,7 +114,8 @@ interface DataViewRequestMessage {
114114 filterModel ?: Record < string , unknown > ;
115115}
116116
117- const dynamicDataViewPanels = new WeakSet < vscode . WebviewPanel > ( ) ;
117+ const dynamicDataViewPanels = new Map < string , vscode . WebviewPanel > ( ) ;
118+ let dynamicDataViewReloadRevision = 0 ;
118119
119120function escapeHtml ( text : string ) : string {
120121 const map : Record < string , string > = {
@@ -132,8 +133,6 @@ function formatDataViewPanelTitle(baseTitle: string, totalRows: number): string
132133}
133134
134135function attachDynamicDataViewBridge ( panel : vscode . WebviewPanel , viewId : string , baseTitle : string ) : void {
135- dynamicDataViewPanels . add ( panel ) ;
136-
137136 const postResponse = ( requestId : number , ok : boolean , result ?: unknown , error ?: string ) => {
138137 void panel . webview . postMessage ( {
139138 message : 'dataview/response' ,
@@ -192,8 +191,9 @@ function attachDynamicDataViewBridge(panel: vscode.WebviewPanel, viewId: string,
192191 method : 'dataview_dispose' ,
193192 params : { view_id : viewId } ,
194193 } ) ;
195- // Remove from panels set to prevent duplicate disposal on panel close
196- dynamicDataViewPanels . delete ( panel ) ;
194+ if ( dynamicDataViewPanels . get ( viewId ) === panel ) {
195+ dynamicDataViewPanels . delete ( viewId ) ;
196+ }
197197 postResponse ( msg . requestId , true , true ) ;
198198 return ;
199199 }
@@ -205,10 +205,10 @@ function attachDynamicDataViewBridge(panel: vscode.WebviewPanel, viewId: string,
205205 } ) ;
206206
207207 panel . onDidDispose ( ( ) => {
208- if ( ! dynamicDataViewPanels . has ( panel ) ) {
208+ if ( dynamicDataViewPanels . get ( viewId ) !== panel ) {
209209 return ;
210210 }
211- dynamicDataViewPanels . delete ( panel ) ;
211+ dynamicDataViewPanels . delete ( viewId ) ;
212212 void sessionRequest ( {
213213 method : 'dataview_dispose' ,
214214 params : { view_id : viewId } ,
@@ -637,11 +637,25 @@ export function openExternalBrowser(): void {
637637 }
638638}
639639
640- export async function showDataView ( source : string , type : string , title : string , file : string , viewer : string , viewId ?: string ) : Promise < void > {
640+ export async function showDataView ( source : string , type : string , title : string , file : string , viewer : string , viewId ?: string , totalRows ?: number ) : Promise < void > {
641641 console . info ( `[showDataView] source: ${ source } , type: ${ type } , title: ${ title } , file: ${ file } , viewer: ${ viewer } , viewId: ${ String ( viewId ?? '' ) } ` ) ;
642+ const panelTitle = totalRows !== undefined && Number . isFinite ( totalRows )
643+ ? formatDataViewPanelTitle ( title , totalRows )
644+ : title ;
642645
643646 if ( source === 'table' ) {
644- const panel = window . createWebviewPanel ( 'dataview' , title ,
647+ if ( viewId ) {
648+ const existing = dynamicDataViewPanels . get ( viewId ) ;
649+ if ( existing ) {
650+ existing . title = panelTitle ;
651+ existing . reveal ( ViewColumn [ viewer as keyof typeof ViewColumn ] , true ) ;
652+ const content = await getTableHtml ( existing . webview , undefined , title ) ;
653+ existing . webview . html = `${ content } \n<!-- dataview-reload:${ ++ dynamicDataViewReloadRevision } -->` ;
654+ return ;
655+ }
656+ }
657+
658+ const panel = window . createWebviewPanel ( 'dataview' , panelTitle ,
645659 {
646660 preserveFocus : true ,
647661 viewColumn : ViewColumn [ viewer as keyof typeof ViewColumn ] ,
@@ -652,12 +666,13 @@ export async function showDataView(source: string, type: string, title: string,
652666 retainContextWhenHidden : true ,
653667 localResourceRoots : [ Uri . file ( resDir ) ] ,
654668 } ) ;
655- const content = await getTableHtml ( panel . webview , file || undefined , title ) ;
656669 panel . iconPath = new UriIcon ( 'open-preview' ) ;
657- panel . webview . html = content ;
658670 if ( viewId ) {
671+ dynamicDataViewPanels . set ( viewId , panel ) ;
659672 attachDynamicDataViewBridge ( panel , viewId , title ) ;
660673 }
674+ const content = await getTableHtml ( panel . webview , file || undefined , title ) ;
675+ panel . webview . html = content ;
661676 } else if ( source === 'list' ) {
662677 const panel = window . createWebviewPanel ( 'dataview' , title ,
663678 {
@@ -1559,6 +1574,7 @@ async function handleNotification(message: Record<string, unknown>, socket: IpcS
15591574 String ( params . file ?? '' ) ,
15601575 viewer ,
15611576 params . view_id ? String ( params . view_id ) : undefined ,
1577+ typeof params . total_rows === 'number' ? params . total_rows : undefined ,
15621578 ) ;
15631579 }
15641580 }
0 commit comments