Fix three critical UX issues in opal-task
Issue 1: Fix recurrence calculation for overdue tasks - Use completion date (End) as base for next instance, not original due date - If task due Monday completed Wednesday, next is Wednesday+7d not Monday+7d - Fallback to Due date if End is not set - Update test to verify new behavior Issue 2: Fix description parsing to work without quotes - Add parseAddArgs() to extract description from non-modifier words - Description = all words that don't start with +, -, or contain : - Enables: opal add buy groceries +shop carrots → 'buy groceries carrots' - Validate description is required (error if only modifiers) - Validate recurring tasks require due date Issue 3: Implement flexible command syntax - Add preprocessArgs() to parse arguments before Cobra routing - Detect command position and split filters (left) from modifiers (right) - Rewrite os.Args so Cobra routes correctly - Enable both 'opal 2 done' and 'opal done 2' syntax - Commands without modifiers accept filters on either side - Commands with modifiers enforce [filters] command [modifiers] - Add confirmation for modify without filters (modifies all tasks) All commands updated to use preprocessed ParsedArgs from context. All tests passing (33 tests).
This commit is contained in:
@@ -76,12 +76,19 @@ func SpawnNextInstance(completedInstance *Task) error {
|
||||
}
|
||||
|
||||
// Calculate next due date
|
||||
var nextDue *time.Time
|
||||
if completedInstance.Due != nil {
|
||||
next := CalculateNextDue(*completedInstance.Due, *template.RecurrenceDuration)
|
||||
nextDue = &next
|
||||
// Use End date (completion time) as base, fallback to Due date if End not set
|
||||
var baseDate time.Time
|
||||
if completedInstance.End != nil {
|
||||
baseDate = *completedInstance.End
|
||||
} else if completedInstance.Due != nil {
|
||||
baseDate = *completedInstance.Due
|
||||
} else {
|
||||
return fmt.Errorf("recurring instance has no due or end date")
|
||||
}
|
||||
|
||||
next := CalculateNextDue(baseDate, *template.RecurrenceDuration)
|
||||
nextDue := &next
|
||||
|
||||
// Check if we're past 'until' date
|
||||
if template.Until != nil && nextDue != nil && nextDue.After(*template.Until) {
|
||||
// Don't spawn, recurrence has expired
|
||||
|
||||
Reference in New Issue
Block a user