b02c40f716
Add relative date formatting (today, tomorrow, in 3d, etc.) for list and detail views. Add structured feedback helpers for add/complete/delete operations showing display IDs and parsed modifiers. Change Complete() to return spawned recurring instance so callers can display recurrence info. Add AppendTask to working set for immediate display ID assignment. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
78 lines
1.5 KiB
Go
78 lines
1.5 KiB
Go
package cmd
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
|
|
"git.jnss.me/joakim/opal/internal/engine"
|
|
"github.com/spf13/cobra"
|
|
)
|
|
|
|
var deleteCmd = &cobra.Command{
|
|
Use: "delete [filter...]",
|
|
Short: "Delete tasks",
|
|
Run: func(cmd *cobra.Command, args []string) {
|
|
parsed := getParsedArgs(cmd)
|
|
if err := deleteTasks(parsed.Filters); err != nil {
|
|
fmt.Fprintf(os.Stderr, "Error: %v\n", err)
|
|
os.Exit(1)
|
|
}
|
|
},
|
|
}
|
|
|
|
func deleteTasks(args []string) error {
|
|
filter, err := engine.ParseFilter(args)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
// Load working set to resolve display IDs (matches done/modify pattern)
|
|
ws, err := engine.LoadWorkingSet()
|
|
if err != nil {
|
|
return fmt.Errorf("failed to load working set: %w", err)
|
|
}
|
|
|
|
var tasks []*engine.Task
|
|
|
|
if len(filter.IDs) > 0 {
|
|
for _, id := range filter.IDs {
|
|
task, err := ws.GetTaskByDisplayID(id)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
tasks = append(tasks, task)
|
|
}
|
|
} else {
|
|
tasks, err = engine.GetTasks(filter)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
}
|
|
|
|
if len(tasks) == 0 {
|
|
return fmt.Errorf("no tasks matched filter")
|
|
}
|
|
|
|
if len(tasks) > 1 {
|
|
fmt.Print(engine.FormatTaskConfirmList("delete", tasks, ws))
|
|
fmt.Printf("Proceed? (y/N): ")
|
|
var confirm string
|
|
fmt.Scanln(&confirm)
|
|
if confirm != "y" && confirm != "Y" {
|
|
fmt.Println("Cancelled.")
|
|
return nil
|
|
}
|
|
}
|
|
|
|
for _, task := range tasks {
|
|
task.Delete(false) // Soft delete
|
|
}
|
|
|
|
if len(tasks) == 1 {
|
|
fmt.Printf("Deleted task %s\n", engine.FormatTaskSummary(tasks[0], ws))
|
|
} else {
|
|
fmt.Printf("Deleted %d task(s).\n", len(tasks))
|
|
}
|
|
return nil
|
|
}
|