Skip to content

Commit b01f41e

Browse files
committed
fix: preserve insertedRowData across undo/redo cycles for row insertions
- rowInsertion: capture savedValues BEFORE undoRowInsertion clears them, register reverse AFTER redo repopulates insertedRowData - batchRowInsertion redo: restore insertedRowData for each re-inserted row so SQL generation produces correct INSERT values
1 parent e1687aa commit b01f41e

1 file changed

Lines changed: 21 additions & 10 deletions

File tree

TablePro/Core/ChangeTracking/DataChangeManager.swift

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -505,23 +505,24 @@ final class DataChangeManager {
505505
lastUndoResult = UndoResult(action: action, needsRowRemoval: false, needsRowRestore: false, restoreRow: nil)
506506

507507
case .rowInsertion(let rowIndex):
508-
let savedValues = insertedRowData[rowIndex]
509-
undoManager.registerUndo(withTarget: self) { [savedValues] target in
510-
// Restore saved values so the reverse operation can access them
511-
if let savedValues {
512-
target.insertedRowData[rowIndex] = savedValues
513-
}
514-
target.applyDataUndo(.rowInsertion(rowIndex: rowIndex))
515-
}
516-
undoManager.setActionName(String(localized: "Insert Row"))
517-
518508
if insertedRowIndices.contains(rowIndex) {
509+
// Undo: capture values BEFORE undoRowInsertion clears them
510+
let savedValues = insertedRowData[rowIndex]
511+
undoManager.registerUndo(withTarget: self) { [savedValues] target in
512+
if let savedValues {
513+
target.insertedRowData[rowIndex] = savedValues
514+
}
515+
target.applyDataUndo(.rowInsertion(rowIndex: rowIndex))
516+
}
517+
undoManager.setActionName(String(localized: "Insert Row"))
519518
undoRowInsertion(rowIndex: rowIndex)
520519
changedRowIndices.insert(rowIndex)
521520
lastUndoResult = UndoResult(
522521
action: action, needsRowRemoval: true, needsRowRestore: false, restoreRow: nil
523522
)
524523
} else {
524+
// Redo: re-insert the row, then register reverse
525+
let savedValues = insertedRowData[rowIndex]
525526
insertedRowIndices.insert(rowIndex)
526527
let cellChanges = columns.enumerated().map { index, columnName in
527528
CellChange(
@@ -538,6 +539,15 @@ final class DataChangeManager {
538539
if let savedValues {
539540
insertedRowData[rowIndex] = savedValues
540541
}
542+
// Register reverse AFTER insertedRowData is populated
543+
let valuesToCapture = insertedRowData[rowIndex]
544+
undoManager.registerUndo(withTarget: self) { [valuesToCapture] target in
545+
if let valuesToCapture {
546+
target.insertedRowData[rowIndex] = valuesToCapture
547+
}
548+
target.applyDataUndo(.rowInsertion(rowIndex: rowIndex))
549+
}
550+
undoManager.setActionName(String(localized: "Insert Row"))
541551
changedRowIndices.insert(rowIndex)
542552
lastUndoResult = UndoResult(
543553
action: action, needsRowRemoval: false, needsRowRestore: true, restoreRow: savedValues
@@ -629,6 +639,7 @@ final class DataChangeManager {
629639
let rowChange = RowChange(rowIndex: rowIndex, type: .insert, cellChanges: cellChanges)
630640
changes.append(rowChange)
631641
insertedRowIndices.insert(rowIndex)
642+
insertedRowData[rowIndex] = values
632643
}
633644

634645
rebuildChangeIndex()

0 commit comments

Comments
 (0)