@@ -460,7 +460,10 @@ impl MessageHandler<DocumentMessage, DocumentMessageContext<'_>> for DocumentMes
460460 self . layer_range_selection_reference = None ;
461461 self . chain_node_range_selection_reference = None ;
462462 }
463- DocumentMessage :: DocumentHistoryBackward => self . undo_with_history ( document_id, viewport, preferences. validate_storage_round_trip , responses) ,
463+ DocumentMessage :: DocumentHistoryBackward => {
464+ self . stage_edits_outside_transaction ( & resource_storage. resources_mut ( ) , preferences. validate_storage_round_trip ) ;
465+ self . undo_with_history ( document_id, viewport, preferences. validate_storage_round_trip , responses)
466+ }
464467 DocumentMessage :: DocumentHistoryForward => self . redo_with_history ( document_id, viewport, preferences. validate_storage_round_trip , responses) ,
465468 DocumentMessage :: DocumentStructureChanged => {
466469 if layers_panel_open {
@@ -1655,6 +1658,7 @@ impl MessageHandler<DocumentMessage, DocumentMessageContext<'_>> for DocumentMes
16551658 }
16561659 // Note: A transaction should never be started in a scope that mutates the network interface, since it will only be run after that scope ends.
16571660 DocumentMessage :: StartTransaction => {
1661+ self . stage_edits_outside_transaction ( & resource_storage. resources_mut ( ) , preferences. validate_storage_round_trip ) ;
16581662 self . retire_storage_interaction ( ) ;
16591663
16601664 self . network_interface . start_transaction ( ) ;
@@ -2426,6 +2430,14 @@ impl DocumentMessageHandler {
24262430 }
24272431 }
24282432
2433+ /// Stages edits made after a transaction finished, such as those queued behind an `AddTransaction`, whose commit runs
2434+ /// first. They belong to the undo step that just ended, so they must reach storage before it closes.
2435+ fn stage_edits_outside_transaction ( & mut self , byte_store : & dyn graph_craft:: application_io:: resource:: ResourceStorage , validate : bool ) {
2436+ if self . network_interface . transaction_status ( ) == TransactionStatus :: Finished && self . network_interface . has_deltas ( ) {
2437+ self . commit_storage_snapshot ( byte_store, validate) ;
2438+ }
2439+ }
2440+
24292441 /// The per-peer view settings that ride along with either kind of staging.
24302442 fn storage_view_settings ( & self ) -> std:: collections:: BTreeMap < String , document_graph_storage:: Value > {
24312443 use crate :: messages:: portfolio:: document:: utility_types:: network_interface:: storage_metadata:: DocumentSettings ;
0 commit comments