Skip to content

Commit

Permalink
Merge pull request #514 from kdheepak/prompt-on-undo
Browse files Browse the repository at this point in the history
prompt on undo
  • Loading branch information
kdheepak committed Aug 25, 2023
2 parents 4998944 + a5ff270 commit c9b76a2
Show file tree
Hide file tree
Showing 6 changed files with 97 additions and 23 deletions.
41 changes: 26 additions & 15 deletions docs/configuration/advanced.md
Original file line number Diff line number Diff line change
@@ -1,13 +1,15 @@
# Advanced configuration

`taskwarrior-tui` parses the output of `task show` to get configuration data.
This allows `taskwarrior-tui` to use the same defaults as `taskwarrior` and configure additional options as required.
`taskwarrior-tui` parses the output of `task show` to get configuration data. This allows
`taskwarrior-tui` to use the same defaults as `taskwarrior` and configure additional options as
required.

## `taskrc` config file options:

Other `taskwarrior-tui` configuration options are possible using the user defined attribute feature of `taskwarrior`.
All `taskwarrior-tui` specific configuration options will begin with `uda.taskwarrior-tui.`.
The following is a full list of all the options available and their default values implemented by `taskwarrior-tui` if not defined in your `taskrc` file.
Other `taskwarrior-tui` configuration options are possible using the user defined attribute feature
of `taskwarrior`. All `taskwarrior-tui` specific configuration options will begin with
`uda.taskwarrior-tui.`. The following is a full list of all the options available and their default
values implemented by `taskwarrior-tui` if not defined in your `taskrc` file.

```plaintext
uda.taskwarrior-tui.selection.indicator=•
Expand All @@ -24,6 +26,7 @@ uda.taskwarrior-tui.calendar.months-per-row=4
uda.taskwarrior-tui.task-report.show-info=true
uda.taskwarrior-tui.task-report.looping=true
uda.taskwarrior-tui.task-report.jump-on-task-add=true
uda.taskwarrior-tui.task-report.prompt-on-undo=false
uda.taskwarrior-tui.task-report.prompt-on-delete=false
uda.taskwarrior-tui.task-report.prompt-on-done=false
uda.taskwarrior-tui.style.report.selection=
Expand All @@ -42,16 +45,19 @@ uda.taskwarrior-tui.context-menu.select-on-move=false
uda.taskwarrior-tui.tabs.change-focus-rotate=false
```

The `uda.taskwarrior-tui.task-report.next.filter` variable defines the default view at program startup. Set this to any preconfigured report (`task reports`), or create your own report in taskwarrior and specify its name here.
The `uda.taskwarrior-tui.task-report.next.filter` variable defines the default view at program
startup. Set this to any preconfigured report (`task reports`), or create your own report in
taskwarrior and specify its name here.

## commandline options:

`-r`: specify a report to be shown, overrides `uda.taskwarrior-tui.task-report.next.filter` for this instance
`-r`: specify a report to be shown, overrides `uda.taskwarrior-tui.task-report.next.filter` for this
instance

## Configure user defined shortcuts:

You can configure shortcuts to execute custom commands from your `taskwarrior`'s `taskrc` file (default: `~/.taskrc`).
You can do this by mapping a shortcut to an executable file:
You can configure shortcuts to execute custom commands from your `taskwarrior`'s `taskrc` file
(default: `~/.taskrc`). You can do this by mapping a shortcut to an executable file:

