@@ -876,6 +876,9 @@ export function ResultSet() {
876876 rsu . current . setLoaderText = setLoaderText ;
877877
878878 const isDataChangedRef = useRef ( false ) ;
879+ const prevRowsRef = React . useRef ( null ) ;
880+ const prevColumnsRef = React . useRef ( null ) ;
881+
879882 useEffect ( ( ) => {
880883 isDataChangedRef . current = Boolean ( _ . size ( dataChangeStore . updated ) || _ . size ( dataChangeStore . added ) || _ . size ( dataChangeStore . deleted ) ) ;
881884 } , [ dataChangeStore ] ) ;
@@ -1460,30 +1463,61 @@ export function ResultSet() {
14601463 return ( ) => eventBus . deregisterListener ( QUERY_TOOL_EVENTS . TRIGGER_ADD_ROWS , triggerAddRows ) ;
14611464 } , [ columns , selectedRows . size ] ) ;
14621465
1466+ const getFilteredRowsForGeometryViewer = React . useCallback ( ( ) => {
1467+ let selRowsData = rows ;
1468+ if ( selectedRows . size != 0 ) {
1469+ selRowsData = rows . filter ( ( r ) => selectedRows . has ( rowKeyGetter ( r ) ) ) ;
1470+ } else if ( selectedColumns . size > 0 ) {
1471+ let selectedCols = _ . filter ( columns , ( _c , i ) => selectedColumns . has ( i + 1 ) ) ;
1472+ selRowsData = _ . map ( rows , ( r ) => _ . pick ( r , _ . map ( selectedCols , ( c ) => c . key ) ) ) ;
1473+ } else if ( selectedRange . current ) {
1474+ let [ , , startRowIdx , endRowIdx ] = getRangeIndexes ( ) ;
1475+ selRowsData = rows . slice ( startRowIdx , endRowIdx + 1 ) ;
1476+ } else if ( selectedCell . current ?. [ 0 ] ) {
1477+ selRowsData = [ selectedCell . current [ 0 ] ] ;
1478+ }
1479+ return selRowsData ;
1480+ } , [ rows , columns , selectedRows , selectedColumns ] ) ;
1481+
1482+ const openGeometryViewerTab = React . useCallback ( ( column , rowsData ) => {
1483+ layoutDocker . openTab ( {
1484+ id : PANELS . GEOMETRY ,
1485+ title : gettext ( 'Geometry Viewer' ) ,
1486+ content : < GeometryViewer rows = { rowsData } columns = { columns } column = { column } /> ,
1487+ closable : true ,
1488+ } , PANELS . MESSAGES , 'after-tab' , true ) ;
1489+ } , [ layoutDocker , columns ] ) ;
1490+
1491+ // Handle manual Geometry Viewer opening
14631492 useEffect ( ( ) => {
14641493 const renderGeometries = ( column ) => {
1465- let selRowsData = rows ;
1466- if ( selectedRows . size != 0 ) {
1467- selRowsData = rows . filter ( ( r ) => selectedRows . has ( rowKeyGetter ( r ) ) ) ;
1468- } else if ( selectedColumns . size > 0 ) {
1469- let selectedCols = _ . filter ( columns , ( _c , i ) => selectedColumns . has ( i + 1 ) ) ;
1470- selRowsData = _ . map ( rows , ( r ) => _ . pick ( r , _ . map ( selectedCols , ( c ) => c . key ) ) ) ;
1471- } else if ( selectedRange . current ) {
1472- let [ , , startRowIdx , endRowIdx ] = getRangeIndexes ( ) ;
1473- selRowsData = rows . slice ( startRowIdx , endRowIdx + 1 ) ;
1474- } else if ( selectedCell . current ?. [ 0 ] ) {
1475- selRowsData = [ selectedCell . current [ 0 ] ] ;
1476- }
1477- layoutDocker . openTab ( {
1478- id : PANELS . GEOMETRY ,
1479- title :gettext ( 'Geometry Viewer' ) ,
1480- content : < GeometryViewer rows = { selRowsData } columns = { columns } column = { column } /> ,
1481- closable : true ,
1482- } , PANELS . MESSAGES , 'after-tab' , true ) ;
1494+ const selRowsData = getFilteredRowsForGeometryViewer ( ) ;
1495+ openGeometryViewerTab ( column , selRowsData ) ;
14831496 } ;
14841497 eventBus . registerListener ( QUERY_TOOL_EVENTS . TRIGGER_RENDER_GEOMETRIES , renderGeometries ) ;
14851498 return ( ) => eventBus . deregisterListener ( QUERY_TOOL_EVENTS . TRIGGER_RENDER_GEOMETRIES , renderGeometries ) ;
1486- } , [ rows , columns , selectedRows . size , selectedColumns . size ] ) ;
1499+ } , [ getFilteredRowsForGeometryViewer , openGeometryViewerTab , eventBus ] ) ;
1500+
1501+ // Auto-update Geometry Viewer when rows/columns change
1502+ useEffect ( ( ) => {
1503+ const rowsChanged = prevRowsRef . current !== rows ;
1504+ const columnsChanged = prevColumnsRef . current !== columns ;
1505+ const currentGeometryColumn = columns . find ( col => col . cell === 'geometry' || col . cell === 'geography' ) ;
1506+
1507+ if ( ( rowsChanged || columnsChanged ) && layoutDocker . isTabOpen ( PANELS . GEOMETRY ) ) {
1508+
1509+ if ( currentGeometryColumn ) {
1510+ const selRowsData = getFilteredRowsForGeometryViewer ( ) ;
1511+ openGeometryViewerTab ( currentGeometryColumn , selRowsData ) ;
1512+ } else {
1513+ // No geometry column
1514+ openGeometryViewerTab ( null , [ ] ) ;
1515+ }
1516+ }
1517+
1518+ prevRowsRef . current = rows ;
1519+ prevColumnsRef . current = columns ;
1520+ } , [ rows , columns , getFilteredRowsForGeometryViewer , openGeometryViewerTab , layoutDocker ] ) ;
14871521
14881522 const triggerResetScroll = ( ) => {
14891523 // Reset the scroll position to previously saved location.
0 commit comments