From a86f5c607826b23b93fe90edafad1aef343e471a Mon Sep 17 00:00:00 2001 From: Syngnat Date: Fri, 17 Jul 2026 16:05:24 +0800 Subject: [PATCH] =?UTF-8?q?=F0=9F=90=9B=20fix(data-grid):=20=E4=BF=9D?= =?UTF-8?q?=E7=95=99=E7=8B=AC=E7=AB=8B=E7=AA=97=E5=8F=A3=E5=AE=8C=E6=95=B4?= =?UTF-8?q?=E7=BB=93=E6=9E=9C=E5=BF=AB=E7=85=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 数据变更回传不再受界面隐藏列过滤 - 同步编辑与删除后的完整结果行数据 - 补充独立窗口隐藏列快照回归测试 --- frontend/src/components/DataGrid.ddl.test.tsx | 10 ++++++++++ frontend/src/components/DataGrid.tsx | 20 +++++++++++++++++++ frontend/src/components/DataGridCore.tsx | 1 + 3 files changed, 31 insertions(+) diff --git a/frontend/src/components/DataGrid.ddl.test.tsx b/frontend/src/components/DataGrid.ddl.test.tsx index 5f2eb50a..e896d7a0 100644 --- a/frontend/src/components/DataGrid.ddl.test.tsx +++ b/frontend/src/components/DataGrid.ddl.test.tsx @@ -796,6 +796,16 @@ describe('DataGrid commit change set', () => { expect(dataGridSource).toContain('data_grid.message.locator_column_value_empty'); }); + it('keeps hidden result columns in detached-window data snapshots', () => { + const dataGridSource = readFileSync(new URL('./DataGrid.tsx', import.meta.url), 'utf8'); + expect(dataGridSource).toContain( + 'pickDataGridOutputRows(currentRows, dataChangeOutputColumnNames)', + ); + expect(dataGridSource).not.toContain( + 'pickDataGridOutputRows(currentRows, displayOutputColumnNames)', + ); + }); + it('keeps DataGrid column quick-find warning messages localized', () => { const dataGridSource = readFileSync(new URL('./DataGrid.tsx', import.meta.url), 'utf8'); diff --git a/frontend/src/components/DataGrid.tsx b/frontend/src/components/DataGrid.tsx index 2805a74c..5ef6a071 100644 --- a/frontend/src/components/DataGrid.tsx +++ b/frontend/src/components/DataGrid.tsx @@ -298,6 +298,7 @@ const DataGrid: React.FC = ({ initialViewMode, initialViewModeRequestId, onDataViewActivate, + onDataChange, }) => { const connections = useStore(state => state.connections); const addTab = useStore(state => state.addTab); @@ -525,6 +526,10 @@ const DataGrid: React.FC = ({ ), [displayColumnNames, allOrderedColumnNames, visibleColumnNames] ); + const dataChangeOutputColumnNames = useMemo( + () => resolveDataGridOutputColumnNames(columnNames, GONAVI_ROW_KEY), + [columnNames], + ); // Handle Dragging const sensors = useSensors( @@ -2069,6 +2074,21 @@ const DataGrid: React.FC = ({ }); }, [displayData, modifiedRows, deletedRowKeys]); mergedDisplayDataRef.current = mergedDisplayData; + const lastReportedDataFingerprintRef = useRef(''); + useEffect(() => { + if (!onDataChange) return; + const currentRows = mergedDisplayData.filter((row) => { + const rowKey = row?.[GONAVI_ROW_KEY]; + return rowKey === undefined || !deletedRowKeys.has(rowKeyStr(rowKey)); + }); + // A hidden column is still part of the result snapshot. Only presentation + // uses displayOutputColumnNames; detach/attach state must keep full rows. + const outputRows = pickDataGridOutputRows(currentRows, dataChangeOutputColumnNames); + const fingerprint = JSON.stringify(outputRows); + if (fingerprint === lastReportedDataFingerprintRef.current) return; + lastReportedDataFingerprintRef.current = fingerprint; + onDataChange(outputRows); + }, [dataChangeOutputColumnNames, deletedRowKeys, mergedDisplayData, onDataChange, rowKeyStr]); const dataSourceContextKey = useMemo( () => `${connectionId || ''}\u0001${dbName || ''}\u0001${tableName || ''}`, diff --git a/frontend/src/components/DataGridCore.tsx b/frontend/src/components/DataGridCore.tsx index 27d93703..e637968a 100644 --- a/frontend/src/components/DataGridCore.tsx +++ b/frontend/src/components/DataGridCore.tsx @@ -1359,6 +1359,7 @@ interface DataGridProps { initialViewMode?: GridViewMode; initialViewModeRequestId?: string; onDataViewActivate?: () => void; + onDataChange?: (rows: any[]) => void; } type GridFilterCondition = FilterCondition & {