```plaintext
uda.taskwarrior-tui.shortcuts.1=~/.config/taskwarrior-tui/shortcut-scripts/add-personal-tag.sh
Expand All @@ -68,21 +74,22 @@ To make a file executable:

By default, keys `1`-`9` are available to run shortcuts.

When you hit the shortcut, the script will be executed with the `selected_tasks_uuid` as an argument:
When you hit the shortcut, the script will be executed with the `selected_tasks_uuid` as an
argument:

```bash
~/.config/taskwarrior-tui/shortcut-scripts/add-personal-tag.sh $selected_tasks_uuid
```

For example, you can add the `personal` tag to the currently selected task with the following script in `~/.config/taskwarrior-tui/shortcut-scripts/add-personal-tag.sh` :
For example, you can add the `personal` tag to the currently selected task with the following script
in `~/.config/taskwarrior-tui/shortcut-scripts/add-personal-tag.sh` :

```plaintext
task rc.bulk=0 rc.confirmation=off rc.dependency.confirmation=off rc.recurrence.confirmation=off "$@" modify +personal
```

By default, shortcuts are linked to the `1-9` number row keys.
They can be customized as any other keys through `uda.taskwarrior-tui.keyconfig.shortcut1=<key>`.
For example:
By default, shortcuts are linked to the `1-9` number row keys. They can be customized as any other
keys through `uda.taskwarrior-tui.keyconfig.shortcut1=<key>`. For example:

```plaintext
uda.taskwarrior-tui.keyconfig.shortcut1=n
Expand All @@ -99,4 +106,8 @@ uda.taskwarrior-tui.background_process=task sync
uda.taskwarrior-tui.background_process_period=60
```

This will run `task sync` every 60 seconds. If the `background_process` is an empty string (default), then no process will be run. Only if the `background_process` is defined and if the `background_process` runs successfully, it'll be run every `background_process_period` number of seconds (default: 60 seconds). However, if it fails even once it won't be run again till `taskwarrior-tui` is restarted.
This will run `task sync` every 60 seconds. If the `background_process` is an empty string
(default), then no process will be run. Only if the `background_process` is defined and if the
`background_process` runs successfully, it'll be run every `background_process_period` number of
seconds (default: 60 seconds). However, if it fails even once it won't be run again till
`taskwarrior-tui` is restarted.
2 changes: 1 addition & 1 deletion docs/taskwarrior-tui.1
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
.\" Automatically generated by Pandoc 2.19.2
.\" Automatically generated by Pandoc 3.1.6
.\"
.\" Define V font for inline verbatim, using C font in formats
.\" that render this, and otherwise B font.
Expand Down
2 changes: 2 additions & 0 deletions rust-toolchain.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
[toolchain]
channel = "stable"
1 change: 1 addition & 0 deletions src/action.rs
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ pub enum Action {
ContextMenu,
Jump,
DeletePrompt,
UndoPrompt,
DonePrompt,
Error,
}
64 changes: 57 additions & 7 deletions src/app.rs
Original file line number Diff line number Diff line change
Expand Up @@ -867,6 +867,26 @@ impl TaskwarriorTui {
self.error.clone(),
);
}
Action::UndoPrompt => {
let label = "Run `task undo`?";
let k = match self.keyconfig.undo {
KeyCode::Char(c) => c.to_string(),
_ => "Enter".to_string(),
};
let q = match self.keyconfig.quit {
KeyCode::Char(c) => c.to_string(),
_ => "Esc".to_string(),
};
self.draw_command(
f,
rects[1],
&format!("Press <{}> to confirm or <{}> to abort.", k, q),
(Span::styled(label, Style::default().add_modifier(Modifier::BOLD)), None),
0,
false,
self.error.clone(),
);
}
}
}

Expand Down Expand Up @@ -2583,11 +2603,18 @@ impl TaskwarriorTui {
}
}
} else if input == self.keyconfig.undo {
match self.task_undo() {
Ok(_) => self.update(true).await?,
Err(e) => {
self.error = Some(e);
self.mode = Mode::Tasks(Action::Error);
if self.config.uda_task_report_prompt_on_undo {
self.mode = Mode::Tasks(Action::UndoPrompt);
if self.task_current().is_none() {
self.mode = Mode::Tasks(Action::Report);
}
} else {
match self.task_undo() {
Ok(_) => self.update(true).await?,
Err(e) => {
self.error = Some(e);
self.mode = Mode::Tasks(Action::Error);
}
}
}
} else if input == self.keyconfig.modify {
Expand Down Expand Up @@ -3463,6 +3490,29 @@ impl TaskwarriorTui {
handle_movement(&mut self.command, input, &mut self.changes);
}
}
Action::UndoPrompt => {
if input == self.keyconfig.undo || input == KeyCode::Char('\n') {
if self.error.is_some() {
self.previous_mode = Some(self.mode.clone());
self.mode = Mode::Tasks(Action::Error);
} else {
match self.task_undo() {
Ok(_) => {
self.mode = Mode::Tasks(Action::Report);
self.update(true).await?;
}
Err(e) => {
self.error = Some(e);
self.mode = Mode::Tasks(Action::Error);
}
}
}
} else if input == self.keyconfig.quit || input == KeyCode::Esc {
self.mode = Mode::Tasks(Action::Report);
} else {
handle_movement(&mut self.command, input, &mut self.changes);
}
}
Action::Error => {
// since filter live updates, don't reset error status
// for other actions, resetting error to None is required otherwise user cannot
Expand All @@ -3489,7 +3539,7 @@ impl TaskwarriorTui {
};

if let Mode::Tasks(Action::Modify | Action::Filter | Action::Annotate | Action::Add | Action::Log) = self.mode {
for s in vec![
for s in [
"project:".to_string(),
"priority:".to_string(),
"due:".to_string(),
Expand All @@ -3502,7 +3552,7 @@ impl TaskwarriorTui {
}

if let Mode::Tasks(Action::Modify | Action::Filter | Action::Annotate | Action::Add | Action::Log) = self.mode {
for s in vec![
for s in [
".before:",
".under:",
".below:",
Expand Down
10 changes: 10 additions & 0 deletions src/config.rs
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,7 @@ pub struct Config {
pub uda_background_process: String,
pub uda_background_process_period: usize,
pub uda_quick_tag_name: String,
pub uda_task_report_prompt_on_undo: bool,
pub uda_task_report_prompt_on_delete: bool,
pub uda_task_report_prompt_on_done: bool,
pub uda_task_report_date_time_vague_more_precise: bool,
Expand Down Expand Up @@ -169,6 +170,7 @@ impl Config {
uda_style_report_completion_pane.unwrap_or_else(|| Style::default().fg(Color::Black).bg(Color::Rgb(223, 223, 223)));
let uda_style_report_completion_pane_highlight = uda_style_report_completion_pane_highlight.unwrap_or(uda_style_report_completion_pane);
let uda_quick_tag_name = Self::get_uda_quick_tag_name(data);
let uda_task_report_prompt_on_undo = Self::get_uda_task_report_prompt_on_undo(data);
let uda_task_report_prompt_on_delete = Self::get_uda_task_report_prompt_on_delete(data);
let uda_task_report_prompt_on_done = Self::get_uda_task_report_prompt_on_done(data);
let uda_context_menu_select_on_move = Self::get_uda_context_menu_select_on_move(data);
Expand Down Expand Up @@ -222,6 +224,7 @@ impl Config {
uda_background_process,
uda_background_process_period,
uda_quick_tag_name,
uda_task_report_prompt_on_undo,
uda_task_report_prompt_on_delete,
uda_task_report_prompt_on_done,
uda_task_report_date_time_vague_more_precise,
Expand Down Expand Up @@ -597,6 +600,13 @@ impl Config {
.unwrap_or(false)
}

fn get_uda_task_report_prompt_on_undo(data: &str) -> bool {
Self::get_config("uda.taskwarrior-tui.task-report.prompt-on-undo", data)
.unwrap_or_default()
.get_bool()
.unwrap_or(false)
}

fn get_uda_task_report_prompt_on_delete(data: &str) -> bool {
Self::get_config("uda.taskwarrior-tui.task-report.prompt-on-delete", data)
.unwrap_or_default()
Expand Down

0 comments on commit c9b76a2

Please sign in to comment.