From 51705f8fc796244088783385fe04b6e7992ef163 Mon Sep 17 00:00:00 2001 From: reugenio Date: Sat, 27 Dec 2025 23:36:25 +0100 Subject: [PATCH] fix(virtual_table): Commit pending changes on tab_out When user tabs out of the table with pending changes in RowEditBuffer, commit them before exiting. Prevents data loss when leaving ghost row. --- .../virtual_advanced_table.zig | 21 ++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/src/widgets/virtual_advanced_table/virtual_advanced_table.zig b/src/widgets/virtual_advanced_table/virtual_advanced_table.zig index 8b042cb..1e261db 100644 --- a/src/widgets/virtual_advanced_table/virtual_advanced_table.zig +++ b/src/widgets/virtual_advanced_table/virtual_advanced_table.zig @@ -1139,11 +1139,30 @@ fn handleKeyboard( } // ========================================================================= - // Tab navigation + // Tab navigation (con commit de cambios pendientes) // ========================================================================= if (events.tab_out) { // Solo si CellEditor no procesó Tab (evita doble procesamiento) if (result.navigate_direction == .none) { + // IMPORTANTE: Commit cambios pendientes antes de salir de la tabla + if (list_state.row_edit_buffer.has_changes) { + const current_row_id = list_state.row_edit_buffer.row_id; + const is_ghost = table_core.isGhostRow(current_row_id); + + // Forzar commit de la fila actual (pasamos NEW_ROW_ID para forzar diferencia) + if (table_core.checkRowChangeAndCommit( + &list_state.row_edit_buffer, + table_core.NEW_ROW_ID - 1, // ID diferente para forzar commit + 0, + false, + &result.row_changes, + )) |commit_info| { + result.row_committed = true; + result.row_commit_id = current_row_id; + result.row_commit_is_insert = is_ghost; + result.row_changes_count = commit_info.change_count; + } + } result.tab_out = true; result.tab_shift = events.tab_shift; }