🐛 fix(data-grid): 保留独立窗口完整结果快照

- 数据变更回传不再受界面隐藏列过滤
- 同步编辑与删除后的完整结果行数据
- 补充独立窗口隐藏列快照回归测试
This commit is contained in:
Syngnat
2026-07-17 16:05:24 +08:00
parent 38a18b9b8e
commit a86f5c6078
3 changed files with 31 additions and 0 deletions

View File

@@ -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');

View File

@@ -298,6 +298,7 @@ const DataGrid: React.FC<DataGridProps> = ({
initialViewMode,
initialViewModeRequestId,
onDataViewActivate,
onDataChange,
}) => {
const connections = useStore(state => state.connections);
const addTab = useStore(state => state.addTab);
@@ -525,6 +526,10 @@ const DataGrid: React.FC<DataGridProps> = ({
),
[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<DataGridProps> = ({
});
}, [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 || ''}`,

View File

@@ -1359,6 +1359,7 @@ interface DataGridProps {
initialViewMode?: GridViewMode;
initialViewModeRequestId?: string;
onDataViewActivate?: () => void;
onDataChange?: (rows: any[]) => void;
}
type GridFilterCondition = FilterCondition & {