@@ -358,6 +358,16 @@ fn handle_register_view_key(app: &mut App, key: KeyEvent) -> Result<()> {
358358 app. open_dialog ( ActiveDialog :: BulkCategorize ) ;
359359 }
360360
361+ // Bulk delete
362+ KeyCode :: Char ( 'D' ) if app. multi_select_mode && !app. selected_transactions . is_empty ( ) => {
363+ let count = app. selected_transactions . len ( ) ;
364+ app. open_dialog ( ActiveDialog :: Confirm ( format ! (
365+ "Delete {} transaction{}?" ,
366+ count,
367+ if count == 1 { "" } else { "s" }
368+ ) ) ) ;
369+ }
370+
361371 _ => { }
362372 }
363373
@@ -844,8 +854,32 @@ fn handle_dialog_key(app: &mut App, key: KeyEvent) -> Result<()> {
844854
845855/// Execute an action after user confirmation
846856fn execute_confirmed_action ( app : & mut App , message : & str ) -> Result < ( ) > {
847- // Delete transaction
848- if message. contains ( "Delete" ) && message. contains ( "transaction" ) {
857+ // Bulk delete transactions
858+ if message. contains ( "Delete" ) && message. contains ( "transaction" ) && !app. selected_transactions . is_empty ( ) {
859+ let transaction_ids = app. selected_transactions . clone ( ) ;
860+ let mut deleted_count = 0 ;
861+ let mut error_count = 0 ;
862+
863+ for txn_id in & transaction_ids {
864+ if let Err ( _) = app. storage . transactions . delete ( * txn_id) {
865+ error_count += 1 ;
866+ } else {
867+ deleted_count += 1 ;
868+ }
869+ }
870+
871+ let _ = app. storage . transactions . save ( ) ;
872+ app. selected_transactions . clear ( ) ;
873+ app. multi_select_mode = false ;
874+
875+ if error_count > 0 {
876+ app. set_status ( format ! ( "Deleted {} transaction(s), {} failed" , deleted_count, error_count) ) ;
877+ } else {
878+ app. set_status ( format ! ( "Deleted {} transaction(s)" , deleted_count) ) ;
879+ }
880+ }
881+ // Delete single transaction
882+ else if message. contains ( "Delete" ) && message. contains ( "transaction" ) {
849883 if let Some ( txn_id) = app. selected_transaction {
850884 if let Err ( e) = app. storage . transactions . delete ( txn_id) {
851885 app. set_status ( format ! ( "Failed to delete: {}" , e) ) ;
0 commit comments