Skip to content

Commit bc672e2

Browse files
committed
Fixed a scenario where different query with different column execution will return blank geometry viewer
1 parent aae18b2 commit bc672e2

File tree

2 files changed

+60
-6
lines changed

2 files changed

+60
-6
lines changed

web/pgadmin/tools/sqleditor/static/js/components/sections/GeometryViewer.jsx

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -323,6 +323,27 @@ function TheMap({data}) {
323323
infoControl.current.onAdd = function () {
324324
let ele = Leaflet.DomUtil.create('div', 'geometry-viewer-info-control');
325325
ele.innerHTML = data.infoList.join('<br />');
326+
// Style the parent control container after it's added to the map
327+
setTimeout(() => {
328+
let controlContainer = ele.closest('.leaflet-control');
329+
if(controlContainer) {
330+
controlContainer.style.cssText = `
331+
position: fixed;
332+
top: 70%;
333+
left: 50%;
334+
transform: translate(-50%, -50%);
335+
margin: 0;
336+
max-width: 80%;
337+
text-align: center;
338+
white-space: normal;
339+
word-wrap: break-word;
340+
background: none;
341+
box-shadow: none;
342+
border: none;
343+
font-size: 16px;
344+
`;
345+
}
346+
}, 0);
326347
return ele;
327348
};
328349
if(data.infoList.length > 0) {
@@ -535,11 +556,14 @@ export function GeometryViewer({rows, columns, column}) {
535556
// Parse geometry data only when needed
536557
const data = React.useMemo(() => {
537558
if (!currentColumnKey) {
559+
const hasGeometryColumn = columns.some(c => c.cell === 'geometry' || c.cell === 'geography');
538560
return {
539561
'geoJSONs': [],
540562
'selectedSRID': 0,
541563
'getPopupContent': undefined,
542-
'infoList': [gettext('Select a geometry/geography column to visualize.')],
564+
'infoList': hasGeometryColumn
565+
? [gettext('Query complete. Use the Geometry Viewer button in the Data Output tab to visualize results.')]
566+
: [gettext('No spatial data found. At least one geometry or geography column is required for visualization.')],
543567
};
544568
}
545569
return parseData(displayRows, columns, column);

web/pgadmin/tools/sqleditor/static/js/components/sections/ResultSet.jsx

Lines changed: 35 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -878,6 +878,11 @@ export function ResultSet() {
878878
const isDataChangedRef = useRef(false);
879879
const prevRowsRef = React.useRef(null);
880880
const prevColumnsRef = React.useRef(null);
881+
const gvClearedForColumnsRef = useRef(null);
882+
const lastGvSelectionRef = useRef({
883+
type: 'all', // 'all' | 'rows' | 'columns'
884+
selectedColumns: new Set(),
885+
});
881886

882887
useEffect(()=>{
883888
isDataChangedRef.current = Boolean(_.size(dataChangeStore.updated) || _.size(dataChangeStore.added) || _.size(dataChangeStore.deleted));
@@ -1463,13 +1468,19 @@ export function ResultSet() {
14631468
return ()=>eventBus.deregisterListener(QUERY_TOOL_EVENTS.TRIGGER_ADD_ROWS, triggerAddRows);
14641469
}, [columns, selectedRows.size]);
14651470

1466-
const getFilteredRowsForGeometryViewer = React.useCallback(() => {
1471+
const getFilteredRowsForGeometryViewer = React.useCallback((useLastGvSelection = false) => {
14671472
let selRowsData = rows;
14681473
if(selectedRows.size != 0) {
14691474
selRowsData = rows.filter((r)=>selectedRows.has(rowKeyGetter(r)));
14701475
} else if(selectedColumns.size > 0) {
14711476
let selectedCols = _.filter(columns, (_c, i)=>selectedColumns.has(i+1));
14721477
selRowsData = _.map(rows, (r)=>_.pick(r, _.map(selectedCols, (c)=>c.key)));
1478+
} else if(useLastGvSelection && lastGvSelectionRef.current.type === 'columns'
1479+
&& lastGvSelectionRef.current.selectedColumns.size > 0) {
1480+
let selectedCols = _.filter(columns, (_c, i)=>lastGvSelectionRef.current.selectedColumns.has(i+1));
1481+
if(selectedCols.length > 0) {
1482+
selRowsData = _.map(rows, (r)=>_.pick(r, _.map(selectedCols, (c)=>c.key)));
1483+
}
14731484
} else if(selectedRange.current) {
14741485
let [,, startRowIdx, endRowIdx] = getRangeIndexes();
14751486
selRowsData = rows.slice(startRowIdx, endRowIdx+1);
@@ -1491,12 +1502,20 @@ export function ResultSet() {
14911502
// Handle manual Geometry Viewer opening
14921503
useEffect(()=>{
14931504
const renderGeometries = (column)=>{
1505+
gvClearedForColumnsRef.current = null;
1506+
if(selectedRows.size > 0) {
1507+
lastGvSelectionRef.current = { type: 'rows', selectedColumns: new Set() };
1508+
} else if(selectedColumns.size > 0) {
1509+
lastGvSelectionRef.current = { type: 'columns', selectedColumns: new Set(selectedColumns) };
1510+
} else {
1511+
lastGvSelectionRef.current = { type: 'all', selectedColumns: new Set() };
1512+
}
14941513
const selRowsData = getFilteredRowsForGeometryViewer();
14951514
openGeometryViewerTab(column, selRowsData);
14961515
};
14971516
eventBus.registerListener(QUERY_TOOL_EVENTS.TRIGGER_RENDER_GEOMETRIES, renderGeometries);
14981517
return ()=>eventBus.deregisterListener(QUERY_TOOL_EVENTS.TRIGGER_RENDER_GEOMETRIES, renderGeometries);
1499-
}, [getFilteredRowsForGeometryViewer, openGeometryViewerTab, eventBus]);
1518+
}, [getFilteredRowsForGeometryViewer, openGeometryViewerTab, eventBus, selectedRows, selectedColumns]);
15001519

15011520
// Auto-update Geometry Viewer when rows/columns change
15021521
useEffect(()=>{
@@ -1506,8 +1525,19 @@ export function ResultSet() {
15061525

15071526
if((rowsChanged || columnsChanged) && layoutDocker.isTabOpen(PANELS.GEOMETRY)) {
15081527

1509-
if(currentGeometryColumn) {
1510-
const selRowsData = getFilteredRowsForGeometryViewer();
1528+
const prevColumnNames = prevColumnsRef.current?.map(c => c.key).sort().join(',') ?? '';
1529+
const currColumnNames = columns.map(c => c.key).sort().join(',');
1530+
const columnsChanged = prevColumnNames !== currColumnNames;
1531+
1532+
if(columnsChanged && currentGeometryColumn) {
1533+
gvClearedForColumnsRef.current = currColumnNames;
1534+
lastGvSelectionRef.current = { type: 'all', selectedColumns: new Set() };
1535+
openGeometryViewerTab(null, []);
1536+
} else if(gvClearedForColumnsRef.current === currColumnNames) {
1537+
openGeometryViewerTab(null, []);
1538+
} else if(currentGeometryColumn && rowsChanged) {
1539+
const useColSelection = lastGvSelectionRef.current.type === 'columns';
1540+
const selRowsData = getFilteredRowsForGeometryViewer(useColSelection);
15111541
openGeometryViewerTab(currentGeometryColumn, selRowsData);
15121542
} else {
15131543
// No geometry column
@@ -1517,7 +1547,7 @@ export function ResultSet() {
15171547

15181548
prevRowsRef.current = rows;
15191549
prevColumnsRef.current = columns;
1520-
}, [rows, columns, getFilteredRowsForGeometryViewer, openGeometryViewerTab, layoutDocker]);
1550+
}, [rows, columns, getFilteredRowsForGeometryViewer, layoutDocker]);
15211551

15221552
const triggerResetScroll = () => {
15231553
// Reset the scroll position to previously saved location.

0 commit comments

Comments
 (0)