Skip to content

Commit ac66e99

Browse files
committed
✨ feat: add bulk delete for transactions
1 parent 519738d commit ac66e99

2 files changed

Lines changed: 37 additions & 3 deletions

File tree

src/tui/handler.rs

Lines changed: 36 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -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
846856
fn 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));

src/tui/views/register.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ fn render_header(frame: &mut Frame, app: &mut App, area: Rect) {
5050
.border_style(Style::default().fg(Color::White));
5151

5252
let hints = if app.multi_select_mode {
53-
"Multi-select: SPACE to select, C to categorize, v to exit"
53+
"Multi-select: SPACE to select, C to categorize, D to delete, v to exit"
5454
} else {
5555
"a:Add e:Edit c:Clear v:Multi-select"
5656
};

0 commit comments

Comments
 (0)