From 45d115f503bbb3d1967cb1ffb77fe2d6906c526d Mon Sep 17 00:00:00 2001 From: Alma Date: Sat, 12 Apr 2025 21:48:46 +0200 Subject: [PATCH] working leantime widget 103 --- components/flow.tsx | 168 ++++++++++---------------------------------- 1 file changed, 36 insertions(+), 132 deletions(-) diff --git a/components/flow.tsx b/components/flow.tsx index 26dc90de..699a75dd 100644 --- a/components/flow.tsx +++ b/components/flow.tsx @@ -10,19 +10,18 @@ interface Task { id: number; headline: string; description: string; - dateToFinish: string; date: string; - projectId: number; - projectName: string; - status: number; - editorId?: string; - editorFirstname?: string; - editorLastname?: string; + dateToFinish: string; + editorId: string; + editorFirstname: string; + editorLastname: string; authorFirstname: string; authorLastname: string; - milestoneHeadline?: string; - editTo?: string; - editFrom?: string; + milestoneHeadline: string; + status: number; + editTo: string; + editFrom: string; + projectName: string; } interface ProjectSummary { @@ -34,7 +33,7 @@ interface ProjectSummary { } interface TaskWithDate extends Task { - validDate?: Date; + validDate: Date; } export function Flow() { @@ -80,138 +79,43 @@ export function Flow() { } }; + const getEffectiveDate = (task: Task): Date => { + const dateToFinish = new Date(task.dateToFinish); + const createdDate = new Date(task.date); + + if (task.dateToFinish && task.dateToFinish !== "0000-00-00 00:00:00") { + return dateToFinish; + } + return createdDate; + }; + const fetchTasks = async () => { setLoading(true); try { - const response = await fetch('/api/leantime/tasks'); - if (!response.ok) { - throw new Error('Failed to fetch tasks'); - } + const response = await fetch("/api/leantime/tasks"); const data = await response.json(); - - if (!data.tasks || !Array.isArray(data.tasks)) { - console.warn('No tasks found in response', data as unknown); + + if (!Array.isArray(data)) { + console.warn("No tasks found in response", data as unknown); setTasks([]); return; } - // Debug log to see all tasks and their dates - data.tasks.forEach((task: Task) => { - console.log(`Task ${task.id} - ${task.headline} - Full data:`, { - id: task.id, - headline: task.headline, - dateToFinish: task.dateToFinish, - editTo: task.editTo, - editFrom: task.editFrom, - date: task.date, - status: task.status, - type: typeof task.dateToFinish - }); - }); + const tasksWithDates: TaskWithDate[] = data.map((task: Task) => ({ + ...task, + validDate: getEffectiveDate(task) + })); - const getValidDate = (task: Task): Date | undefined => { - const tryParseDate = (dateStr: string | undefined, fieldName: string): Date | undefined => { - if (!dateStr) { - console.log(`${fieldName} for task ${task.id} is empty`); - return undefined; - } - - if (dateStr === '0000-00-00 00:00:00') { - console.log(`${fieldName} for task ${task.id} is zero date`); - return undefined; - } + const filteredTasks = tasksWithDates + .filter(task => task.status !== 3) + .sort((a, b) => a.validDate.getTime() - b.validDate.getTime()) + .slice(0, 6); - try { - const date = new Date(dateStr); - if (isNaN(date.getTime())) { - console.log(`${fieldName} for task ${task.id} parsed to invalid date:`, dateStr); - return undefined; - } - - console.log(`Successfully parsed ${fieldName} for task ${task.id}:`, { - input: dateStr, - output: date.toISOString(), - timestamp: date.getTime() - }); - return date; - } catch (error) { - console.error(`Error parsing ${fieldName} for task ${task.id}:`, error); - return undefined; - } - }; - - // Try each date field in order of priority - const dateToFinish = tryParseDate(task.dateToFinish, 'dateToFinish'); - if (dateToFinish) { - console.log(`Using dateToFinish for task ${task.id}:`, dateToFinish.toISOString()); - return dateToFinish; - } - - const editTo = tryParseDate(task.editTo, 'editTo'); - if (editTo) { - console.log(`Using editTo for task ${task.id}:`, editTo.toISOString()); - return editTo; - } - - const editFrom = tryParseDate(task.editFrom, 'editFrom'); - if (editFrom) { - console.log(`Using editFrom for task ${task.id}:`, editFrom.toISOString()); - return editFrom; - } - - const date = tryParseDate(task.date, 'date'); - if (date) { - console.log(`Using date for task ${task.id}:`, date.toISOString()); - return date; - } - - console.log(`No valid date found for task ${task.id} - Raw values:`, { - dateToFinish: task.dateToFinish, - editTo: task.editTo, - editFrom: task.editFrom, - date: task.date - }); - return undefined; - }; - - // Process and sort tasks - const processedTasks = data.tasks.map((task: Task): TaskWithDate => { - const validDate = getValidDate(task); - console.log(`Final date for task ${task.id}:`, { - headline: task.headline, - validDate: validDate?.toISOString() || 'NO DATE', - rawDateToFinish: task.dateToFinish - }); - return { ...task, validDate }; - }); - - // Sort tasks - const sortedTasks = processedTasks.sort((a: TaskWithDate, b: TaskWithDate) => { - if (a.validDate && b.validDate) { - return a.validDate.getTime() - b.validDate.getTime(); - } - if (!a.validDate && !b.validDate) { - return b.id - a.id; - } - return a.validDate ? -1 : 1; - }); - - console.log('Final sorted tasks:', sortedTasks.map((t: TaskWithDate) => ({ - id: t.id, - headline: t.headline, - validDate: t.validDate?.toISOString(), - rawDates: { - dateToFinish: t.dateToFinish, - editTo: t.editTo, - editFrom: t.editFrom, - date: t.date - } - }))); - - setTasks(sortedTasks); + console.log("Filtered and sorted tasks:", filteredTasks); + setTasks(filteredTasks); } catch (error) { - console.error('Error fetching tasks:', error); - setError('Failed to fetch tasks'); + console.error("Error fetching tasks:", error); + setError("Failed to fetch tasks"); } finally { setLoading(false); }