mirror of
https://github.com/Syngnat/GoNavi.git
synced 2026-08-12 01:24:12 +08:00
🐛 fix(data-grid): 保留独立窗口完整结果快照
- 数据变更回传不再受界面隐藏列过滤 - 同步编辑与删除后的完整结果行数据 - 补充独立窗口隐藏列快照回归测试
This commit is contained in:
@@ -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');
|
||||
|
||||
|
||||
@@ -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 || ''}`,
|
||||
|
||||
@@ -1359,6 +1359,7 @@ interface DataGridProps {
|
||||
initialViewMode?: GridViewMode;
|
||||
initialViewModeRequestId?: string;
|
||||
onDataViewActivate?: () => void;
|
||||
onDataChange?: (rows: any[]) => void;
|
||||
}
|
||||
|
||||
type GridFilterCondition = FilterCondition & {
|
||||
|
||||
Reference in New Issue
Block a user