fix: Preserve time information in instant task conversion

- Add dueTime and scheduledTime fields to TasksPlugin ParsedTaskData interface
- Update NLP to TasksPlugin format conversion to map time fields
- Enhance task creation to combine dates with times using combineDateAndTime()
- Handle time information in both default-enabled and minimal behavior modes
- Fixes issue where time components were lost during format conversion

Resolves failing unit tests for time-based task conversion scenarios.
This commit is contained in:
Callum Alpass 2025-07-29 17:38:22 +10:00
parent 93d677d4b4
commit 88ad19da07
2 changed files with 13 additions and 5 deletions

View file

@ -3,7 +3,7 @@ import TaskNotesPlugin from '../main';
import { TasksPluginParser, ParsedTaskData } from '../utils/TasksPluginParser';
import { NaturalLanguageParser } from './NaturalLanguageParser';
import { TaskCreationData } from '../types';
import { getCurrentTimestamp } from '../utils/dateUtils';
import { getCurrentTimestamp, combineDateAndTime } from '../utils/dateUtils';
import { calculateDefaultDate } from '../utils/helpers';
import { StatusManager } from './StatusManager';
import { PriorityManager } from './PriorityManager';
@ -369,6 +369,10 @@ export class InstantTaskConvertService {
const parsedDueDate = this.sanitizeDate(parsedData.dueDate);
const parsedScheduledDate = this.sanitizeDate(parsedData.scheduledDate);
// Extract time information
const parsedDueTime = parsedData.dueTime?.trim() || undefined;
const parsedScheduledTime = parsedData.scheduledTime?.trim() || undefined;
// Apply task creation defaults if setting is enabled
let priority: string | undefined;
let status: string | undefined;
@ -393,14 +397,14 @@ export class InstantTaskConvertService {
// Apply due date: parsed date takes priority, then defaults
if (parsedDueDate) {
dueDate = parsedDueDate;
dueDate = parsedDueTime ? combineDateAndTime(parsedDueDate, parsedDueTime) : parsedDueDate;
} else if (defaults.defaultDueDate !== 'none') {
dueDate = calculateDefaultDate(defaults.defaultDueDate);
}
// Apply scheduled date: parsed date takes priority, then defaults
if (parsedScheduledDate) {
scheduledDate = parsedScheduledDate;
scheduledDate = parsedScheduledTime ? combineDateAndTime(parsedScheduledDate, parsedScheduledTime) : parsedScheduledDate;
} else if (defaults.defaultScheduledDate !== 'none') {
scheduledDate = calculateDefaultDate(defaults.defaultScheduledDate);
}
@ -444,8 +448,8 @@ export class InstantTaskConvertService {
// Minimal behavior: only use parsed data, use "none" for unset values
priority = (parsedData.priority ? this.sanitizePriority(parsedData.priority) : '') || 'none';
status = (parsedData.status ? this.sanitizeStatus(parsedData.status) : '') || 'none';
dueDate = parsedDueDate || undefined;
scheduledDate = parsedScheduledDate || undefined;
dueDate = parsedDueDate ? (parsedDueTime ? combineDateAndTime(parsedDueDate, parsedDueTime) : parsedDueDate) : undefined;
scheduledDate = parsedScheduledDate ? (parsedScheduledTime ? combineDateAndTime(parsedScheduledDate, parsedScheduledTime) : parsedScheduledDate) : undefined;
// Apply contexts: only use parsed contexts
contextsArray = [];
if (parsedContexts.length > 0) {
@ -756,6 +760,8 @@ export class InstantTaskConvertService {
priority: nlpResult.priority,
dueDate: nlpResult.dueDate,
scheduledDate: nlpResult.scheduledDate,
dueTime: nlpResult.dueTime,
scheduledTime: nlpResult.scheduledTime,
recurrence: nlpResult.recurrence,
tags: nlpResult.tags && nlpResult.tags.length > 0 ? nlpResult.tags : undefined,
projects: nlpResult.projects && nlpResult.projects.length > 0 ? nlpResult.projects : undefined,

View file

@ -6,6 +6,8 @@ export interface ParsedTaskData {
priority?: string;
dueDate?: string;
scheduledDate?: string;
dueTime?: string;
scheduledTime?: string;
startDate?: string;
createdDate?: string;
doneDate?: string;