feat: melhorar popup delete com contexto e adicionar logs CRUD
This commit is contained in:
+86
-9
@@ -224,6 +224,10 @@ impl App {
|
|||||||
}
|
}
|
||||||
let task = &mut self.tasks[self.selected_task];
|
let task = &mut self.tasks[self.selected_task];
|
||||||
task.due = Some(due);
|
task.due = Some(due);
|
||||||
|
crate::log_msg(&format!(
|
||||||
|
"[task_app] TASK UPDATE: title=\"{}\" id={} due={}",
|
||||||
|
task.title, task.id, due
|
||||||
|
));
|
||||||
self.db.update_task(task).ok();
|
self.db.update_task(task).ok();
|
||||||
self.db.push_sync(
|
self.db.push_sync(
|
||||||
SyncAction::Update,
|
SyncAction::Update,
|
||||||
@@ -441,7 +445,25 @@ impl App {
|
|||||||
}
|
}
|
||||||
KeyCode::Char('d') | KeyCode::Char('D') => {
|
KeyCode::Char('d') | KeyCode::Char('D') => {
|
||||||
if !self.needs_auth {
|
if !self.needs_auth {
|
||||||
self.show_popup = Some(Popup::ConfirmDelete);
|
let context = match self.focus {
|
||||||
|
Focus::Tabs => {
|
||||||
|
if self.selected_list < self.lists.len() {
|
||||||
|
format!("Delete list: \"{}\"?", self.lists[self.selected_list].title)
|
||||||
|
} else {
|
||||||
|
"Delete this list?".to_string()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_ => {
|
||||||
|
if !self.tasks.is_empty() && self.selected_task < self.tasks.len() {
|
||||||
|
let title = &self.tasks[self.selected_task].title;
|
||||||
|
let preview: String = title.chars().take(40).collect();
|
||||||
|
format!("Delete task: \"{}\"?", preview)
|
||||||
|
} else {
|
||||||
|
"Delete this task?".to_string()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
self.show_popup = Some(Popup::ConfirmDelete { context });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
KeyCode::Char('e') | KeyCode::Char('E') => {
|
KeyCode::Char('e') | KeyCode::Char('E') => {
|
||||||
@@ -470,10 +492,15 @@ impl App {
|
|||||||
self.show_popup = Some(Popup::BulkAction);
|
self.show_popup = Some(Popup::BulkAction);
|
||||||
} else {
|
} else {
|
||||||
let task = &mut self.tasks[self.selected_task];
|
let task = &mut self.tasks[self.selected_task];
|
||||||
|
let old_status = task.status.clone();
|
||||||
task.status = match task.status {
|
task.status = match task.status {
|
||||||
TaskStatus::Completed => TaskStatus::NeedsAction,
|
TaskStatus::Completed => TaskStatus::NeedsAction,
|
||||||
TaskStatus::NeedsAction => TaskStatus::Completed,
|
TaskStatus::NeedsAction => TaskStatus::Completed,
|
||||||
};
|
};
|
||||||
|
crate::log_msg(&format!(
|
||||||
|
"[task_app] TASK UPDATE: title=\"{}\" id={} status={:?}->{:?}",
|
||||||
|
task.title, task.id, old_status, task.status
|
||||||
|
));
|
||||||
self.db.update_task(task).ok();
|
self.db.update_task(task).ok();
|
||||||
self.db.push_sync(
|
self.db.push_sync(
|
||||||
SyncAction::Update,
|
SyncAction::Update,
|
||||||
@@ -538,11 +565,15 @@ impl App {
|
|||||||
self.pending_bulk_move = false;
|
self.pending_bulk_move = false;
|
||||||
self.bulk_move_to_new_list(&input);
|
self.bulk_move_to_new_list(&input);
|
||||||
self.show_popup = None;
|
self.show_popup = None;
|
||||||
} else if !input.is_empty() {
|
} else if !input.is_empty() {
|
||||||
let list = TaskList {
|
let list = TaskList {
|
||||||
id: uuid_v4(),
|
id: uuid_v4(),
|
||||||
title: input,
|
title: input,
|
||||||
};
|
};
|
||||||
|
crate::log_msg(&format!(
|
||||||
|
"[task_app] LIST CREATE: title=\"{}\" id={}",
|
||||||
|
list.title, list.id
|
||||||
|
));
|
||||||
self.db.insert_list(&list).ok();
|
self.db.insert_list(&list).ok();
|
||||||
self.db.push_sync(
|
self.db.push_sync(
|
||||||
SyncAction::CreateList,
|
SyncAction::CreateList,
|
||||||
@@ -655,6 +686,10 @@ impl App {
|
|||||||
if let Some(d) = due {
|
if let Some(d) = due {
|
||||||
task.due = Some(d);
|
task.due = Some(d);
|
||||||
}
|
}
|
||||||
|
crate::log_msg(&format!(
|
||||||
|
"[task_app] TASK UPDATE: title=\"{}\" id={} has_notes={} has_due={}",
|
||||||
|
task.title, task.id, task.notes.is_some(), task.due.is_some()
|
||||||
|
));
|
||||||
self.db.update_task(task).ok();
|
self.db.update_task(task).ok();
|
||||||
self.db.push_sync(
|
self.db.push_sync(
|
||||||
SyncAction::Update,
|
SyncAction::Update,
|
||||||
@@ -678,6 +713,10 @@ impl App {
|
|||||||
created_at: None,
|
created_at: None,
|
||||||
updated_at: None,
|
updated_at: None,
|
||||||
};
|
};
|
||||||
|
crate::log_msg(&format!(
|
||||||
|
"[task_app] TASK CREATE: title=\"{}\" id={} list={}",
|
||||||
|
task.title, task.id, list_id
|
||||||
|
));
|
||||||
self.db.insert_task(&task).ok();
|
self.db.insert_task(&task).ok();
|
||||||
self.db.push_sync(
|
self.db.push_sync(
|
||||||
SyncAction::Create,
|
SyncAction::Create,
|
||||||
@@ -783,6 +822,10 @@ impl App {
|
|||||||
if !self.tasks.is_empty() {
|
if !self.tasks.is_empty() {
|
||||||
let task = &mut self.tasks[self.selected_task];
|
let task = &mut self.tasks[self.selected_task];
|
||||||
task.due = Some(self.draft_date);
|
task.due = Some(self.draft_date);
|
||||||
|
crate::log_msg(&format!(
|
||||||
|
"[task_app] TASK UPDATE: title=\"{}\" id={} due={}",
|
||||||
|
task.title, task.id, self.draft_date
|
||||||
|
));
|
||||||
self.db.update_task(task).ok();
|
self.db.update_task(task).ok();
|
||||||
self.db.push_sync(
|
self.db.push_sync(
|
||||||
SyncAction::Update,
|
SyncAction::Update,
|
||||||
@@ -803,7 +846,7 @@ impl App {
|
|||||||
}
|
}
|
||||||
_ => {}
|
_ => {}
|
||||||
},
|
},
|
||||||
Popup::ConfirmDelete => match key.code {
|
Popup::ConfirmDelete { context: _ } => match key.code {
|
||||||
KeyCode::Esc => {
|
KeyCode::Esc => {
|
||||||
self.show_popup = None;
|
self.show_popup = None;
|
||||||
}
|
}
|
||||||
@@ -812,13 +855,18 @@ impl App {
|
|||||||
Focus::Tabs => {
|
Focus::Tabs => {
|
||||||
if self.selected_list < self.lists.len() {
|
if self.selected_list < self.lists.len() {
|
||||||
let list_id = self.lists[self.selected_list].id.clone();
|
let list_id = self.lists[self.selected_list].id.clone();
|
||||||
|
let title = self.lists[self.selected_list].title.clone();
|
||||||
self.db.delete_list(&list_id).ok();
|
self.db.delete_list(&list_id).ok();
|
||||||
self.db.push_sync(
|
self.db.push_sync(
|
||||||
SyncAction::DeleteList,
|
SyncAction::DeleteList,
|
||||||
&list_id,
|
&list_id,
|
||||||
&list_id,
|
&list_id,
|
||||||
"",
|
"",
|
||||||
).ok();
|
).ok();
|
||||||
|
crate::log_msg(&format!(
|
||||||
|
"[task_app] LIST DELETE: title=\"{}\" id={}",
|
||||||
|
title, list_id
|
||||||
|
));
|
||||||
self.trigger_sync();
|
self.trigger_sync();
|
||||||
self.load_lists();
|
self.load_lists();
|
||||||
if self.selected_list >= self.lists.len() {
|
if self.selected_list >= self.lists.len() {
|
||||||
@@ -832,6 +880,7 @@ impl App {
|
|||||||
let task = &self.tasks[self.selected_task];
|
let task = &self.tasks[self.selected_task];
|
||||||
let task_id = task.id.clone();
|
let task_id = task.id.clone();
|
||||||
let list_id = task.list_id.clone();
|
let list_id = task.list_id.clone();
|
||||||
|
let title = task.title.clone();
|
||||||
self.db.delete_task(&task_id).ok();
|
self.db.delete_task(&task_id).ok();
|
||||||
if !list_id.contains('-') {
|
if !list_id.contains('-') {
|
||||||
self.db.push_sync(
|
self.db.push_sync(
|
||||||
@@ -841,6 +890,10 @@ impl App {
|
|||||||
"",
|
"",
|
||||||
).ok();
|
).ok();
|
||||||
}
|
}
|
||||||
|
crate::log_msg(&format!(
|
||||||
|
"[task_app] TASK DELETE: title=\"{}\" id={} list={}",
|
||||||
|
title, task_id, list_id
|
||||||
|
));
|
||||||
self.trigger_sync();
|
self.trigger_sync();
|
||||||
self.load_tasks();
|
self.load_tasks();
|
||||||
if self.selected_task >= self.tasks.len() {
|
if self.selected_task >= self.tasks.len() {
|
||||||
@@ -923,6 +976,10 @@ impl App {
|
|||||||
&serde_json::to_string(task).unwrap_or_default(),
|
&serde_json::to_string(task).unwrap_or_default(),
|
||||||
).ok();
|
).ok();
|
||||||
}
|
}
|
||||||
|
crate::log_msg(&format!(
|
||||||
|
"[task_app] BULK COMPLETED: {} tasks",
|
||||||
|
indices.len()
|
||||||
|
));
|
||||||
self.clear_selection();
|
self.clear_selection();
|
||||||
self.trigger_sync();
|
self.trigger_sync();
|
||||||
self.load_tasks();
|
self.load_tasks();
|
||||||
@@ -943,6 +1000,10 @@ impl App {
|
|||||||
&serde_json::to_string(task).unwrap_or_default(),
|
&serde_json::to_string(task).unwrap_or_default(),
|
||||||
).ok();
|
).ok();
|
||||||
}
|
}
|
||||||
|
crate::log_msg(&format!(
|
||||||
|
"[task_app] BULK DUE: {} tasks -> today",
|
||||||
|
indices.len()
|
||||||
|
));
|
||||||
self.clear_selection();
|
self.clear_selection();
|
||||||
self.trigger_sync();
|
self.trigger_sync();
|
||||||
self.load_tasks();
|
self.load_tasks();
|
||||||
@@ -1021,6 +1082,10 @@ impl App {
|
|||||||
&serde_json::to_string(task).unwrap_or_default(),
|
&serde_json::to_string(task).unwrap_or_default(),
|
||||||
).ok();
|
).ok();
|
||||||
}
|
}
|
||||||
|
crate::log_msg(&format!(
|
||||||
|
"[task_app] BULK UNCOMPLETE: {} tasks",
|
||||||
|
indices.len()
|
||||||
|
));
|
||||||
self.clear_selection();
|
self.clear_selection();
|
||||||
self.trigger_sync();
|
self.trigger_sync();
|
||||||
self.load_tasks();
|
self.load_tasks();
|
||||||
@@ -1043,6 +1108,10 @@ impl App {
|
|||||||
&serde_json::to_string(task).unwrap_or_default(),
|
&serde_json::to_string(task).unwrap_or_default(),
|
||||||
).ok();
|
).ok();
|
||||||
}
|
}
|
||||||
|
crate::log_msg(&format!(
|
||||||
|
"[task_app] BULK DUE: {} tasks -> tomorrow",
|
||||||
|
indices.len()
|
||||||
|
));
|
||||||
self.clear_selection();
|
self.clear_selection();
|
||||||
self.trigger_sync();
|
self.trigger_sync();
|
||||||
self.load_tasks();
|
self.load_tasks();
|
||||||
@@ -1065,6 +1134,10 @@ impl App {
|
|||||||
&serde_json::to_string(task).unwrap_or_default(),
|
&serde_json::to_string(task).unwrap_or_default(),
|
||||||
).ok();
|
).ok();
|
||||||
}
|
}
|
||||||
|
crate::log_msg(&format!(
|
||||||
|
"[task_app] BULK DUE: {} tasks -> next week",
|
||||||
|
indices.len()
|
||||||
|
));
|
||||||
self.clear_selection();
|
self.clear_selection();
|
||||||
self.trigger_sync();
|
self.trigger_sync();
|
||||||
self.load_tasks();
|
self.load_tasks();
|
||||||
@@ -1163,6 +1236,10 @@ impl App {
|
|||||||
let new_pos = self.tasks[new_index as usize].position;
|
let new_pos = self.tasks[new_index as usize].position;
|
||||||
|
|
||||||
if self.db.reorder_task(&task_id, new_pos).is_ok() {
|
if self.db.reorder_task(&task_id, new_pos).is_ok() {
|
||||||
|
crate::log_msg(&format!(
|
||||||
|
"[task_app] TASK REORDER: id={} list={} new_pos={}",
|
||||||
|
task_id, list_id, new_pos
|
||||||
|
));
|
||||||
let payload = serde_json::json!({
|
let payload = serde_json::json!({
|
||||||
"task_id": task_id,
|
"task_id": task_id,
|
||||||
"new_position": new_pos
|
"new_position": new_pos
|
||||||
|
|||||||
+24
@@ -238,11 +238,21 @@ async fn run_initial_sync(
|
|||||||
Ok(lists) => {
|
Ok(lists) => {
|
||||||
total_lists = lists.len();
|
total_lists = lists.len();
|
||||||
for list in &lists {
|
for list in &lists {
|
||||||
|
log_msg(&format!(
|
||||||
|
"[task_app] LIST SYNC: title=\"{}\" id={}",
|
||||||
|
list.title, list.id
|
||||||
|
));
|
||||||
db.insert_list(list).ok();
|
db.insert_list(list).ok();
|
||||||
}
|
}
|
||||||
for list in &lists {
|
for list in &lists {
|
||||||
if let Ok(tasks) = api.fetch_tasks(&list.id).await {
|
if let Ok(tasks) = api.fetch_tasks(&list.id).await {
|
||||||
total_tasks += tasks.len();
|
total_tasks += tasks.len();
|
||||||
|
log_msg(&format!(
|
||||||
|
"[task_app] TASK SYNC: {} tasks in list=\"{}\" id={}",
|
||||||
|
tasks.len(),
|
||||||
|
list.title,
|
||||||
|
list.id
|
||||||
|
));
|
||||||
db.replace_all_tasks(&list.id, &tasks).ok();
|
db.replace_all_tasks(&list.id, &tasks).ok();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -482,6 +492,10 @@ async fn pull_sync(
|
|||||||
Ok(lists) => {
|
Ok(lists) => {
|
||||||
total_lists = lists.len();
|
total_lists = lists.len();
|
||||||
for list in &lists {
|
for list in &lists {
|
||||||
|
log_msg(&format!(
|
||||||
|
"[task_app] LIST SYNC: title=\"{}\" id={}",
|
||||||
|
list.title, list.id
|
||||||
|
));
|
||||||
db.insert_list(list).ok();
|
db.insert_list(list).ok();
|
||||||
}
|
}
|
||||||
for list in &lists {
|
for list in &lists {
|
||||||
@@ -493,10 +507,20 @@ async fn pull_sync(
|
|||||||
if let Ok(tasks) = result {
|
if let Ok(tasks) = result {
|
||||||
total_tasks += tasks.len();
|
total_tasks += tasks.len();
|
||||||
if use_incremental {
|
if use_incremental {
|
||||||
|
log_msg(&format!(
|
||||||
|
"[task_app] TASK SYNC (incremental): {} tasks in list=\"{}\"",
|
||||||
|
tasks.len(),
|
||||||
|
list.title
|
||||||
|
));
|
||||||
for task in &tasks {
|
for task in &tasks {
|
||||||
db.insert_task(task).ok();
|
db.insert_task(task).ok();
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
log_msg(&format!(
|
||||||
|
"[task_app] TASK SYNC (full): {} tasks in list=\"{}\"",
|
||||||
|
tasks.len(),
|
||||||
|
list.title
|
||||||
|
));
|
||||||
db.replace_all_tasks(&list.id, &tasks).ok();
|
db.replace_all_tasks(&list.id, &tasks).ok();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -477,8 +477,8 @@ pub fn render_date_picker(
|
|||||||
frame.render_widget(paragraph, popup_area);
|
frame.render_widget(paragraph, popup_area);
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn render_confirm_popup(frame: &mut Frame, area: Rect) {
|
pub fn render_confirm_popup(frame: &mut Frame, area: Rect, context: &str) {
|
||||||
let popup_area = centered_rect(50, 5, area);
|
let popup_area = centered_rect(60, 6, area);
|
||||||
frame.render_widget(Clear, popup_area);
|
frame.render_widget(Clear, popup_area);
|
||||||
let block = Block::default()
|
let block = Block::default()
|
||||||
.borders(Borders::ALL)
|
.borders(Borders::ALL)
|
||||||
@@ -490,7 +490,7 @@ pub fn render_confirm_popup(frame: &mut Frame, area: Rect) {
|
|||||||
let text = Text::from(vec![
|
let text = Text::from(vec![
|
||||||
Line::from(""),
|
Line::from(""),
|
||||||
Line::from(Span::styled(
|
Line::from(Span::styled(
|
||||||
" Delete this item? ",
|
format!(" {} ", context),
|
||||||
Style::default().fg(Color::Red).add_modifier(Modifier::BOLD),
|
Style::default().fg(Color::Red).add_modifier(Modifier::BOLD),
|
||||||
)),
|
)),
|
||||||
Line::from(""),
|
Line::from(""),
|
||||||
|
|||||||
+2
-2
@@ -22,7 +22,7 @@ pub enum Popup {
|
|||||||
Input,
|
Input,
|
||||||
EditTask { field: usize },
|
EditTask { field: usize },
|
||||||
DatePicker,
|
DatePicker,
|
||||||
ConfirmDelete,
|
ConfirmDelete { context: String },
|
||||||
BulkAction,
|
BulkAction,
|
||||||
PickList,
|
PickList,
|
||||||
DeviceAuth { url: String, code: String },
|
DeviceAuth { url: String, code: String },
|
||||||
@@ -129,7 +129,7 @@ pub fn draw(frame: &mut Frame, view: AppView) {
|
|||||||
view.notes_scroll, *field,
|
view.notes_scroll, *field,
|
||||||
),
|
),
|
||||||
Popup::DatePicker => render_date_picker(frame, area, view.draft_date),
|
Popup::DatePicker => render_date_picker(frame, area, view.draft_date),
|
||||||
Popup::ConfirmDelete => render_confirm_popup(frame, area),
|
Popup::ConfirmDelete { context } => render_confirm_popup(frame, area, context),
|
||||||
Popup::BulkAction => render_bulk_action_popup(frame, area, view.selected_tasks.len(), view.bulk_action_selected),
|
Popup::BulkAction => render_bulk_action_popup(frame, area, view.selected_tasks.len(), view.bulk_action_selected),
|
||||||
Popup::PickList => render_pick_list_popup(frame, area, view.popup_list_indices, view.popup_list_selected),
|
Popup::PickList => render_pick_list_popup(frame, area, view.popup_list_indices, view.popup_list_selected),
|
||||||
Popup::DeviceAuth { url, code } => render_device_auth_popup(frame, area, url, code, view.auth_error),
|
Popup::DeviceAuth { url, code } => render_device_auth_popup(frame, area, url, code, view.auth_error),
|
||||||
|
|||||||
Reference in New Issue
Block a user